2009-12-07 73 views

回答

1

是的,這是可能的。但它需要多個音頻API使用和多個線程。

由於音頻單元緩衝區回調線程的實時約束,您必須將壓縮文件轉換爲音頻單元回調之外的原始PCM樣本。您可以使用擴展音頻文件服務或AVAssetReader轉換爲音頻單元回調之外的未壓縮樣本。但是,您無需一次解壓整個文件。只要您在音頻單元回調緩衝區消耗率之前繼續填充足夠長的時間,短時間的非壓縮緩衝區就可能會完成。這可以在一個單獨的定時器驅動的線程中完成,該線程監視緩衝區的消耗,並相應地解壓縮足夠的音頻,也許是放入一個環形緩衝區或循環FIFO。

你最終會如何重寫Audio Queue API層,但具有更多的可定製性。

2

你想要去哪個低級別?您可以使用AudioHardware API:

err = AudioDeviceAddIOProc(deviceID, ioProc, self);

,並在您ioProc自己填寫的緩衝區,聽聽硬件改動,並處理實時線程和很多其他低層次的東西。

我假設你已經用AudioConverter解碼mp3數據並知道如何做到這一點。

+0

我會調查AudioConverter,它可能是我以後。我的問題不是關於使用AudioUnit本身,因爲我已經可以使用wav處理低級別的東西了,但我想使用MP3。謝謝:) – 2010-01-01 17:22:14

+3

對於轉換MP3,我建議使用擴展音頻文件服務。使用'ExtAudioFileOpenURL'打開文件,然後使用'ExtAudioFileGetProperty'獲取文件長度和數據格式以及其他信息。然後使用'ExtAudioFileSetProperty'將輸出格式設置爲PCM數據,因此當您在循環中調用'ExtAudioFileRead'時,它會返回未壓縮的數據。 – lucius 2010-01-01 20:13:35