Использование 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.
-
сделайте файл списка воспроизведения, содержащий огромный список точек входа для вас динамический список воспроизведения со следующим форматом:
file 'item_1.ts' file 'item_2.ts' file 'item_3.ts' [...] file 'item_[ENOUGH_FOR_A_LIFETIME].ts'
эти файлы просто заполнители.
-
сделать скрипт, который отслеживает текущий индекс плейлист и создает символические ссылки "на лету" для
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
[...]
начать играть
ffmpeg -f concat -i playlist.txt -c copy output -f mpegts udp://<ip>:<port>
преследовали и обзывали злой системный администратор
вы можете передать свой цикл в буфер,и из этого буфера вы передаете свой потоковый экземпляр.
в консоли это будет выглядеть так:
#!/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, еще не завершен, но за исключением некоторых предупреждений мой тестовый поток работает несколько дни:
используется формат списка воспроизведения 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'
теперь все, что вам нужно, чтобы динамически изменять содержимое следующего файла плейлист.