使用FFMPEG创建HLS变体

问题描述 投票:3回答:2

我开始使用高分辨率视频文件,我想为移动流媒体创建3种变体,低质量,中等质量和高质量。我希望将这些中/低/高变体分割成m3u8文件指向的ts片段。有没有办法在ffmpeg中的一行中执行此操作?

我用ffmpeg成功生成了一个m3u8文件和ts段,我需要这样做3x并设置低/中/高的规格吗?如果是这样,我如何将单个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

ffmpeg hls m3u8
2个回答
9
投票

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

如果你想要,你可以在一个命令中完成它,因为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

0
投票
  • 宽高比不必相同,这没有任何意义。你怎么知道客户可以玩什么? 非HD的纵横比为4:3,HD变体的纵横比为16:9。
  • 如果需要段时间保持一致,则不希望在一个ffmpeg命令中执行所有变体。
  • 同时观看向下转码,如果你从1080转到360,可能会有问题。我经常得到的是音频降级和听起来很奇怪。如果我想要高质量的话,我试着下降不超过一半。
  • @DavidC十六进制是编解码器版本号。
© www.soinside.com 2019 - 2024. All rights reserved.