2015-10-19 91 views
2

我从一个高分辨率视频文件开始,我想创建3个变体,低质量,中等质量和高质量的移动流。我希望将这些中/低/高变体分割成m3u8文件将指出的那些文件。有没有办法在ffmpeg的一行中做到这一点?使用FFMPEG创建HLS变体

我已经用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

回答

7

是的,你需要编码所有的变体和第一生成播放媒体(含段的播放列表)。

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

您的答案和Apple HLS文档都不解释CODECS参数的含义。十六进制数字需要说明。没有这个,你的答案是不可用的。 – DavidC

+2

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

+0

如何计算“BANDWIDTH”值? (它不在输入中。)根据[规范](https://tools.ietf.org/html/rfc8216#section-4.3.4.2),它应该是流的峰值带宽。 – mjs

-1
  • 宽高比并不一定是相同的,这是没有意义的。 你怎么知道客户可以玩什么?

    对于非HD,长宽比为4:3,对于HD变型,长宽比为16:9。

  • 如果您的 需要段时间一致,则您不想在一个ffmpeg命令中执行所有变体。
  • 另外观察转码向下,如果你从1080到360,那么 可能是问题。我经常得到的是音频降级,并且听起来很奇怪。如果我想要高的质量,我会尝试下去不超过一半。
  • @DavidC十六进制是编解码器的版本号。