Реализуйте простой мультиплексор MPEG-TS, используя ffmpeg-lib

У меня есть приложение, которое записывает необработанные аудио данные в формате LPCM, хранящиеся в буфере. Я хотел бы инкапсулировать данные в транспортный поток и отправить этот транспортный поток через UDP в сегментатор потока (в соответствии со спецификациями HTTP Live Streaming) на другом хосте.

FFmpeg предоставляет утилиту командной строки для этого, но с файлом в качестве входных данных ffmpeg -re -i output.aac -acodec copy -f mpegts udp://127.0.0.1:5555.

Моей первой мыслью было использовать FFmpeg API, особенно библиотеку libavformat. Предоставляет ли libavformat мультиплексор, который я мог бы использовать для инкапсуляции звука в LPCM в транспортный поток, или мне нужно реализовать его с нуля?

Я нашел этот исходный код https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/mpegts.c, но я не уверен, действительно ли он делает то, что я ищу.

Спасибо за вашу помощь,


person Pierre P.    schedule 16.04.2018    source источник
comment
libavformat/mpegtsenc.c является мультиплексором TS, но не мультиплексирует LPCM. Патч приветствуется.   -  person Gyan    schedule 16.04.2018
comment
Есть ли у него какая-либо документация или мне нужно погрузиться в код?   -  person Pierre P.    schedule 16.04.2018
comment
Отдельные мультиплексоры сами по себе не документированы. Основной процесс такой же: вы инициализируете, записываете заголовок (если применимо), записываете пакеты, записываете трейлер, деинициируете. См. соответствующие функции в нижней части файла.   -  person Gyan    schedule 16.04.2018
comment
Обязательно ли иметь LPCM во время его передачи по сети? Вероятно, это несжатый формат, поэтому вы не можете найти то, что вам нужно, поскольку это неэффективно для сетевого транспорта. Вы можете кодировать и транспортировать, а декодирование обратно в LPCM будет довольно простым процессом. Если вы действительно просто хотите передать LPCM по сети, просто отправьте его в сокет и не нужно использовать ffmpeg.   -  person Andrew    schedule 17.04.2018
comment
@ Эндрю Нет, мне не нужно переводить в LPCM. Мой звук изначально создается в формате LPCM, но я могу легко закодировать его в более подходящий формат, такой как AAC. Однако мне нужно передать его в транспортном потоке MPEG, потому что это то, что ожидает серверный процесс.   -  person Pierre P.    schedule 17.04.2018
comment
@Gyan Transport Streams требует пакетного элементарного потока. Предоставляет ли ffmeg какую-либо утилиту для преобразования сегмента в элементарный поток?   -  person Pierre P.    schedule 19.04.2018


Ответы (2)


Итак, исходя из вашего комментария о том, что он не обязательно должен быть LPCM в TS, вам необходимо:

  1. Расшифруйте аудио / прочитайте кадры
  2. Закодируйте его как что-то подходящее для отправки в транспортном потоке, например. mp3 или AAC. Думаю, это список вариантов: https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/mpegts.h#L45-L64
  3. Упакуйте его в TS, подходящий для условий вашей сети, например. размер пакета и т. д.
  4. Отправить по UDP

Здесь есть разумный пример всего этого: https://github.com/rvs/ffmpeg/blob/master/libavformat/output-example.c

Как упоминалось в предыдущем ответе от szatmary, вы также можете просто передать это в ffmpeg, что может быть проще всего.

person Andrew    schedule 19.04.2018
comment
Спасибо. Однако я не могу использовать утилиту ffmpeg, потому что и запись, и потоковая передача встроены в мое приложение. - person Pierre P.; 20.04.2018
comment
Этот пример кода будет предназначен для встраивания в ваше приложение. - person Andrew; 23.04.2018
comment
Да, я знаю, я просто имел в виду ваше последнее предложение :) - person Pierre P.; 23.04.2018

Вы можете использовать мультиплексор ts напрямую через libavformat. Однако вы также можете передать звук в ffmpeg, используя -i -

person szatmary    schedule 16.04.2018
comment
Моя цель - программно воспроизвести утилиту ffmeg с API libavformat, но все равно спасибо - person Pierre P.; 16.04.2018