Frage

Ich mag ein MP3-Format wiedergeben, anstatt eine nicht komprimierte Datei mit RemoteIO / Audio Unit. Mit unkomprimierte Dateien offensichtlich viel zu viel Speicherplatz (30 MB vs 3MB für mp3) verwendet.

Ist das überhaupt möglich? Wenn ja, können Sie einen kleinen Code Vorsprung zur Verfügung stellen?

Dank einer Million.

War es hilfreich?

Lösung

Ja, es ist möglich. Aber es mehrere Audio-API verwenden und mehrere Threads erfordert.

Durch die Echtzeitbedingungen des Audio-Unit-Puffer Rückruf-Thread, werden Sie tun müssen, um die Umwandlung von komprimierten Dateien auf Raw PCM-Samples außerhalb des Callback-Audio-Unit. Sie könnten Erweiterte Audio-Dateidienste oder AVAssetReader verwenden, um die Umstellung auf unkomprimierte Proben außerhalb des Audio-Unit-Rückruf zu tun. Allerdings müssen Sie nicht auf einmal die gesamte Datei dekomprimieren. Ein kurzer unkomprimierter Puffer von einem Bruchteil einer Sekunde wird wahrscheinlich tun, solange halten Sie sie weit genug vor der Audio-Unit-Callback-Puffer Verbrauchsrate zu füllen. Dies kann in einem separaten Timer angetrieben Gewinde erfolgen, den Pufferverbrauch überwacht und dekomprimiert gerade genug, um Audio-dementsprechend vielleicht in einen Ringpuffer oder Kreis FIFO.

Was Sie mit am Ende wird auf eine Neufassung der Audio Queue API-Schicht ähnlich sein, aber mit mehr Anpassbarkeit.

Andere Tipps

Wie Low-Level wollen Sie gehen? Sie können die AudioHardware API verwenden:

err = AudioDeviceAddIOProc(deviceID, ioProc, self);

und in Ihrem IOProc füllt die Puffer selbst, hört für Hardware-Änderungen, und befassen sich mit Echtzeit-Threading und vielen anderen Low-Level-Zeug.

Ich gehe davon aus Sie bereits die MP3-Daten mit Audioconverter Decodierung und wissen, wie das zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top