将视频转化成自适应码率推流可以使用的视频
将视频转化成DASH可以使用的视频的过程包括:
- 将原始视频使用
ffmpeg
编码成不同分辨率和码率版本的视频 - 使用
Bento4
将编码好的视频切片
FFmpeg命令
官网文档:https://ffmpeg.org/ffmpeg.html
ffmpeg -y -i RatherBe.mp4 -c:a aac -ac 2 -ab 128k -c:v libx264 -x264opts 'keyint=24:min-keyint=24:no-scenecut' -b:v 1500k -maxrate 1500k -bufsize 1000k -vf "scale=-2:480" RatherBe_852x480_1500k.mp4
参数解释
使用的原始视频命名为RatherBe.mp4
,编码后视频命名为RatherBe_852x480_1500k.mp4
。
-
-y
:覆盖输出文件; -
-i filename
:输入文件; -
-c a aac
:-c[:stream_specifier] codec (input/output,per-stream)
,设定声音编码 。AAC(Advanced Audio Coding),中文名:高级音频编码,出现于1997年,基于MPEG-2的音频编码技术。 -
-ac <数值>
: 设定声道数,1就是单声道,2就是立体声 ; -
-ab <比特率>
:设定声音比特率; -
-c:v libx264
: -
-x264opts
:ffmpeg调用libx264编码高级选项,修改参数值。 -
keyint
:默认250,设置x264输出中最大的IDR帧(亦称关键帧)间距。
IDR帧是视频流的“分隔符”,所有帧都不可以使用越过关键帧的帧作为参考帧。IDR帧是I帧的一种,所以它们也不参照其它帧。这意味着它们可以作为视频的搜索(seek)点。
通过这个设置可以设置IDR帧的最大间隔帧数(亦称最大图像组长度)。较大的值将导致IDR帧减少(会用占用空间更少的P帧和B帧取代),也就同时减弱了参照帧选择的限制。较小的值导致减少搜索一个随机帧所需的平均时间。
建议:默认值(fps的10倍)对大多数视频都很好。如果在为蓝光、广播、直播流或者其它什么专业流编码,也许会需要更小的图像组长度(一般等于fps)。
注意:keyint值的设定关系到视频切分后每个chunk的时长,在这里视频25帧/s。如果keyint设置成100,则后面生成的chunk时长为4s。这里设置成了24,那么后面生成的chunk时长是960ms
-
min-keyint
:默认auto(keyint/10),过小的keyint范围会导致产生“错误的”IDR帧(比如说,一个闪屏场景)。此选项限制了IDR帧之间的最小距离。
建议默认,或者与fps相等 -
no-scenecut
:完全关闭自适应I帧决策。 -
scenecut
:默认40,设置决策使用I帧、IDR帧的阈值(场景变换检测)。
x264会计算每一帧与前一帧的不同程度并得出一个值。如果这个值低于scenecut,那么就算检测到一个“场景变换”。如果此时距离上一帧的距离小于 min-keyint则插入一个I帧,反之则插入一个IDR帧。较高的值会增加侦测到“场景变换”纪律。http://forum.doom9.org/showthread.php?t=121116。设置scenecut=0与no-scenecut等效; -
-b <比特率>
: 指定压缩比特率; -
-maxrate bitrate
:设置最大视频码率容忍度; -
-bufsize size
:设置码率控制缓冲区大小; -
-vf filter_graph
: set video filters ;Simple filtergraphs are configured with the per-stream -filter option (with-vf
and-af
aliases for video and audio respectively). -
"scale=852:480"
:Scale (resize) the input video。如果只想制定长或宽中的一项,可写成“scale=-1:300”
。
注意:视频的长和宽必须可以被2整除,否则会报错,可以写成
"scale=-2:300"
解决。
Bento4命令
官网指南:https://www.bento4.com/developers/dash/
1. mp4fragment命令
先使用mp4fragment工具,原因如下。
mp4fragment
: creates a fragmented MP4 file from a non-fragmented one.
When working with mp4 and MSE, it helps to know that the mp4 files should be structured so that metadata is fragmented across pieces of the container, and across the actual audio/video streams being fragmented, instead of clustered together.
To create DASH MP4 content, you need to start with fragmented MP4 files. The input files you will be working with may or may not already be in fragmented MP4 form. Ideally, your encode will already produce MP4 files that way.
The command line tool mp4info can tell you if an MP4 file is fragmented or not: here’s an example of what you will see in the Movie: part of the mp4info output for a non-fragmented MP4 file (the line fragments: no)
如果不先使用该命令,后面切分时会报错。
mp4fragment RatherBe_212x120_400k.mp4 RatherBe_212x120_400k_f.mp4
参数解释
原始视频命名RatherBe_212x120_400k.mp4
,处理后文件命名RatherBe_212x120_400k_f.mp4
。
2. mp4dash命令
mp4dash RatherBe_212x120_400k_f.mp4 RatherBe_426x240_800k_f.mp4 RatherBe_852x480_1500k_f.mp4
参数解释
三个待切分的不同版本视频名分别为:
- RatherBe_212x120_400k_f.mp4
- RatherBe_426x240_800k_f.mp4
- RatherBe_852x480_1500k_f.mp4
使用mp4dash命令处理这三个文件后,会在路径下生成/output
文件夹,里面包含切分好的视频文件。
注意:运行Bento4命令时需要在python2.x环境下,如果系统默认python环境是3.x,会报奇怪的错误。
可以安装anaconda工具,方便在不同的python版本间切换。安装anaconda后,可以通过命令python --version
查看当前python环境,通过命令conda info --envs
查看所有python环境,然后使用命令source activate python27
切换到python2.x版本。