如何在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

不是最优雅的方式..但应该工作