是的,你需要编码所有的变体和第一生成播放媒体(含段的播放列表)。
如果你想让你可以在一个命令中完成,因为ffmepg
支持multiple inputs/outputs。例如:
ffmpeg -i input \
... [encoding parameters 1] ... output1 \
... [encoding parameters 2] ... output2 \
....[encoding parameters 3] ... output3
您必须提供多种质量/比特率的变体,但纵横比应保持相同。保持宽高比最初是强制性的,但在最新的HLS创作指南中将其降级为推荐。
所有变体流必须是关键帧对齐的,因此使用-g
选项设置GOP大小,禁用场景切换检测并使用片段时间段hls_time
,该时间段是您的关键帧间隔的倍数。
一旦您拥有了所有3x m3u8
媒体播放列表,您就可以手动创建指向每个媒体播放列表的主播放列表。从Apple HLS documentation
例如,你必须根据自己的编码选项更改带宽,编解码器,分辨率和播放列表文件名:
#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2855600,CODECS="avc1.4d001f,mp4a.40.2",RESOLUTION=960x540
medium.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=5605600,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1280x720
high.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1755600,CODECS="avc1.42001f,mp4a.40.2",RESOLUTION=640x360
low.m3u8
您的答案和Apple HLS文档都不解释CODECS参数的含义。十六进制数字需要说明。没有这个,你的答案是不可用的。 – DavidC
@DavidC CODECS并不总是必需的。格式在[RFC 6381](https://tools.ietf.org/html/rfc6381)中进行了解释,CODECS的用法在[HLS草案](https://tools.ietf.org/html/draft-潘托斯 - HTTP的实时流媒体-19)。 – aergistal
如何计算“BANDWIDTH”值? (它不在输入中。)根据[规范](https://tools.ietf.org/html/rfc8216#section-4.3.4.2),它应该是流的峰值带宽。 – mjs