| | |
| | | private let voiceCacheDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!.appendingPathComponent("voices") |
| | | private static var _sharedInstance: VoicePlayer? |
| | | private var player:AVAudioPlayer? |
| | | private var tempPlayer:AVAudioPlayer? |
| | | |
| | | var delegate:VoicePlayerDelegate? |
| | | |
| | |
| | | guard let u = url else {return} |
| | | if player?.isPlaying ?? false{ |
| | | player?.stop() |
| | | self.playComplete?() //先通知完成播放 |
| | | } |
| | | |
| | | //文件存在:直接播放缓存路径的语音 |
| | | let fileURL = voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent).droppedScheme() |
| | | let fileURL = self.voiceCacheDirectory.appendingPathComponent(URL(fileURLWithPath: u).lastPathComponent).droppedScheme() |
| | | if FileManager.default.fileExists(atPath: fileURL!.absoluteString){ |
| | | player = try? AVAudioPlayer(contentsOf: fileURL!) |
| | | player?.delegate = self |
| | | player?.play() |
| | | delegate?.playing() |
| | | self.player = try? AVAudioPlayer(contentsOf: fileURL!) |
| | | self.player?.delegate = self |
| | | self.player?.play() |
| | | self.delegate?.playing() |
| | | }else{ |
| | | //文件不存在:执行下载 |
| | | let downloadTask = URLSession.shared.downloadTask(with: URL(string: u)!) { tempLocalUrl, response, error in |
| | |
| | | playComplete?() |
| | | } |
| | | |
| | | //打断播放未完全播放 |
| | | func playerInterrupt(){ |
| | | player?.stop() |
| | | } |
| | | |
| | | func playEnd(course:@escaping ()->Void){ |
| | | self.playComplete = course |
| | | } |
| | | |
| | | func playSuccessVoice(){ |
| | | let list = try? FileManager.default.contentsOfDirectory(atPath: voiceCacheDirectory.droppedScheme()!.absoluteString) |
| | | var promoteName:String? |
| | | for v in list ?? []{ |
| | | if v.contains("SuccessPromote"){promoteName = v;break} |
| | | } |
| | | guard let url = promoteName else { return } |
| | | let promote = self.voiceCacheDirectory.appendingPathComponent(url) |
| | | tempPlayer = try? AVAudioPlayer(contentsOf: promote) |
| | | tempPlayer?.play() |
| | | } |
| | | |
| | | func playFailVoice(){ |
| | | let list = try? FileManager.default.contentsOfDirectory(atPath: voiceCacheDirectory.droppedScheme()!.absoluteString) |
| | | var promoteName:String? |
| | | for v in list ?? []{ |
| | | if v.contains("FailPromote"){promoteName = v;break} |
| | | } |
| | | guard let url = promoteName else { return } |
| | | let promote = self.voiceCacheDirectory.appendingPathComponent(url) |
| | | tempPlayer = try? AVAudioPlayer(contentsOf: promote) |
| | | tempPlayer?.play() |
| | | } |
| | | |
| | | func donwloadPromoteVoice(successVoice:String,failVoice:String,updateTime:String){ |
| | | print("-->\(VoicePlayer.share().voiceCacheDirectory)") |
| | | let group = DispatchGroup() |
| | | let promoteQueue = DispatchQueue(label: "promoteVoice") |
| | | promoteQueue.async(group: group){ |
| | | //文件不存在:执行下载 |
| | | let downloadTask = URLSession.shared.downloadTask(with: URL(string: successVoice)!) { tempLocalUrl, response, error in |
| | | if let tempLocalUrl = tempLocalUrl, error == nil { |
| | | do { |
| | | let fileType = URL(fileURLWithPath: successVoice).lastPathComponent.components(separatedBy: ".").last ?? "mp3" |
| | | let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent("SuccessPromote.\(fileType)") |
| | | if FileManager.default.fileExists(atPath: finalCacheUrl.droppedScheme()!.absoluteString){ |
| | | try? FileManager.default.removeItem(at: finalCacheUrl) |
| | | } |
| | | try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl) |
| | | } catch { |
| | | print("视频缓存失败:catch") |
| | | } |
| | | } else { |
| | | print("视频缓存失败:\(error?.localizedDescription ?? "")") |
| | | } |
| | | } |
| | | downloadTask.resume() |
| | | } |
| | | |
| | | promoteQueue.async(group: group){ |
| | | //文件不存在:执行下载 |
| | | let downloadTask = URLSession.shared.downloadTask(with: URL(string: failVoice)!) { tempLocalUrl, response, error in |
| | | if let tempLocalUrl = tempLocalUrl, error == nil { |
| | | do { |
| | | let fileType = URL(fileURLWithPath: successVoice).lastPathComponent.components(separatedBy: ".").last ?? "mp3" |
| | | let finalCacheUrl = self.voiceCacheDirectory.appendingPathComponent("FailPromote.\(fileType)") |
| | | if FileManager.default.fileExists(atPath: finalCacheUrl.droppedScheme()!.absoluteString){ |
| | | try? FileManager.default.removeItem(at: finalCacheUrl) |
| | | } |
| | | try FileManager.default.moveItem(at: tempLocalUrl, to: finalCacheUrl) |
| | | } catch { |
| | | print("视频缓存失败:catch") |
| | | } |
| | | } else { |
| | | print("视频缓存失败:\(error?.localizedDescription ?? "")") |
| | | } |
| | | } |
| | | downloadTask.resume() |
| | | } |
| | | |
| | | group.notify(queue: .main){ |
| | | UserDefaults.standard.setValue(updateTime, forKey: "promptVoiceDate") |
| | | UserDefaults.standard.synchronize() |
| | | } |
| | | } |
| | | } |
| | | |
| | | extension VoicePlayer:AVAudioPlayerDelegate{ |