2010-02-04 219 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可以防止出現問題。