我正在使用 ffmpeg 创建一个视频转码点播系统,通过 HLS 格式提供媒体服务。
现在我可以对视频进行转码并按编码方式播放,但我无法使用播放器的搜索功能,因为播放列表 (.m3u8) 仅在对块进行编码时生成。我尝试使用选项-g
,将其设置为 90,块长度为 3 秒,帧率为 30fps(准确地说是 29.7fps)。但实际的块长度略有波动。我还尝试设置 HLS 标志round_durations
,但播放器无法在打开该标志的情况下工作。
块大小是否取决于正在转码的场景,或者是否可以通过探测文件来快速确定其模式并在开始时生成完整的虚拟 .m3u8?或者是否有任何选项可以让 ffmpeg 生成播放列表而无需实际编码文件?
这是我现在正在使用的命令:(为了清楚起见,使用多行)
ffmpeg.exe -i input.mkv -c:v libx264 -c:a aac -crf 22 -preset faster
-format hls -sn -hls_time 3 -hls_base_url http://localhost/media/
-hls_list_size 0 -hls_flags split_by_time -hls_playlist_type event -g 90 -r 30 index.m3u8
答案1
除非您以某种方式手动强制关键帧节奏,否则如果不将帧通过编码器,就无法猜测输出关键帧的位置。
您可以通过删除-g
并添加来强制更精确的关键帧放置-force_key_frames expr:gte(t,n_forced*3)