【问题标题】:How to seek within an audio track using avassetreader?如何使用 avassetreader 在音轨中查找?
【发布时间】:2011-04-01 02:43:08
【问题描述】:

我熟悉如何使用 AVAssetReader 从 ipod 库中流式传输音频数据,但我不知道如何在音轨中寻找。例如在中途开始播放等。从头开始然后依次获取连续样本很容易,但肯定有办法随机访问吗?

【问题讨论】:

  • 我的意思是,没有从头开始,只是简单地扔掉不需要的样本。 (这将是粗略有效的,但可能算作一种贪婪的编程罪。)

标签: objective-c core-audio


【解决方案1】:

AVAssetReader 有一个属性 timeRange,它决定了要从中读取媒体数据的资产的时间范围。

@property(nonatomic) CMTimeRange timeRange

此属性的值与 CMTimeRangeMake(kCMTimeZero,asset.duration) 的交集决定了将读取媒体数据的资产的时间范围。

默认值为 CMTimeRangeMake(kCMTimeZero, kCMTimePositiveInfinity)。读取开始后,您无法更改此属性的值。

所以,如果你想寻找到轨道的中间,你会创建一个从asset.duration/2到asset.duration的CMTimeRange,并将其设置为AVAssetReader上的timeRange。

【讨论】:

  • 这意味着要在 AVAsset 中查找,您必须重新创建 AVAssetReader。
  • 只是为了增加一些清晰度......我试图停止阅读器,设置值并再次开始阅读。它失败了。该错误表明您无法在启动后设置范围(即使停止)。我能够使用 Rhythmic Fistman 的建议并重新创建 AVAssetReader。在我的情况下,它可以快速处理设备上的文件。
  • @ptoinson 当你说它快速..有多快?如您可以播放整个文件的内容而没有任何抖动或间隙吗? B/c 这就是发生在我身上的事情.. 见 here
  • @abbood 这将非常缓慢,而且远非实时。我试过了。 AVPlayerItem 和 AVPlayerItemVideoOutput 的搜索速度要快得多,但它们有自己的怪癖和怪异之处,例如像素缓冲区没有按预期返回。
  • @jjxtra 更不用说AVPlayerItemVideoOutput 强制您复制像素缓冲区,而AVAssetReaderTrackOutput 可以被指示尽可能不复制样本缓冲区...使最小化内存足迹真的很讨厌。
【解决方案2】:

AVAssetReader 在查找时速度非常慢。如果您尝试在用户拖动滑块时重新创建 AVAssetReader 进行搜索,那么您的应用将使 iOS 陷入瘫痪。

相反,您应该使用AVAssetReader 仅用于快进访问视频帧,然后在用户想要使用滑块搜索时也使用AVPlayerItemAVPlayerItemVideoOutput

如果 Apple 将 AVAssetReaderAVPlayerItem / AVPlayerItemVideoOutput 组合成一个高性能且能够快速搜索的新类,那就太好了。

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

如果你使用AVPlayerAVPlayerLayer,那么你可以简单地使用AVPlayer 本身的seek 方法。仅当您使用像素缓冲区进行自定义渲染和/或需要将像素缓冲区发送到AVAssetWriter 时,上述详细信息才重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多