Создание сегментов 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 и фрагментов.