Подключите libMMS к FFmpeg для потоковой передачи iPhone - PullRequest
0 голосов
/ 13 октября 2011

В эти дни я исследовал архитектуру программного обеспечения для iPhone Streaming (на основе протокола MMS).

Как мы знаем, для воспроизведения аудиопотока MMS мы должны вызвать libMMS для чтения данных потока wma с удаленного медиа-сервера, а затем вызвать FFmpeg для декодирования данных потока из формата wma в буфер данных PCM и, наконец, поставить в очередь буфер данных PCM в аудио очередь iPhone для генерации реального звука.

Введенное выше описание просто описывает рабочий процесс потоковой передачи iPhone. Если нам нужно только реализовать эту простую функциональность, это не сложно. Просто следуйте введению выше, чтобы шаг за шагом вызывать libMMS, FFMpeg и audioqueue, мы можем достичь функции потоковой передачи. На самом деле, я реализовал код на прошлой неделе.

Но мне нужна не только простая функция потоковой передачи! Мне нужна программная архитектура, позволяющая FFmpeg обращаться к libMMS так же, как к локальной файловой системе!

Кто-нибудь знает, как подключить интерфейсы libMMS, такие как mms_read / mms_seek, к интерфейсам файловой системы FFmpeg, таким как av_read_frame / av_seek_frame?

1 Ответ

1 голос
/ 08 ноября 2011

Думаю, на этот раз мне придется снова ответить на свой вопрос ……

После нескольких недель поиска и отладки я наконец понял правду.

На самом деле нам не нужно «подключать» libMMS к FFMpeg. Зачем? Поскольку FFMpeg уже имеет свой собственный модуль процесса протокола mms «mms_protocol» (см. Mms_protocol.c в FFMpeg).

Все, что нам нужно сделать, это просто настроить FFMpeg для включения модуля mms следующим образом (см. Config.h в FFMpeg):

#define ENABLE_MMS_PROTOCOL 1
#define CONFIG_MMS_PROTOCOL 1

После этой конфигурации FFMpeg добавит протокол mms в свой список протоколов. (На самом деле, список протоколов уже содержит «протокол локальной файловой системы»). В результате FFMpeg может обрабатывать медиа-файл «mms: // hostserver / abc» как локальный медиа-файл. Поэтому мы все еще можем открыть и прочитать файл мультимедиа mms, используя:

av_open_input_file();
av_read_frame();

как мы делали раньше в локальном медиа-файле!

Кстати, в моей версии ffmpeg в модуле libAVFormat по-прежнему много ошибок при обработке протокола mms. Мне потребовалась одна неделя, чтобы отладить его, однако, я думаю, что это будет намного короче для такого умного парня, как ты: -)

...