如何使用avassetreader在音频轨道中搜索?

时间:2011-04-01 02:43:09

标签: objective-c core-audio

我熟悉如何使用AVAssetReader从ipod库中流式传输音频数据,但我对如何在轨道内搜索感到茫然。例如在中途开始播放,等等。从头开始然后顺序获取连续样本很容易,但肯定有办法随机访问?

2 个答案:

答案 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仅限快进访问视频帧,然后在用户想要使用滑块搜索时使用AVPlayerItemAVPlayerItemVideoOutput。 / p>

如果Apple将AVAssetReaderAVPlayerItem / AVPlayerItemVideoOutput合并到一个表现良好且能够快速寻找的新班级中,那就太好了。

请注意AVPlayerItemVideoOutput不会返回像素缓冲区,除非AVPlayer附加了AVPlayerItem。这显然是一个奇怪的实现细节,但它就是它。

如果您使用的是AVPlayerAVPlayerLayer,那么您可以在AVPlayer本身上使用搜索方法。只有在使用像素缓冲区进行自定义渲染和/或需要将像素缓冲区发送到AVAssetWriter时,上述细节才非常重要。