【发布时间】:2021-05-07 06:08:18
【问题描述】:
是否可以将AVPlayer 搜索到 HLS 视频的最后一帧?每当我寻找时间(等于当前项目持续时间)时,我总是会在最终目的地之前的某个位置结束。我什至在寻求时尝试在容忍前后使用零,但它没有用。
如何以编程方式查找AVPlayer 中视频的结尾?
【问题讨论】:
标签: ios media-player avplayer http-live-streaming
是否可以将AVPlayer 搜索到 HLS 视频的最后一帧?每当我寻找时间(等于当前项目持续时间)时,我总是会在最终目的地之前的某个位置结束。我什至在寻求时尝试在容忍前后使用零,但它没有用。
如何以编程方式查找AVPlayer 中视频的结尾?
【问题讨论】:
标签: ios media-player avplayer http-live-streaming
您必须将toleranceAfter 更改为正无穷大。
更多细节在这里https://stackoverflow.com/a/14168591/7844080
【讨论】:
我不确定它是否有帮助,但我遇到了类似的问题。
我的任务是寻找AVPlayer播放的视频的最后一帧。
我通过寻找AVPlayer 实例的当前项目的持续时间值来做到这一点。但是在运行AVPlayer下面的代码后,显示的是空白帧而不是视频的最后一帧。
guard let duration = player?.currentItem?.asset.duration else {
return
}
player?.seek(to: duration, toleranceBefore: .zero, toleranceAfter: .zero)
最后,我希望找到问题的原因。
我们应该考虑到AVAsset 实例可以同时包含视频和音频轨道(通常是单个视频轨道和单个音频轨道),并且可能存在音频轨道的持续时间较长的情况比视频轨道的持续时间。
所以我们应该得到AVAsset的视频轨道的持续时间(AVAssetTrack实例有一个适当的属性timeRange),并用它来寻找AVPlayer的最后一帧。
下面的代码解决了我的问题。
guard let firstVideoTrack = player?.currentItem?.asset.tracks(withMediaType: .video).first else {
return
}
let duration = firstVideoTrack.timeRange.duration
player?.seek(to: duration, toleranceBefore: .zero, toleranceAfter: .zero)
如果音轨在视频轨道之前开始,或者单个资产中有多个视频和/或音频轨道,则可能会出现更复杂的情况。在这种情况下,请检查timeRange 的AVAssetTrack 结构的start 属性并执行适当的操作。
还请注意,某些AVAsset 字段(例如tracks)是异步加载的。确保您在阅读之前使用了AVAsset 的loadValuesAsynchronously(forKeys:completionHandler:) 方法来加载它们。
【讨论】: