ios - AVPlayer 中的 SeekToTime 在前进时停止播放流音频

标签 ios swift avplayer audio-streaming seektotime

我正在使用 AVPlayer 流式传输音频。它运作良好。但现在我需要制作一个 slider 来向前和向后移动音频,就像典型的音乐播放器一样。我使用了 seekToTime 函数,它非常适合本地音频文件。但是,当我从 Web url 流式传输歌曲时,当我将 slider 向前移动较大范围时,该功能会停止音频。

我的猜测是,歌曲正在下载,如果我将 slider 向前移动较大范围,那么可能是系统当时尚未下载歌曲数据包,因此它会停止播放器。

假设我只是按了一个按钮来播放歌曲,但现在我在第 0 秒到第 100 秒时立即移动 slider 。在这种情况下,系统无法工作并停止播放器。由于当时缺少数据包。

有谁知道如何解决这个问题或者有其他方法吗?我正在使用 SWIFT 进行开发。如果任何库都能快速运行,我也愿意使用它。这是我的功能:

func forward () {
    timeGap = slider.value
    let preferredTimeScale : Int32 = 1
    let targetTime : CMTime = CMTimeMake(timeGap, preferredTimeScale)

    player.seekToTime(targetTime, toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)

}

提前致谢。

最佳答案

这个答案很大程度上基于这个:https://stackoverflow.com/a/7195954/765298 。所有的功劳都应该放在那里,因为这只是 swift 的翻译。

您的假设是正确的,当向前寻找尚未缓冲的部分时,播放器会停止。问题是它仍然缓冲数据,但在准备好时不会自动启动。因此,重新表述 swift 的链接答案:

设置观察者:

player.currentItem?.addObserver(self, forKeyPath: "playbackBufferEmpty", options: .New, context: nil)
player.currentItem?.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options: .New, context: nil)

请注意,为了能够观察值,传递的 self 需要继承自 NSObject

并处理它们:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {

    guard keyPath != nil else { // a safety precaution
        super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
        return
    }

    switch keyPath! {
        case "playbackBufferEmpty" :
            if player.currentItem!.playbackBufferEmpty {
                print("no buffer")
                // do something here to inform the user that the file is buffering
            }

        case "playbackLikelyToKeepUp" :
            if player.currentItem!.playbackLikelyToKeepUp {
                self.player.play()
                // remove the buffering inidcator if you added it
            }
    }
}

您还可以从当前正在播放的 AVPlayerItem 获取有关可用时间范围的信息(如果您自己没有创建的话,可以通过 player.currentItem 访问它)。这使您能够向用户指示文件的哪些部分已准备就绪。

一如既往,您可以在文档中阅读更多内容:AVPlayerItemAVPlayer

要了解有关键值观察 (KVO) 的更多信息:here

关于ios - AVPlayer 中的 SeekToTime 在前进时停止播放流音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907477/

相关文章:

ios - 删除大标题 UINavigationBar 中 UISearchController 顶部的 1px 行

ios - UITableViewRowAction 在 Swift 中自定义标题字体大小

swift - DispatchQueue 同步块(synchronized block)与异步 block

ios - 选择 TableView 中的每个单元格时呈现不同的 View

ios - 在 Swift 4/Xcode 9 : AVF context unavailable for sharedAudioPresentationContext 中从 url 播放视频文件

ios - AVPlayer 在播放前停止 UIActivityIndi​​cator

ios - AVAudioSession 类别变为 nil 并且 mediaServicesWereReset,avplayer 播放一直失败

ios - 如何从自定义 uitableviewcell 推送到新的 View Controller

ios - 核心数据 - 无法在路径加载优化模型

ios - 如何关闭通知内容扩展?