使用 FFMPEG 创建 HLS 变体

Creating HLS variants with FFMPEG

我从一个高分辨率视频文件开始,我想为移动流媒体创建 3 个变体,低质量、中质量和高质量。我希望将这些 mid/low/high 变体分割成 ts 片段,m3u8 文件将指向这些片段。有没有办法在 ffmpeg 的一行中做到这一点?

我已经用 ffmpeg 成功生成了一个 m3u8 文件和 ts 片段,我需要做这个 3x 并为 low/mid/high 设置规范吗?如果是这样,我如何让单个 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

是的,您需要先对所有变体进行编码并生成媒体播放列表(包含片段的播放列表)。

如果您愿意,您可以在一条命令中完成,因为 ffmepg 支持 multiple inputs/outputs。例如:

ffmpeg -i input \
    ... [encoding parameters 1] ... output1 \
    ... [encoding parameters 2] ... output2 \
    ....[encoding parameters 3] ... output3

您必须提供多个 qualities/bitrates 变体,但纵横比应保持不变。保持宽高比最初是强制性的,但在最新的 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
  • Aspect ratio 不必相同,那没有意义。 你怎么知道客户端可以玩什么?

    非高清版本的宽高比为 4:3,高清版本的宽高比为 16:9。

  • 如果你不想在一个 ffmpeg 命令中完成所有变体 需要分段时间一致。
  • 还要看向下转码,如果从1080转为360,有 可能是问题。我经常遇到的一个问题是音频降级并且 听起来怪怪的。如果我想要高,我会尝试下降不超过一半 质量。
  • @DavidC 十六进制是编解码器版本号。