Audio Units sind sehr niedrigschwellig und nützlich, wenn Sie einige schwere Audio-Verarbeitung wie Echtzeit-Audio-Effekte tun wollen. Soweit ich weiß, unterstützt Audio Units nicht den wma-Audio-Codec. Sie müssen die FFmpeg-Bibliothek für diese zu verwenden.
Da FFmpeg auch mms unterstützt, ist es nicht notwendig, eine andere Bibliothek wie libmms zu verwenden, um sich mit mms-Audiostreams zu verbinden. Sie können sich mit FFmpeg wie folgt mit mms-Audiostreams verbinden:
const char *url = "mmst://somemmsurlhere.com";
avformat_open_input(formatCtx, url, NULL, NULL);
Zur Dekodierung der Audiodaten können Sie die avcodec_decode_audio3 Funktion. Sobald Sie die dekodierten Audiodaten bereit haben, empfehle ich Ihnen, das AudioQueue-Framework für die Wiedergabe zu verwenden. AudioQueue funktioniert durch den Aufruf von Callback-Funktionen, die Sie definiert haben, um Sie nach Audiodaten zu fragen. Eine dieser Callback-Funktionen ist die AudioQueueOutputCallback, an die Sie die dekodierten Audiodaten wie folgt übergeben können:
- (void)handlePlayCallback:(AudioQueueRef) inAudioQueue buffer:(AudioQueueBufferRef) inBuffer {
// copy decoded audio data to inBuffer->mAudioData
// and set the size of the copied data like this
// inBuffer->mAudioDataByteSize = data_written
if(inBuffer->mAudioDataByteSize > 0) {
AudioQueueEnqueueBuffer(inAudioQueue, inBuffer, 0, NULL);
}
}