ffmpeg HLS 播放列表没有从头开始

Col*_*len 6 ffmpeg streaming hls

我正在尝试拍摄 5 分钟的视频文件并生成单文件HTTP Live Stream 播放列表和.ts文件。从 iOS 5 开始,播放列表文件格式可以支持字节范围而不是单独的文件,这是我的用例的一个很好的目标。但是,当我运行我的ffmpeg命令时,结果.m3u8播放列表中的第一个条目不会从(甚至接近)字节 0 开始。

例如:

ffmpeg -i input -hls_flags single_file out.m3u8
Run Code Online (Sandbox Code Playgroud)

产生这样的播放列表:

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:11
#EXT-X-MEDIA-SEQUENCE:63
#EXTINF:1.376367,
#EXT-X-BYTERANGE:568324@63107840
out.ts
#EXTINF:1.334667,
#EXT-X-BYTERANGE:235564@63676164
out.ts
#EXTINF:1.918589,
#EXT-X-BYTERANGE:343288@63911728
out.ts
#EXTINF:10.427078,
#EXT-X-BYTERANGE:3311996@64255016
out.ts
#EXTINF:5.672333,
#EXT-X-BYTERANGE:52828@67567012
out.ts
#EXT-X-ENDLIST
Run Code Online (Sandbox Code Playgroud)

请注意,第一个EXT-X-BYTERANGE条目不是@0——它在 68 MB.ts文件中大约有 63 MB 。实际上,当将播放列表加载到<video>标签中并使用 Safari 打开 HTML 时,视频播放从输入视频的结尾开始大约 20 秒,而不是从 0 开始,并且无法更早地进行清理。

为什么ffmpeg制作了不包含所有视频的播放列表?当我观看.ts播放列表旁边生成的文件时,所有视频内容都存在。

我在 Linux 下最近的ffmpeg静态构建以及ffmpegOS X 下的 Homebrew 构建的2.7.1版本中看到了这一点。

Col*_*len 7

再次阅读HLS文档 ,我终于注意到了这个选项:

hls_list_size size

设置播放列表条目的最大数量。如果设置为 0,列表文件将包含所有段。默认值为 5。

果然,在我最初的问题中,EXT-X-BYTERANGE视频末尾有 5个条目,与声明的默认值一致。设置hls_list_size0所指示做实际上确保在开始视频开始,并包括所有预期的字节范围。