如何在 SwiftUI 上的 AVQueuePlayer 中获得每首歌曲之间的延迟?

问题描述 投票:0回答:2

我创建了 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()
                            })

请帮我解决这个问题

ios swift swiftui avplayer avaudioplayer
2个回答
1
投票

非常古老的技术,但在 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()
    }
}

0
投票

实现它的一种非常简单的方法是使用您在歌曲之间播放的“暂停”歌曲。只需录制带有静音微音的声音片段和您想要的暂停持续时间。

像这样插入表格:

          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, pause, s3])
          return queue

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

© www.soinside.com 2019 - 2024. All rights reserved.