Создание сегментов mpeg-dash и файла mpd с использованием буфера транспортного потока

Я получаю транспортный поток mpeg-2 в буфере, и мне нужно передать содержимое с помощью HTTP в веб-представление.

Я планирую реализовать это, используя спецификацию mpeg-dash и простой HTTP-сервер. Одним из способов является сам анализ пакета транспортного потока и генерация живых сегментов и файла mpd соответственно, но это кажется долгим процессом.

Я прошел через такие инструменты, как mp4box и ffmpeg, которые способны генерировать dash-совместимые сегменты, используя статические медиа-файлы, но документация недостаточно ясна для начинающих.

Есть ли какой-нибудь простой способ создания живого контента (в корневую папку сервера) с использованием буферизованного транспортного потока в качестве входных данных (возможно, через канал).

Если есть способ получше, пожалуйста, дайте мне знать. Вы думаете, что разбор пакета транспортного потока будет лучшим вариантом?

1 ответ

FFMPEG может читать из канала вместо файла, используя-pipe:Nгде «N» — дескриптор файла.

Для тестирования из оболочки вы можетеcatфайл и передать его в FFMPEG. Что-то вроде этого:

      cat someFile.ts | ffmpeg -re -loglevel verbose -f mpegts \
  -i pipe:0 \
  -map 0:p:8 \
  -filter_complex [v:0]scale=640:-1 \
  -c:v libx264 -b:v 1M -c:a aac -b:a 64k \
  -f dash \
   -dash_segment_type mp4 -movflags +delay_moov -seg_duration 2.000000 \
   -frag_type duration -frag_duration 0.200000 \
   -index_correction 1 \
   -target_latency 1 -window_size 10 -extra_window_size 5 -remove_at_exit 1 -streaming 1 -ldash 1 \
   -use_template 1 -use_timeline 0 -write_prft 1 -avioflags direct -fflags +nobuffer+flush_packets \
   -format_options movflags=+cmaf \
   -utc_timing_url /myServer/time.php  \
   /path/to/master.mpd

Если ваш файл TS имеет несколько программ (MPTS), используйте-mapи укажите программу. Обязательно укажите программу, если вы тоже масштабируете!

Если вы хотите сделать все это в программе, то:

Создайте отдельный процесс с помощьюfork(), создайте канал между процессами с помощьюpipeи вызовите FFMPEG с помощьюexecv()или похожие.

Командная строка FFMPEG передается вexec()необходимо указать fd для стороны чтения канала. например, -pipe:9 (или что-то еще)

В родительском процессе читайте фрагменты данных TS из источника (файла или сети) и записывайте на сторону записи канала.

FFMPEG прочитает канал и создаст файлы MPD и фрагментов.

Другие вопросы по тегам