8

I am trying to stream a video loop to justin.tv using FFmpeg? I have managed to loop an image sequence and combine it with line in audio:

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/<yourStreamKeyHere>

Is it possible to do this with a video file?

Zombo
  • 1
  • 62
  • 391
  • 407
Dread-Eye
  • 109
  • 1
  • 1
  • 5

3 Answers3

13

Definitely possible. In the recent versions of ffmpeg they have added a -stream_loop flag that allows you to loop the input as many times as required.

The gotcha is that if you don't regenerate the pts from the source, ffmpeg will drop frames after the first loop (as the timestamp will suddenly go back in time). To avoid this, you need to tell ffmpeg to generate the pts so you get an increasing timestamp between loops. This is done with the +genpts call (it has to be before the -i arg).

Here's an example ffmpeg call (replace $F with your input file). This example generates two output streams and the -stream_loop -1 argument tells ffmpeg to continuously loop the input. The output in this case is for a similar stream broadcast ingest (MetaCDN), adjust accordingly to your requirements.

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_"
Rob Whatmough
  • 131
  • 1
  • 4
2

Sinclair Media has found a solution by using the lavfi filter and appending :loop=0 to the file name :

This is untested:

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

But it should create a local "index_1500.m3u8" file that streams the video in "StreamTest.avi".

Andrew T.
  • 2,088
  • 1
  • 20
  • 42
  • I had to use these arguments to make it work properly: `-f lavfi -re -fflags +genpts -i "movie=GleamingThatBrownbutterfly.webm:loop=0, setpts=N/(FRAME_RATE*TB)"`. Without those, it was stopping after the first loop and the rest of the frames were dropped. – jadkik94 Sep 05 '16 at 19:13
  • Thanks, is there a way to add dynamic image overlay on live stream video input? Means we can keep changing image overlay after video stream started? – Ankit Maheshwari Oct 30 '20 at 17:10
-1

I just reuse the Rob's answers with a few of modifications in order to provide a file to live streaming

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"
Dharman
  • 30,962
  • 25
  • 85
  • 135