我正在尝试为iPhone编写波形可视化工具,而且我遇到了ExtAudioFileRead的一个有趣问题。
我正在阅读VBR MP3文件。我的客户端格式是44.1kHz LPCM,mono。
我会寻找一个我想要想象的位置,并在1024帧中读取。我所看到的是70%或80%的时间,我在前512个左右的帧中得到零。该报告表明它已成功读取所有请求的帧。
此外,我已经证实我正在寻找正确的位置。如果我将读取结果放入音频队列,它显然是文件中的正确位置。
那是什么给出的?有关为什么会出现这种情况的任何想法?我在与此问题相关的文档中找不到任何内容。
答案 0 :(得分:3)
我设法通过在请求帧的位置之前寻找位置1024帧,读取1024 + requestedLength
帧,然后将最后requestedLength
帧拉出缓冲区来解决此问题。
我不确定为什么这个解决方案有效,但我有一个理论(如果有人正在读这个)
在压缩格式中,音频文件被分成数据包。中间帧的帧需要解码任何先前的帧(来自相同的分组)才能被理解。
推测
可能当您使用ExtAudioFileSeek
搜索中间数据包时,此解码不会发生,并且将返回零,直到您到达下一个数据包边界。
我的解决方案可能工作,因为我回溯到足以在同一个数据包之前读取所有帧之前的所有帧,因此解码确实发生。