音频工具箱回放仅播放输出缓冲区的一部分

我正在使用音频工具箱进行PCM数据录制和播放的项目,但播放时遇到问题。 在模拟器中,我可以录制和播放音频,使用自定义类来根据需要处理记录和回放缓冲区的PCM字节的存储和采集。 在设备上(iPhone(3.0.1)和iPod 2G(3.1.2))录制工作正常,产生的音频文件是正确的,但是应用内播放口吃,比如它只播放每个回放缓冲区的一部分。 我的缓冲区长达一秒,我有3个缓冲区,它们在播放开始之前预加载; 在最初的3秒钟内也出现口吃,我认为这排除了延迟问题。

在此之前,我已经编写了Audio Toolbox代码,除了我使用自己的类来源PCM数据而不是AudioFileReadBytes()之外,我在这里没有做任何奇怪的事情。

我知道源自我的数据是好的,因为它在sim中正常播放,并且它以正确的音频文件形式写入磁盘

我玩了一下采样率, 我通常使用11025Hz采样来减少文件大小(这是所有的声音,所以它听起来很好)。 在44100赫兹,但与相同大小的缓冲区,我得到相同的口吃问题,但音频段快得多,约4倍快。 这就是为什么我认为它只能播放每个缓冲区的一部分。

我认为只能播放每个缓冲区的一部分的唯一原因是延迟问题......就像音频工具箱代码在完全缓冲区中运行时,我仍然填满了空白区。 但是这会导致它正确地播放预加载的缓冲区,然后开始口吃,而这种情况不会发生,它会贯穿整个过程

我已经尝试了巨大的缓冲区,比如1​​0MB的缓冲区,我只是在播放结束时得到了沉默和一声音频。 我也尝试了比普通预加载更多的缓冲区,比如1​​0秒的音频,它的行为相同。 音频会话正在使用AVAudioSession进行设置,而不是音频工具箱调用,并将其设置为播放类别进行播放

我不知道如何尝试和解决这个问题,对我来说它没有任何意义,它可以在模拟器上正常工作,而不是在设备上正常工作。

播放回叫代码和音频队列服务的设置:http://pastebin.com/mfaa546c


事实证明,使用NSData的GetBytes:length:导致了这个问题。 用这种方法填充的缓冲区不正确。 但是,从该缓冲区向另一个缓冲区执行memcpy可以防止出现问题。

链接地址: http://www.djcxy.com/p/67013.html

上一篇: Audio Toolbox playback only plays part of output buffers

下一篇: wrong results when accessing Mat