2010-02-04 246 views
3

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

我写音频工具箱代码之前工作过,只不过我用我自己的类来源的PCM数据,而不是AudioFileReadBytes()

我知道数据我没有做任何事情怪在这里散发出来我的来源是好的,因为它起到正确的SIM卡,并将其写入到磁盘

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

我能想象,这将只能发挥每个缓冲区的一部分的唯一原因是延迟问题......像音频工具箱代码运行了完整的缓冲区,而我仍然填充空单。但是,这将导致它正确地播放预加载的缓冲区,并然后开始口吃,这不会发生,它断断续续通过

我试过堆积如山的缓冲区,如10MB缓存的整个方式,我只是在播放结束时获得沉默和一声音频。我也尝试了比普通预加载更多的缓冲区,比如1​​0秒的音频,它的行为相同。 音频会话被设定AVAudioSession,没了音讯工具箱调用,并且它被设置为播放类别的播放

我不知道如何去尝试攻击这个问题,它没有任何意义,我认为这在模拟器上工作正常,但不是设备。

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

+0

如果使用AudioServicesPlaySystemSound播放音频文件,它是否正确播放? – 2010-02-05 03:02:50

回答

0

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