FFmpeg Live Stream - петля видео?
Я пытаюсь транслировать петлю видео на justin.tv с помощью FFmpeg? Мне удалось зациклить последовательность изображений и объединить ее со строкой в аудио:
ffmpeg -loop 1 -i imageSequence% 04d.jpg -f alsa -ac 2 -ar 22050 -ab 64k \ -i pulse -acodec adpcm_swf -r 10 -vcodec flv \ -f flv rtmp: //live.justin.tv/app/
Возможно ли это сделать с помощью видеофайла?
2 ответа
Определенно возможно. В последних версиях ffmpeg они добавили флаг -stream_loop, который позволяет зацикливать ввод столько раз, сколько требуется.
Суть в том, что если вы не регенерируете pts из источника, ffmpeg пропустит кадры после первого цикла (так как временная метка внезапно вернется во времени). Чтобы избежать этого, вы должны указать ffmpeg генерировать pts, чтобы вы получали увеличивающуюся временную метку между циклами. Это делается с помощью вызова + genpts (это должно быть до -i arg).
Вот пример вызова ffmpeg (замените $F входным файлом). В этом примере генерируются два выходных потока, а аргумент -stream_loop -1 указывает ffmpeg на непрерывный цикл ввода. Выходные данные в этом случае предназначены для аналогичного потокового вещания (MetaCDN), отрегулируйте в соответствии с вашими требованиями.
ffmpeg -threads 2 -re -fflags +genpts -stream_loop -1 -i $F \
-s 640x360 -ac 2 -f flv -vcodec libx264 -profile:v baseline -b:v 600k -maxrate 600k -bufsize 600k -r 24 -ar 44100 -g 48 -c:a libfdk_aac -b:a 64k "rtmp://publish.live.metacdn.com/2050C7/dfsdfsd/lowquality_664?hello&adbe-live-event=lowquality_" \
-s 1920x1080 -ac 2 -f flv -vcodec libx264 -profile:v baseline -b:v 2000k -maxrate 2000k -bufsize 2000k -r 24 -ar 44100 -g 48 -c:a libfdk_aac -b:a 64k "rtmp://publish.live.metacdn.com/2050C7/dfsdfsd/highquality_2064?mate&adbe-live-event=highquality_"
Sinclair Media нашла решение с помощью фильтра lavfi и добавления :loop=0
к имени файла:
Это не проверено:
ffmpeg -f lavfi -re -i movie=StreamTest.avi:loop=0 \
-acodec libfaac -b:a 64k -pix_fmt yuv420p -vcodec libx264 \
-x264opts level=41 -r 25 -profile:v baseline -b:v 1500k \
-maxrate 2000k -force_key_frames 50 -s 640×360 -map 0 -flags \
-global_header -f segment -segment_list index_1500.m3u8 \
-segment_time 10 -segment_format mpeg_ts \
-segment_list_type m3u8 segmented.ts
Но он должен создать локальный файл index_1500.m3u8, который транслирует видео в StreamTest.avi.
Я просто повторно использую ответы Роба с некоторыми изменениями, чтобы предоставить файл для прямой трансляции.
ffmpeg -threads 2 -re -fflags +genpts -stream_loop -1 -i gvf.mp4 -c copy -f mpegts -mpegts_service_id 102 -metadata service_name=My_channel -metadata service_provider=My_Self -max_interleave_delta 0 -use_wallclock_as_timestamps 1 -flush_packets 1 "udp://233.0.0.1:1001?localaddr=10.60.4.237&pkt_size=188"