我熟悉如何使用AVAssetReader从ipod库中流式传输音频数据,但我对如何在轨道内搜索感到茫然。例如在中途开始播放,等等。从头开始然后顺序获取连续样本很容易,但肯定有办法随机访问?
答案 0 :(得分:5)
AVAssetReader有一个属性timeRange,它确定将从中读取媒体数据的资产的时间范围。
@property(nonatomic) CMTimeRange timeRange
此属性的值与CMTimeRangeMake(kCMTimeZero,asset.duration)的交点确定将从中读取媒体数据的资产的时间范围。
默认值为CMTimeRangeMake(kCMTimeZero,kCMTimePositiveInfinity)。阅读开始后,您无法更改此属性的值。
因此,如果你想寻找轨道的中间位置,你需要从asset.duration / 2到asset.duration创建一个CMTimeRange,并将其设置为AVAssetReader上的timeRange。
答案 1 :(得分:3)
AVAssetReader
在寻求时非常缓慢。如果您尝试在用户拖动滑块时重新创建要搜索的AVAssetReader
,则您的应用会让iOS瘫痪。
相反,您应该使用AVAssetReader
仅限快进访问视频帧,然后在用户想要使用滑块搜索时使用AVPlayerItem
和AVPlayerItemVideoOutput
。 / p>
如果Apple将AVAssetReader
和AVPlayerItem
/ AVPlayerItemVideoOutput
合并到一个表现良好且能够快速寻找的新班级中,那就太好了。
请注意AVPlayerItemVideoOutput
不会返回像素缓冲区,除非AVPlayer
附加了AVPlayerItem
。这显然是一个奇怪的实现细节,但它就是它。
如果您使用的是AVPlayer
和AVPlayerLayer
,那么您可以在AVPlayer
本身上使用搜索方法。只有在使用像素缓冲区进行自定义渲染和/或需要将像素缓冲区发送到AVAssetWriter
时,上述细节才非常重要。