使用FFMPEG创建HLS变体

use*_*463 4 ffmpeg http-live-streaming m3u8

我开始使用高分辨率视频文件,我想为移动流媒体创建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

aer*_*tal 9

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

如果您愿意,可以在一个命令中执行此操作,因为它ffmepg支持多个输入/输出.例如:

ffmpeg -i input \
    ... [encoding parameters 1] ... output1 \
    ... [encoding parameters 2] ... output2 \
    ....[encoding parameters 3] ... output3
Run Code Online (Sandbox Code Playgroud)

您必须提供多种质量/比特率的变体,但纵横比应保持不变.保持纵横比最初是强制性的,但在最新的HLS创作指南中,它被降级为推荐值.

所有变体流必须是关键帧对齐的,因此使用-g选项设置GOP大小,禁用场景剪切检测并使用段持续时间hls_time,该持续时间是关键帧间隔的倍数.

获得所有3x m3u8媒体播放列表后,您可以手动创建指向每个媒体播放列表的主播放列表.

Apple HLS文档中的示例,您必须根据自己的编码选项更改带宽,编解码器,分辨率和播放列表文件名:

#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
Run Code Online (Sandbox Code Playgroud)

  • @DavidC CODECS并不总是必需的.格式在[RFC 6381](https://tools.ietf.org/html/rfc6381)中解释,CODECS用法在[HLS草案]中指定(https://tools.ietf.org/html/draft-潘托斯 - HTTP的实时流媒体-19). (3认同)