我一直在试验如何使用FFMPEG来接收传入的RTMP流,将代码转换为一个选择的比特率,并将其输出为HLS。它起作用了。
我想把现场直播作为视频点播。当然,通过添加-hls_list_size 0标志可以发现,所有段都在.m3u8中。使它成为超级容易变成一个视频点播之后。到现在为止还好。
但是使用-hls_list_size 0的明显后果是,现在m3u8在实时流中是巨大的。这对于一个VOD来说很好,因为它只被要求一次,但是在一条不断被要求的实时流中,它就不太好了。
所以..。我的问题是:如果没有重新编码,FFMPEG能否同时输出一个全段all.m3u8 (为了在内部保留以便在使用-hls_list_size 0之后进行视频点播)和也输出一个滑动窗口样式的latest.m3u8 (仅为最后的X段,即使用-hls_list_size 3)?
这样,实时流的查看者就可以作为一个小latest.m3u8作为一个小文件来服务,其中只有最后几个片段。活动结束后,我会放弃那个小latest.m3u8,只保留all.m3u8来制作流的VOD版本?
谢谢!
发布于 2021-05-19 10:56:17
这是我的两分钱。正如@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"https://stackoverflow.com/questions/63693009
复制相似问题