问题描述
我已经创建了 SongQueue 并向其中添加了一组歌曲。我创建的队列中的每首歌曲都一首接一首地播放,但我想在每首歌曲之间添加一定的间隙(myModel.delay)。
func play(){
songQueue = {
let sound1 = Bundle.main.url(forResource: self.myModel.song[0].sURL,withExtension:nil)!
let sound2 = Bundle.main.url(forResource: self.myModel.song[1].sURL,withExtension:nil)!
let sound3 = Bundle.main.url(forResource: self.myModel.song[2].sURL,withExtension:nil)!
let s1 = AVPlayerItem(url: sound1)
let s2 = AVPlayerItem(url: sound2)
let s3 = AVPlayerItem(url: sound3)
let queue = AVQueuePlayer(items: [s1,s2,s3])
return queue
}()
self.songQueue.play()
}
这是我用来播放歌曲的按钮
Button(action: myModel.play
){
Image(systemName: "pause.fill")
.resizable()
.padding(.all,30)
.clipShape(Circle())
}.onAppear(perform: {
myModel.play()
})
请帮我解决这个问题。
解决方法
非常古老的技术,但从 Objective-C 开始是有效的。
将 observer
添加到 EndPlay notification
。然后在收到通知时暂停播放几秒钟(延迟),然后使用 GCD 调度延迟播放播放器。
观察者:
NotificationCenter.default.addObserver(self,selector: #selector(playerEndedPlaying),name: Notification.Name("AVPlayerItemDidPlayToEndTimeNotification"),object: nil)
通知回调
@objc func playerEndedPlaying(_ notification: Notification) {
self.songQueue?.pause()
DispatchQueue.main.asyncAfter(deadline: .now() + DELAY_IN_SECONDS) {[weak self] in
self?.songQueue?.play()
}
}
,
实现它的一种非常简单的方法是使用您在歌曲之间播放的“暂停”歌曲。只需录制一段静音的声音片段和您想要的暂停时间。
像这样插入到表格中:
let pause = AVPlayerItem(url: pause)
let s1 = AVPlayerItem(url: sound1)
let s2 = AVPlayerItem(url: sound2)
let s3 = AVPlayerItem(url: sound3)
let queue = AVQueuePlayer(items: [s1,pause,s2,s3])
return queue
不是最优雅的方式..但应该工作