我一直在尝试使用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"