在不进行轮询的情况下使用 AVAssetReader 和 copyNextSampleBuffer
Using AVAssetReader and copyNextSampleBuffer without polling
我正在使用 AVAssetReader
在辅助线程上从文件中读取音频数据。我见过的每个代码示例的核心都是这样的循环:
while (assetReader.status == AVAssetReaderStatusReading)
{
// ...
buffer = [theAssetReaderTrackOutput copyNextSampleBuffer];
// ...
}
(或 Swift 等价物)。我的问题是,copyNextSampleBuffer
是在等待来自 AVAsset
的数据时阻塞,还是在数据尚不可用时 return NULL
阻塞?如果是后者,那么我们有一个轮询循环,这是不好的做法,在反复检查 status
的同时燃烧 CPU 个循环。 copyNextSampleBuffer
的文档没有说明它是否在等待时阻塞线程。我也不知道它是否尝试 return 立即使用它可用的任何数据,或者 fails/blocks 除非它有足够的数据用于某个最小大小的缓冲区。
这个案例实际上是有记录的(总是令人惊喜)。 copyNextSampleBuffer
的头文件说
Copies the next sample buffer for the output synchronously.
并且 copyNextSampleBuffer
记录为 return NULL
当在 EOF
上无法读取更多样本时 status
将设置为 AVAssetReaderStatusCompleted
https://developer.apple.com/documentation/avfoundation/avassetreaderoutput/1385732-copynextsamplebuffer
https://developer.apple.com/documentation/avfoundation/avassetreaderstatus?language=objc
我正在使用 AVAssetReader
在辅助线程上从文件中读取音频数据。我见过的每个代码示例的核心都是这样的循环:
while (assetReader.status == AVAssetReaderStatusReading)
{
// ...
buffer = [theAssetReaderTrackOutput copyNextSampleBuffer];
// ...
}
(或 Swift 等价物)。我的问题是,copyNextSampleBuffer
是在等待来自 AVAsset
的数据时阻塞,还是在数据尚不可用时 return NULL
阻塞?如果是后者,那么我们有一个轮询循环,这是不好的做法,在反复检查 status
的同时燃烧 CPU 个循环。 copyNextSampleBuffer
的文档没有说明它是否在等待时阻塞线程。我也不知道它是否尝试 return 立即使用它可用的任何数据,或者 fails/blocks 除非它有足够的数据用于某个最小大小的缓冲区。
这个案例实际上是有记录的(总是令人惊喜)。 copyNextSampleBuffer
的头文件说
Copies the next sample buffer for the output synchronously.
并且 copyNextSampleBuffer
记录为 return NULL
当在 EOF
上无法读取更多样本时 status
将设置为 AVAssetReaderStatusCompleted
https://developer.apple.com/documentation/avfoundation/avassetreaderoutput/1385732-copynextsamplebuffer
https://developer.apple.com/documentation/avfoundation/avassetreaderstatus?language=objc