如何解决如何在SwiftUI上的AVQueuePlayer中获得每首歌曲之间的延迟?
我已经创建了 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
不是最优雅的方式..但应该工作
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。