在本文中,我们将学习使用FFmpeg进行HLS打包。使用FFmpeg的好处在于:你可以在不离开命令行的情况下,执行提取视频、调整视频尺寸、转码、打包以及传输视频的所有操作。
我们首先看一下为VOD(点播)创建HLS打包的所有步骤,然后再来了解HLS实时流的打包。
使用FFmpeg进行HLS打包的基础步骤
好,现在让我们看下使用HLS打包点播文件的基础步骤:
-
从磁盘读取输入视频
-
将视频缩放/调整(scale/resize)为所需的多种分辨率版本
-
将每个缩放后的视频转码到所需码率
-
将音频转码到所需码率
-
将视频与音频组合,然后打包每一个音、视频组合,再创建各TS视频切片和播放列表(playlist)
-
创建一个主播放列表(master playlist),用于指向每个变体(variant)
现在,让我们一步一步来解决。
FFmpeg将视频调整为多种分辨率版本
第一步和第二步包括从磁盘中读取视频,然后将其调整为多种分辨率。上述操作仅需一个命令,如下所示:
ffmpeg -i brooklynsfinest_clip_1080p.mp4 \
-filter_complex \
"[0:v]split=3[v1][v2][v3];\
[v1]copy[v1out];\
[v2]scale=w=1280:h=720[v2out];\
[v3]scale=w=640:h=360[v3out]"
[0:v]指输入文件的第一个视频流。在我们的例子中,只有一个视频流,它被分成3个输出[v1]、[v2]、[v3]。它们每一个都作为FFmpeg缩放函数的输入,该缩放函数接受一个高度和宽度数值用于执行缩放。
这里,我们将输入视频调整为1080p、720p和360p。
这里的[v1out]、[v2out]、[v3out]是包含缩放过程的输出变量。注意,这里我们假设缩放过程会保留长宽比(aspect ratio)。当然,你可以在必要时使用letterboxing来处理。
审校者注:letterboxing是指将以宽银幕比例拍摄的电影转换到标准宽度的视频格式时,同时保留电影的原始宽高比,由此产生的视频图像上下都有黑条的这个过程;这些黑条是图像的一部分(即视频信号的每一帧)。LTBX是其缩写,标识如此格式化的电影和图像。这个术语来自于信箱的形状,信箱是墙壁或门上的一个槽,邮件通过它来传递,它是长方形的,宽于它的高度。下图是一个 2.35:1比例的 widescreen 图像经过letterboxing 处理之后,放在 1.33:1 屏幕上的一个例子。如下:
除此之外,还有pillarboxing和windowboxing等常见转换模式。
将视频转码为多种码率用于HLS打包
接着,我们进入第三步和第四步:我们必须将视频转码为多种码率,正如ABR技术常做的那样。
记住,我们已经将视频调整为所需的分辨率并存储进 [v1out]、[v2out]和[v3out]的输出。我们将直接使用它们作为转码步骤的输入。
-map [v1out] -c:v:0 libx264 -x264-params "nal-hrd=cbr:force-cfr=1" -b:v:0 5M -maxrate:v:0 5M -minrate:v:0 5M -bufsize:v:0 10M