gpt4 book ai didi

ios - 使用 ExtAudioFileRead 循环 AAC 文件 - 错误?

转载 作者:可可西里 更新时间:2023-11-01 05:35:15 24 4
gpt4 key购买 nike

在 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 ) 上测试这个。

干杯,

格雷佐

最佳答案

哇哦!

明白了,邪恶的 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 参数:读取音频数据的一个或多个缓冲区。

干杯,

格雷佐

关于ios - 使用 ExtAudioFileRead 循环 AAC 文件 - 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23570038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com