我想使用RemoteIO/AudioUnit播放一個mp3而不是一個未壓縮的文件。 使用未壓縮的文件顯然使用了太多的磁盤空間(30MB與3MB的mp3)。在iPhone上使用RemoteIO和AudioUnits播放MP3 ...可能嗎?
這甚至可能嗎?如果是這樣,你能提供一個小小的代碼headstart嗎?
非常感謝。
我想使用RemoteIO/AudioUnit播放一個mp3而不是一個未壓縮的文件。 使用未壓縮的文件顯然使用了太多的磁盤空間(30MB與3MB的mp3)。在iPhone上使用RemoteIO和AudioUnits播放MP3 ...可能嗎?
這甚至可能嗎?如果是這樣,你能提供一個小小的代碼headstart嗎?
非常感謝。
是的,這是可能的。但它需要多個音頻API使用和多個線程。
由於音頻單元緩衝區回調線程的實時約束,您必須將壓縮文件轉換爲音頻單元回調之外的原始PCM樣本。您可以使用擴展音頻文件服務或AVAssetReader轉換爲音頻單元回調之外的未壓縮樣本。但是,您無需一次解壓整個文件。只要您在音頻單元回調緩衝區消耗率之前繼續填充足夠長的時間,短時間的非壓縮緩衝區就可能會完成。這可以在一個單獨的定時器驅動的線程中完成,該線程監視緩衝區的消耗,並相應地解壓縮足夠的音頻,也許是放入一個環形緩衝區或循環FIFO。
你最終會如何重寫Audio Queue API層,但具有更多的可定製性。
你想要去哪個低級別?您可以使用AudioHardware API:
err = AudioDeviceAddIOProc(deviceID, ioProc, self);
,並在您ioProc自己填寫的緩衝區,聽聽硬件改動,並處理實時線程和很多其他低層次的東西。
我假設你已經用AudioConverter解碼mp3數據並知道如何做到這一點。
我會調查AudioConverter,它可能是我以後。我的問題不是關於使用AudioUnit本身,因爲我已經可以使用wav處理低級別的東西了,但我想使用MP3。謝謝:) – 2010-01-01 17:22:14
對於轉換MP3,我建議使用擴展音頻文件服務。使用'ExtAudioFileOpenURL'打開文件,然後使用'ExtAudioFileGetProperty'獲取文件長度和數據格式以及其他信息。然後使用'ExtAudioFileSetProperty'將輸出格式設置爲PCM數據,因此當您在循環中調用'ExtAudioFileRead'時,它會返回未壓縮的數據。 – lucius 2010-01-01 20:13:35