Использование FFMPEG для непрерывной передачи видеофайлов на RTMP-сервер

ffmpeg обрабатывает RTMP streaming как вход или выход, и он работает хорошо.

Я хочу транслировать некоторые видео (динамический плейлист, управляемый скриптом python) на RTMP-сервер, и в настоящее время я делаю что-то довольно простое: потоковое видео по одному с FFMPEG на RTMP-сервер, однако это вызывает разрыв соединения каждый раз, когда заканчивается видео, и поток готов к работе, когда начинается следующее видео.

Я хотел бы, чтобы поток видео без каких-либо соединение прерывается непрерывно, затем поток может быть правильно просмотрен.

я использую эту команду для потоковой передачи моих видео один за другим на сервер

ffmpeg -re -y -i myvideo.mp4 -vcodec libx264 -b:v 600k -r 25 -s 640x360 
-filter:v yadif -ab 64k -ac 1 -ar 44100 -f flv 
"rtmp://mystreamingserver/app/streamName"

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

есть ли способ этого ? (поток динамический список воспроизведения видео с ffmpeg на RTMP сервер без разрывов соединения

3 ответов


Update (так как я не могу удалить принятый ответ): правильным решением является реализация пользовательского демуксера, аналогичного конкат. В настоящее время нет другого чистого пути. Вы должны запачкать руки и код!

ниже уродливый Хак. Это очень плохой способ сделать это, просто нет!

решение использует concat demuxer и предполагает, что все исходные медиа-файлы используют тот же кодек. Пример основан на MPEG-TS, но то же самое можно сделать для RTMP.

  1. сделайте файл списка воспроизведения, содержащий огромный список точек входа для вас динамический список воспроизведения со следующим форматом:

    file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts'

    эти файлы просто заполнители.

  2. сделать скрипт, который отслеживает текущий индекс плейлист и создает символические ссылки "на лету" для current_index + 1

    ln -s /path/to/what/to/play/next.ts item_1.ts

    ln -s /path/to/what/to/play/next.ts item_2.ts

    ln -s /path/to/what/to/play/next.ts item_3.ts

    [...]

  3. начать играть ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>

  4. преследовали и обзывали злой системный администратор


вы можете передать свой цикл в буфер,и из этого буфера вы передаете свой потоковый экземпляр.

в консоли это будет выглядеть так:

#!/bin/bash

for i in *.mp4; do
       ffmpeg -hide_banner -nostats -i "$i" -c:v mpeg2video [proper settings] -f mpegts -
done | mbuffer -q -c -m 20000k | ffmpeg -hide_banner -nostats -re -fflags +igndts -thread_queue_size 512 -i pipe:0 -fflags +genpts [proper codec setting] -f flv rtmp://127.0.0.1/live/stream

конечно, вы можете использовать любой тип цикла, и цикл через список воспроизведения.

  • я выяснил, что mpeg немного более стабилен, а затем x264 для входного потока
  • Я не знаю, почему, но минимум 2 потока для сжатия mpeg работает лучше
  • входное сжатие должно быть быстрее, чем выходная частота кадров, поэтому мы получаем достаточно быстрый новый вход
  • из-за не продолжающейся отметки времени мы должны пропустить их и создать новый в выходных данных
  • размер буфера должен быть достаточно большим, чтобы цикл имел достаточно времени для получения нового клипа.

Я работаю над решением на основе python, еще не завершен, но за исключением некоторых предупреждений мой тестовый поток работает несколько дни:

ffplayout

используется формат списка воспроизведения xml. И список воспроизведения динамичен, таким образом, вы всегда можете редактировать текущий список воспроизведения и изменять треки или добавлять новые.


необходимо создать два файла списка воспроизведения и в конце каждого файла указать ссылку на другой файл.

list_1.txt

ffconcat version 1.0
file 'item_1.mp4'
file 'list_2.txt'

list_2.txt

ffconcat version 1.0
file 'item_2.mp4'
file 'list_1.txt'

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