【发布时间】:2011-04-01 02:43:08
【问题描述】:
我熟悉如何使用 AVAssetReader 从 ipod 库中流式传输音频数据,但我不知道如何在音轨中寻找。例如在中途开始播放等。从头开始然后依次获取连续样本很容易,但肯定有办法随机访问吗?
【问题讨论】:
-
我的意思是,没有从头开始,只是简单地扔掉不需要的样本。 (这将是粗略有效的,但可能算作一种贪婪的编程罪。)
我熟悉如何使用 AVAssetReader 从 ipod 库中流式传输音频数据,但我不知道如何在音轨中寻找。例如在中途开始播放等。从头开始然后依次获取连续样本很容易,但肯定有办法随机访问吗?
【问题讨论】:
AVAssetReader 有一个属性 timeRange,它决定了要从中读取媒体数据的资产的时间范围。
@property(nonatomic) CMTimeRange timeRange
此属性的值与 CMTimeRangeMake(kCMTimeZero,asset.duration) 的交集决定了将读取媒体数据的资产的时间范围。
默认值为 CMTimeRangeMake(kCMTimeZero, kCMTimePositiveInfinity)。读取开始后,您无法更改此属性的值。
所以,如果你想寻找到轨道的中间,你会创建一个从asset.duration/2到asset.duration的CMTimeRange,并将其设置为AVAssetReader上的timeRange。
【讨论】:
AVPlayerItemVideoOutput 强制您复制像素缓冲区,而AVAssetReaderTrackOutput 可以被指示尽可能不复制样本缓冲区...使最小化内存足迹真的很讨厌。
AVAssetReader 在查找时速度非常慢。如果您尝试在用户拖动滑块时重新创建 AVAssetReader 进行搜索,那么您的应用将使 iOS 陷入瘫痪。
相反,您应该使用AVAssetReader 仅用于快进访问视频帧,然后在用户想要使用滑块搜索时也使用AVPlayerItem 和AVPlayerItemVideoOutput。
如果 Apple 将 AVAssetReader 和 AVPlayerItem / AVPlayerItemVideoOutput 组合成一个高性能且能够快速搜索的新类,那就太好了。
请注意,除非AVPlayer 附加到AVPlayerItem,否则AVPlayerItemVideoOutput 不会返回像素缓冲区。这显然是一个奇怪的实现细节,但它就是这样。
如果你使用AVPlayer 和AVPlayerLayer,那么你可以简单地使用AVPlayer 本身的seek 方法。仅当您使用像素缓冲区进行自定义渲染和/或需要将像素缓冲区发送到AVAssetWriter 时,上述详细信息才重要。
【讨论】: