【FFmpeg从入门到精通】第四章-FFmpeg转码
1 FFmpeg 软编码H.264与H.265
当前网络中常见的视频编码格式要数H.264最为火热,支持H.264的封装格式有很多,如FLV、MP4、HLS(M3U8)、MKV、TS等格式;FFmpeg本身并不支持H.264的编码器,而是由FFmpeg的第三方模块对其进行支持,例如x264和OpenH264,二者各有各的优势。由于OpenH264开源比较晚,所以x264还是当前最常用的编码器,这里将重点介绍FFmpeg 中x264的使用;使用x264进行H.264编码时,所支持的像素格式主要包含yuv420p、yuvj420p、yuv422p、yuvj422p、yuv444p、yuvj444p、nv12、nv16、nv21.通过ffmpeg -h encoder=libx264可以查看到:
ffmpeg -h encoder=libx264
1.1 x264 编码参数简介
参数 | 类型 | 说明 |
---|---|---|
preset | 字符串 | 编码器预设参数 |
tune | 字符串 | 调优编码参数 |
profile | 字符串 | 编码 profile 档级设置 |
level | 字符串 | 编码 level 层级设置 |
wpredp | 字符串 | P 帧预测设置 |
x264opts | 字符串 | 设置 x264 专有参数 |
crf | 浮点数 | 选择质量恒定质量模式 |
crf_max | 浮点数 | 选择质量恒定质量模式最大值 |
qp | 整数 | 恒定量化参数控制 |
psy | 浮点数 | 只用 psychovisual 优化 |
rc-lookahead | 整数 | 设置预读帧设置 |
weightb | 浮点数 | B 帧预测设置 |
weightp | 整数 | 设置预测分析方法:none、simple、smart 三种模式 |
ssim | 布尔 | 计算打印 SSIM 状态 |
intra-refresh | 布尔 | 定时刷 I 帧以替代 IDR 帧 |
blu-ray-compat | 布尔 | 蓝光兼容参数 |
b-bias | 整数 | B 帧使用频率设置 |
mixed-refs | 布尔 | 每个 partition 一个参考,而不是每个宏块一个参考 |
8x8dct | 布尔 | 8 × 8 矩阵变换,用在 high profile |
aud | 布尔 | 带 AUD 分隔标识 |
mbtree | 布尔 | 宏块树频率控制 |
deblock | 字符串 | 环路滤波参数 |
cplxtblur | 浮点数 | 减少波动 QP 参数 |
partitions | 字符串 | 逗号分隔的 partition 列表,可以包含的值有 p8×8、p4×4、b8×8、i8×8、i4×4、none、all |
direct-pred | 整数 | 运动向量预测模式 |
slice-max-size | 整数 | Slice 的最大值 |
nal-hrd | 整数 | HRD 信号信息设置:None、VBR、CBR 设置 |
motion-est | 整数 | 运动估计方法 |
forced-idr | 布尔 | 强行设置关键帧为 IDR 帧 |
coder | 整数 | 编码器类型包括 default、cavlc、cabac、vlc、ac |
b_strategy | 整数 | I/P/B 帧选择策略 |
chromaoffset | 整数 | QP 色度和亮度之间的差异参数 |
sc_threshold | 整数 | 场景切换阈值参数 |
noise_reduction | 整数 | 降噪处理参数 |
x264-params | 字符串 | 与 x264opts 操作相同 |
1.2 H.264 编码举例
1 编码器预设参数设置preset
从 FFmpeg的 x264参考说明中可以看到,可以使用x264 --full help查看 preset设置的详细说明,找到x264帮助信息中的preset参数项之后,可以看到其包含了以下几种预设参数,预设参数的详细设置具体如下
ultrafast:最快的编码方式
除了默认设置之外,还增加了如下参数设置:
--no-8x8dct --aq-mode 0 --b-adapt 0 --bframes 0 --no-cabac --no-deblock --no-mbtree --me dia --no-mixed-refs --partitions none --rc-lookahead 0 --ref 1 --scenecut 0 --subme 0 --trellis 0 --no-weightb --weightp 0
superfast:超级快速的编码方式
除了默认设置之外,还增加了如下参数设置:
--no-mbtree --me dia --no-mixed-refs --partitions i8x8,i4x4 --rc-lookahead 0 --ref 1 --subme 1 --trellis 0 --weightp 1
veryfast:非常快速的编码方式
除了默认设置之外,还增加了如下参数设置:
--no-mixed-refs --rc-lookahead 10 --ref 1 --subme 2 --trellis 0 --weightp 1
faster:稍微快速的编码方式
除了默认设置之外,还增加了如下参数设置:
--no-mixed-refs --rc-lookahead 20 --ref 2 --subme 4 --weightp 1
fast:快速的编码方式
除了默认设置之外,还增加了如下参数设置:
--rc-lookahead 30 --ref 2 --subme 6 --weightp l
medium:折中的编码方式
全部为默认参数
slow:慢的编码方式
除了默认设置之外,还增加了如下参数设置:
--b-adapt 2 --direct auto --me umh --rc-lookahead 50 --ref 5 --subme 8
slower:更慢的编码方式
除了默认设置之外,还增加了如下参数设置:
--b-adapt 2 --direct auto --me umh --partitions all --rc-lookahead 60 --ref 8 --subme 9 --trellis 2
veryslow:非常慢的编码方式
除了默认设置之外,还增加了如下参数设置:
--b-adapt 2 --bframes 8 --direct auto -me umh --merange 24 --partitions all --ref 16 --subme 10 --trellis 2 --rc-lookahead 60
placebo:最慢的编码方式
除了默认设置之外,还增加了如下参数设置:
--bframes 16 --b-adapt 2 --direct auto --slow-firstpass --no-fast-pskip --me tesa --merange 24 --partitions all --rc-lookahead 60 --ref 16 --subme 11 --trellis 2
随着所设置参数的不同,所编码出来的清晰度也会有所不同,设置相关的预设参数之后,有很多参数也会被设置所影响,因此需要了解相关的参数含义。为了方便操作,通过preset进行设置即可,下面就来看一下相同的机器中,设置ultrafast与设置medium 预设参数之后转码效率的对比:
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4
从命令行执行后的输出内容中可以看到,转码的预设参数为ultrafast模式,转码的速度为12.1倍速,接下来再看一下设置为medium 模式后的速度:
ffmpeg -i input.mp4 -vcodec libx264 -preset medium -b:v 2000k output.mp4
而在画质上medium要更胜一筹。
2 H.264编码优化参数tune
使用 tune 参数调优 H.264编码时,可以包含如下几个场景:film、animation、grain、stillimage、psnr、ssim、fastdecode、zerolatency;这几种场景所使用的 x264 参数也各有不同具体如下
2 FFmpeg 硬编解码
当使用FFmpeg进行软编码时,常见的基于CPU进行H.264或H.265编码其相对成本会比较高,CPU编码时的性能也很低,所以出于编码效率及成本考虑,很多时候都会考虑采用硬编码,常见的硬编码包含NvidiaGPU与IntelOSV两种,还有常见的嵌人式平台,如树莓派、瑞芯微等,本节将重点介绍常见的Nvidia与Intel硬编码,以及树莓派的硬编码。
2.1 Nvidia GPU 硬编解码
2.2 Intel QSV 硬编码
2.3 树莓派硬编码
2.4 OSX系统硬编解码
3 FFmpeg 输出MP3
日常生活中听音乐时大多数为MP3音乐,使用FFmpeg可以解码 MP3,同样FFmpeg也可以支持 MP3编码,FFmpeg 使用第三方库 libmp3lame 即可编码 MP3 格式。不但如此MP3编码还是低延迟的编码,可以支持的采样率比较多,包含44100、48000、3200022050、24 000、16000、11025、12000、8000多种采样率,采样格式也比较多,包含s32p(signed 32 bits, planar)、fltp(float, planar)、sl6p(signed 16 bits, planar)多种格式.声道布局方式支持包含mono(单声道模式)、stereo(环绕立体声模式),下面就来详细介绍MP3编码参数。
3.1 MP3 编码参数介绍
3.2 MP3的编码质量设置
3.3 平均码率编码参数 ABR
4 FFmpeg 输出 AAC
在音视频流中,无论直播与点播,AAC都是目前最常用的一种音频编码格式,例如RTMP直播、HLS直播、RTSP直播、FLV直播、FLV点播、MP4点播等文件中都是常见的 AAC 音视频。
与MP3相比,AAC是一种编码效率更高、编码音质更好的音频编码格式,常见的使
用AAC编码后的文件存储格式为m4a,如在iPhone或者iPad中即为m4a。FFmpeg可以
支持AAC的三种编码器具体如下。
- aac:FFmpeg本身的AAC编码实现
- libfaac:第三方的AAC编码器
- libfdk aac:第三方的AAC编码器
后两种编码器为非GPL协议,所以使用起来需要注意,在预编译时需要注意采用nonfree的支持,这点在前面章节中已有相关介绍。下面就来详细介绍三种编码器的使用方法。