| | |
| | | @objc func showDetailAction(){ |
| | | if let id = meditationModel?.id{ |
| | | |
| | | Services.getMeditationDetail(id: id).subscribe(onNext: {[weak self]data in |
| | | guard let weakSelf = self else { return } |
| | | Services.getMeditationDetail(id: id).subscribe(onNext: { data in |
| | | if let m = data.data{ |
| | | let isVip = m.isVip == .yes |
| | | if m.chargeType == .free || (isVip && m.chargeType == .vipFree) || (m.chargeType == .payment && m.isBuy == .yes){ |
| | |
| | | |
| | | if btn.isSelected{ |
| | | self.audioPlayer.bgmPlayer?.pause() |
| | | // self.audioPlayer.masterPlayer?.pause() |
| | | self.stopRunloopAni() |
| | | PayMusicVC.updateStatus(.pause) |
| | | }else{ |
| | |
| | | } |
| | | |
| | | self.audioPlayer.bgmPlayer?.play() |
| | | // self.audioPlayer.masterPlayer?.play() |
| | | // self.audioPlayer.masterPlayer?.volume = Float(UserDefaultSettingViewModel.getSetting()?.masterVolume ?? 0.5) |
| | | self.startRunloopAni() |
| | | PayMusicVC.updateStatus(.playing) |
| | | } |
| | |
| | | CommonAlertView.show(title: "提示", content: "是否关闭当前播放音频?") {[weak self] state in |
| | | guard let weakSelf = self else { return } |
| | | if state{ |
| | | self?.audioPlayer.cleanMuse() |
| | | self?.view.removeFromSuperview() |
| | | self?.removeFromParent() |
| | | |
| | | if let id = self?.audioPlayer.meditationModel?.id{ |
| | | Services.watchMuse(id: id, timeLook: self?.audioPlayer.lisenMuseTime ?? 0).subscribe(onNext: { _ in |
| | |
| | | }).disposed(by: weakSelf.disposeBag) |
| | | } |
| | | |
| | | if UserDefaultSettingViewModel.getSetting()?.sceneMusicModel != nil{ |
| | | AudioPlayer.getSharedInstance().playSceneAt(UserDefaultSettingViewModel.getSetting()!.sceneMusicModel!.audioFile) |
| | | } |
| | | |
| | | DispatchQueue.main.asyncAfter(delay: 0.4) { |
| | | NotificationCenter.default.post(name: ReloadData_Noti, object: nil, userInfo: nil) |
| | | } |
| | | |
| | | DispatchQueue.main.async { |
| | | self?.audioPlayer.bgmPlayer = nil |
| | | MPNowPlayingInfoCenter.default().nowPlayingInfo = nil |
| | | } |
| | | |
| | | DispatchQueue.main.asyncAfter(delay: 3.0) { |
| | | if UserDefaultSettingViewModel.getSetting()?.sceneMusicModel != nil{ |
| | | AudioPlayer.getSharedInstance().playSceneAt(UserDefaultSettingViewModel.getSetting()!.sceneMusicModel!.audioFile) |
| | | } |
| | | } |
| | | |
| | | self?.audioPlayer.cleanMuse() |
| | | self?.view.removeFromSuperview() |
| | | self?.removeFromParent() |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | class AudioPlayer { |
| | | private(set) var bgmPlayer:AVPlayer? // 背景音 |
| | | private(set) var scenePlayer:AVPlayer? //场景音 |
| | | // private(set) var masterPlayer:AVPlayer? //大师音 |
| | | var bgmPlayer:AVPlayer? // 背景音 |
| | | var scenePlayer:AVPlayer? //场景音 |
| | | private(set) var playIndex:Int = 0 //播放的角标 |
| | | private var cacheDirectory:URL! |
| | | private let session = URLSession.shared |
| | |
| | | |
| | | //清除之前的 |
| | | self.urls.removeAll() |
| | | // self.masterPlayer?.pause() |
| | | self.bgmPlayer?.pause() |
| | | // self.masterPlayer = nil |
| | | self.bgmPlayer = nil |
| | | |
| | | self.delegate = delegate |
| | |
| | | alertError(msg: "数据获取失败");return |
| | | } |
| | | |
| | | let masterUrl = URL(string: model.tutorAudioUrl.jq_urlEncoded()) |
| | | |
| | | autoreleasepool{[unowned self] () in |
| | | for url in urls { |
| | | self.checkCacheAudio(from: url) {[unowned self] _, url in |
| | |
| | | } |
| | | } |
| | | self.bgmPlayer = AVPlayer(url: self.urls[firstPlayIndex]) |
| | | |
| | | // if masterUrl != nil{ |
| | | // self.masterPlayer = AVPlayer(url: masterUrl!) |
| | | // self.masterPlayer?.volume = Float(UserDefaultSettingViewModel.getSetting()?.masterVolume ?? 0.5) |
| | | // } |
| | | } |
| | | |
| | | self.bgmPlayer?.addPeriodicTimeObserver(forInterval: CMTimeMake(value: 1, timescale: 1), queue: DispatchQueue.main) { [weak self](time) in |
| | |
| | | weakSelf.delegate?.playState(.playing) |
| | | guard weakSelf.bgmPlayer != nil else {return} |
| | | weakSelf.lisenMuseTime += 1 |
| | | |
| | | if weakSelf.lisenMuseTime == 60{ |
| | | if let id = self?.meditationModel?.id{ |
| | | Services.watchMuse(id: id, timeLook: 60).subscribe(onNext: { _ in |
| | | weakSelf.lisenMuseTime = 0 |
| | | NotificationCenter.default.post(name: TreeTaskUpdate_Noti, object: nil) |
| | | NotificationCenter.default.post(name: UpdateUserProfile_Noti, object: nil) |
| | | }).disposed(by:weakSelf.disposeBag) |
| | | } |
| | | } |
| | | |
| | | //当前正在播放的时间 |
| | | let loadTime = CMTimeGetSeconds(time) |
| | | //视频总时间 |
| | |
| | | } |
| | | }).disposed(by: disposeBag) |
| | | |
| | | |
| | | |
| | | self.bgmPlayer?.currentItem?.rx.observe(AVPlayerItem.Status.self,"status").subscribe(onNext: { _ in |
| | | // print("---MasterStatus1: \(self.masterPlayer?.status.rawValue ?? 0)") |
| | | print("---bgmStatus1: \(self.bgmPlayer?.status.rawValue ?? 0)") |
| | | if self.bgmPlayer?.status == .readyToPlay{ |
| | | self.bgmPlayer?.play() |
| | | // self.masterPlayer?.play() |
| | | } |
| | | |
| | | }).disposed(by: disposeBag) |
| | | |
| | | // self.masterPlayer?.currentItem?.rx.observe(AVPlayerItem.Status.self,"status").subscribe(onNext: { _ in |
| | | // print("---MasterStatus: \(self.masterPlayer?.status.rawValue ?? 0)") |
| | | // print("---bgmStatus: \(self.bgmPlayer?.status.rawValue ?? 0)") |
| | | // if self.bgmPlayer?.status == .readyToPlay && self.masterPlayer?.status == .readyToPlay{ |
| | | // self.bgmPlayer?.play() |
| | | // self.masterPlayer?.play() |
| | | // } |
| | | // }).disposed(by: disposeBag) |
| | | |
| | | setLockScreen() |
| | | |
| | | do { |
| | | try AVAudioSession.sharedInstance().setActive(true) |
| | | print("Playback OK") |
| | | try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.allowBluetooth, .allowAirPlay]) |
| | | try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [.allowBluetooth, .allowAirPlay]) |
| | | print("Session is Active") |
| | | } catch { |
| | | print(error) |
| | |
| | | }else{ |
| | | scenePlayer?.replaceCurrentItem(with: AVPlayerItem(url: URL)) |
| | | } |
| | | |
| | | do { |
| | | try AVAudioSession.sharedInstance().setActive(false) |
| | | try AVAudioSession.sharedInstance().setCategory(.ambient, mode: .default, options: []) |
| | | } catch { |
| | | print(error) |
| | | } |
| | | |
| | | DispatchQueue.main.asyncAfter(delay: 0.5) { |
| | | self.scenePlayer?.play() |
| | | self.scenePlayer?.volume = Float(UserDefaultSettingViewModel.getSetting()?.volume ?? 0.5) |
| | | // self.scenePlayer?.allowsExternalPlayback = false |
| | | // self.scenePlayer?.usesExternalPlaybackWhileExternalScreenIsActive = false |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | func pauseScene(){ |
| | | scenePlayer?.pause() |
| | | if scenePlayer?.timeControlStatus == .playing{ |
| | | scenePlayer?.pause() |
| | | } |
| | | } |
| | | |
| | | func pauseBGM(){ |
| | | if bgmPlayer?.timeControlStatus == .playing{ |
| | | bgmPlayer?.pause() |
| | | } |
| | | } |
| | | |
| | | func playScene(){ |
| | | if UserDefaultSettingViewModel.getSetting()?.sceneMusicModel != nil{ |
| | |
| | | // 修改进度 |
| | | center.changePlaybackPositionCommand.addTarget {[unowned self] event in |
| | | |
| | | print("1:--->\(event)") |
| | | guard let event = event as? MPChangePlaybackPositionCommandEvent else { |
| | | return .commandFailed |
| | | } |
| | |
| | | |
| | | // 播放 |
| | | center.playCommand.addTarget {[weak self] event in |
| | | print("2:--->\(event)") |
| | | self?.bgmPlayer?.play() |
| | | // self?.masterPlayer?.play() |
| | | PayMusicVC.updateStatus(.playing) |
| | |
| | | |
| | | // 暂停 |
| | | center.pauseCommand.addTarget {[weak self] event in |
| | | print("3:--->\(event)") |
| | | self?.bgmPlayer?.pause() |
| | | // self?.masterPlayer?.pause() |
| | | PayMusicVC.updateStatus(.pause) |
| | | return .success |
| | | } |
| | | |
| | | // 下一首 |
| | | center.nextTrackCommand.addTarget { event in |
| | | return .success |
| | | } |
| | | |
| | | center.nextTrackCommand.isEnabled = false |
| | | center.previousTrackCommand.isEnabled = false |
| | | |
| | | // 上一首 |
| | | center.previousTrackCommand.addTarget { event in |
| | | return .success |
| | | } |
| | | } |
| | | |
| | | func setTimer(times:Int){ |
| | |
| | | weakSelf.times.accept(nil) |
| | | weakSelf.stopTimer() |
| | | weakSelf.bgmPlayer?.pause() |
| | | // weakSelf.masterPlayer?.pause() |
| | | weakSelf.scenePlayer?.pause() |
| | | MPNowPlayingInfoCenter.default().nowPlayingInfo = nil |
| | | AudioPlayer.destroy() |
| | |
| | | let downloadTask = session.downloadTask(with: url) { tempLocalUrl, response, error in |
| | | if let tempLocalUrl = tempLocalUrl, error == nil { |
| | | do { |
| | | let temp = videoCacheUrl.appendingPathExtension(url.pathExtension) |
| | | let temp = videoCacheUrl |
| | | try FileManager.default.moveItem(at: tempLocalUrl, to: temp) |
| | | } catch { |
| | | print("视频缓存失败:catch") |