从 FFMPEG 实时流式传输:输出一个窗口 m3u8 和一个全段 m3u8



我一直在尝试使用FFMPEG来获取传入的RTMP流,转码为一系列比特率,并将其输出为HLS。它有效。

我想将直播存储为 VOD。并且通过添加-hls_list_size 0标志找到,果然,所有段都在.m3u8中。之后变得非常容易变成 VOD。目前为止,一切都好。

但是使用-hls_list_size 0的明显后果是,现在m3u8在直播期间是巨大的。这对于只请求一次的 VOD 来说很好,但在一遍又一遍地请求它的直播中就不太好了。

所以。。。我的问题:如果不重新转码,FFMPEG 是否可以同时输出所有段 all.m3u8(在内部保留以便之后制作 VOD,即使用-hls_list_size 0)输出滑动窗口样式的 latest.m3u8(仅最后 X 段,即使用-hls_list_size 3)?

这样,直播的观众就可以得到最新的.m3u8,作为一个小文件,只有最后几个片段。活动结束后,我会放弃那个最新的.m3u8,只保留all.m3u8来制作流的VOD版本?

谢谢!

这是我的两分钱。正如@Gyan上面的评论中所建议的那样,我使用了tee命令。这需要一次输入,如果我只做 Live,我的系统性能几乎保持不变。唯一的缺点是它会创建许多段的重复副本,这些片段在HLS段中用于实时。

ffmpeg -y 
-hide_banner 
-i $input_url 
-preset veryfast -g 48 -sc_threshold 0 
-map 0:1 -map 0:2 -map 0:1 -map 0:2 -map 0:1 -map 0:2 
-filter:v:1 "scale=-2:360" -c:v:1 libx264 -b:v:1 365k 
-filter:v:2 "scale=-2:480" -c:v:2 libx264 -b:v:2 1600k  
-c:v:4 copy 
-f hls -hls_time 10 -hls_list_size 10 
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" 
-hls_segment_filename "$stream_key-v%v/%d.ts" 
-f hls -f tee 
"[var_stream_map='v:0,a:0 v:1,a:1 v:2,a:2 ': 
master_pl_name='master-live.m3u8': 
hls_flags=delete_segments: 
hls_list_size=60]$master-live%v/live.m3u8| 
[var_stream_map='v:0,a:0 v:1,a:1 v:2,a:2': 
master_pl_name='master-record.m3u8': 
hls_playlist_type=vod]$master-record%v/record.m3u8"

相关内容

  • 没有找到相关文章

最新更新