使用 ExtAudioFileRead 循环 AAC 文件 - 错误?
Posted
技术标签:
【中文标题】使用 ExtAudioFileRead 循环 AAC 文件 - 错误?【英文标题】:Looping AAC file with ExtAudioFileRead - bug? 【发布时间】:2014-05-09 16:50:57 【问题描述】:在 ios 上使用 ExtAudioFileRead 读取音频文件,似乎到达 eof 会完全冻结阅读器……例如,假设 _abl AudioBufferList 和 _eaf ExtendedAudioFileRef 已分配并正确配置:
- ( void )testRead
UInt32 requestedFrames = 1024;
UInt32 numFrames = requestedFrames;
OSStatus error = 0;
error = ExtAudioFileRead( _eaf, &numFrames, _abl );
if( numFrames < requestedFrames ) //eof, want to read enough frames from the beginning of the file to reach requestedFrames and loop gaplessly
requestedFrames = requestedFrames - numFrames;
numFrames = requestedFrames;
// move some pointers in _abl's buffers to write at the correct offset
error = ExtAudioFileSeek( _eaf, 0 );
error = ExtAudioFileRead( _eaf, &numFrames, _abl );
if( numFrames != requestedFrames ) //Now this call always sets numFrames to the same value as the previous read call...
NSLog( @"Oh no!" );
没有错误,总是相同的行为,就像阅读器卡在文件末尾一样。 ExtAudioFileTell 确认请求的搜索,顺便说一句。还尝试跟踪文件中的位置以仅请求 eof 处可用的帧数,结果相同:读取最后一个数据包后,seek 似乎没有任何效果。
在其他情况下乐于寻找。
错误?特征?即将面掌?我非常感谢任何帮助解决这个问题!
我正在 iPad 3 ( iOS7.1 ) 上对此进行测试。
干杯,
格雷佐
【问题讨论】:
【参考方案1】:哇!
知道了,邪恶的 AudioBufferList 修补匠。
因此,ExtAudioFileRead 除了通知客户端实际读取的帧数外,还将 AudioBufferList 的 AudioBuffers mDataByteSize 设置为读取的字节数。由于它将读数限制为该值,因此在 eof 不重置它会导致永久获得的帧数少于询问的帧数。
因此,一旦达到 eof,只需重置 abl 的缓冲区大小。
-( void )resetABLBuffersSize: ( AudioBufferList * )alb size: ( UInt32 )size
AudioBuffer * buffer;
UInt32 i;
for( i = 0; i < abl->mNumberBuffers; i++ )
buffer = &( abl->mBuffers[ i ] );
buffer->mDataByteSize = size;
这不应该记录在案吗?官方文档仅这样描述 AudioBufferList 参数:一个或多个音频数据被读取到的缓冲区。
干杯,
格雷佐
【讨论】:
以上是关于使用 ExtAudioFileRead 循环 AAC 文件 - 错误?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 中的 ExtAudioFileRead 出现错误代码 -50