2013-04-23 68 views
6

我想使用FFmpeg将视频循环流式传输给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/<yourStreamKeyHere> 

是否有可能与视频文件来做到这一点?

回答

2

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”中流式传输视频。

+0

我不得不使用这些参数,使其正常工作:'-f lavfi -re -fflags + genpts -i“电影= GleamingThatBrownbutterfly.webm:循环= 0,setpts = N /(帧频* TB) “'。如果没有这些,它会在第一次循环后停止,其余的帧被丢弃。 – jadkik94 2016-09-05 19:13:10

3

绝对有可能。在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_"