Возможно ли декодировать поток MMS + WMA2 с помощью аудиоустройств на iPhone?

StackOverflow https://stackoverflow.com/questions/2445918

Вопрос

Я не уверен, могут ли аудиоустройства работать как кодеки в сценарии потокового аудио на iPhone.

Я читал в разных местах, что это можно сделать, но я не видел никаких примеров или надлежащей документации для этого.Вместо этого я обнаружил, что большинство выпущенных приложений использовали ffmpeg и libmms.

Я ценю любую помощь, которую вы можете мне оказать.

Это было полезно?

Решение 2

Посмотрев на это еще раз, выясняется, что iOS поддерживает только встроенные аудиоустройства, в отличие от Mac OS X.Встроенные аудиоустройства описаны в "Руководстве по размещению аудиоустройств для iOS" -> "Использование конкретных аудиоустройств", которое можно найти в Интернете здесь.

Другие советы

Аудиоустройства очень низкого уровня и полезны, если вы хотите выполнить некоторую сложную обработку звука, например, звуковые эффекты в реальном времени.Насколько я знаю, Audio Units не поддерживает аудиокодек wma.Для этого вам придется использовать библиотеку FFmpeg.

Поскольку FFmpeg также поддерживает mms, нет необходимости использовать другую библиотеку, такую как libmms, для подключения к аудиопотокам mms.Вы можете подключаться к аудиопотокам mms с помощью FFmpeg следующим образом:

const char *url = "mmst://somemmsurlhere.com";
avformat_open_input(formatCtx, url, NULL, NULL);

Для декодирования аудиоданных вы можете использовать avcodec_decode_audio 3 функция.Как только у вас будут готовы декодированные аудиоданные, я предлагаю вам использовать фреймворк AudioQueue для воспроизведения.AudioQueue работает путем вызова определенных вами функций обратного вызова, которые запрашивают у вас аудиоданные.Одной из таких функций обратного вызова является AudioQueueOutputCallback, куда вы можете передавать декодированные аудиоданные следующим образом:

- (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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top