使用 FFMPEG 创建 HLS 变体
Posted
技术标签:
【中文标题】使用 FFMPEG 创建 HLS 变体【英文标题】:Creating HLS variants with FFMPEG 【发布时间】:2016-01-18 10:14:00 【问题描述】:我从一个高分辨率视频文件开始,我想为移动流媒体创建 3 个变体,低质量、中等质量和高质量。我希望将这些中/低/高变体分割成 m3u8 文件将指向的 ts 片段。有没有办法在ffmpeg的一行中做到这一点?
我已经成功地使用 ffmpeg 生成了一个 m3u8 文件和 ts 段,我需要这样做 3 倍并设置低/中/高规格吗?如果是这样,我如何让单个 m3u8 文件指向所有变体,而不是每个变体一个?
这是我用来生成 m3u8 文件和 ts 段的命令。
ffmpeg -i C:\Users\george\Desktop\video\hos.mp4 -strict -2 -acodec aac -vcodec libx264 -crf 25 C:\Users\user\Desktop\video\hos_Phone.m3u8
【问题讨论】:
【参考方案1】:是的,您需要先编码所有变体并生成媒体播放列表(包含片段的播放列表)。
如果您愿意,您可以在一个命令中完成,因为 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 CODECS 并不总是必需的。格式在RFC 6381 中解释,CODECS 用法在HLS draft 中指定。BANDWIDTH
值是如何计算的? (它不存在于输入中。)根据the spec,它应该是流的峰值带宽。
@mjs 这是生成的传输流的峰值比特率,包括 TS 开销。对于 VBR,您可以根据 PCR 增量计算它。您还可以执行受限 VBR 并使用 ffmpeg
显示的 muxing overhead
信息进行有根据的猜测。【参考方案2】:
纵横比不必相同,这是没有意义的。 你怎么知道客户端可以玩什么?
非高清版本的纵横比为 4:3,高清版本为 16:9。
如果您不想在一个 ffmpeg 命令中完成所有变体 需要分段时间保持一致。 还要看向下转码,如果你从1080转到360,那里 可能是问题。我经常得到的一个是音频降级并且 听起来怪怪的。我尽量下降不超过一半,如果我想要高 质量。 @DavidC 该十六进制是编解码器版本号。【讨论】:
以上是关于使用 FFMPEG 创建 HLS 变体的主要内容,如果未能解决你的问题,请参考以下文章