我开始使用高分辨率视频文件,我想为移动流媒体创建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
是的,您需要对所有变体进行编码并首先生成媒体播放列表(包含片段的播放列表)。
如果你想要,你可以在一个命令中完成它,因为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