Возможно ли декодировать поток MMS + WMA2 с помощью аудиоустройств на iPhone?
-
20-09-2019 - |
Вопрос
Я не уверен, могут ли аудиоустройства работать как кодеки в сценарии потокового аудио на 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);
}
}