【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可以查看到:

bash 复制代码
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:最快的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--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:超级快速的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--no-mbtree --me dia --no-mixed-refs --partitions i8x8,i4x4 --rc-lookahead 0 --ref 1 --subme 1 --trellis 0 --weightp 1

veryfast:非常快速的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--no-mixed-refs --rc-lookahead 10 --ref 1 --subme 2 --trellis 0 --weightp 1

faster:稍微快速的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--no-mixed-refs --rc-lookahead 20 --ref 2 --subme 4 --weightp 1

fast:快速的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--rc-lookahead 30 --ref 2 --subme 6 --weightp l

medium:折中的编码方式

全部为默认参数

slow:慢的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--b-adapt 2 --direct auto --me umh --rc-lookahead 50 --ref 5 --subme 8

slower:更慢的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--b-adapt 2 --direct auto --me umh --partitions all --rc-lookahead 60 --ref 8 --subme 9 --trellis 2

veryslow:非常慢的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--b-adapt 2 --bframes 8 --direct auto -me umh --merange 24 --partitions all --ref 16 --subme 10 --trellis 2 --rc-lookahead 60

placebo:最慢的编码方式

除了默认设置之外,还增加了如下参数设置:

bash 复制代码
--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 预设参数之后转码效率的对比:

bash 复制代码
ffmpeg -i input.mp4 -vcodec libx264 -preset ultrafast -b:v 2000k output.mp4

从命令行执行后的输出内容中可以看到,转码的预设参数为ultrafast模式,转码的速度为12.1倍速,接下来再看一下设置为medium 模式后的速度:

bash 复制代码
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的支持,这点在前面章节中已有相关介绍。下面就来详细介绍三种编码器的使用方法。

4.1 FFmpeg 中的 AAC 编码器使用

4.2 FDK AAC 第三方的AAC编解码 Codec 库

4.3 高质量AAC设置

4.4 AAC 音频质量对比

5 系统资源使用情况

相关推荐
路溪非溪6 小时前
关于ffmpeg的简介和使用总结
ffmpeg
gushansanren6 小时前
基于WSL用MSVC编译ffmpeg7.1
windows·ffmpeg
科技小E6 小时前
WebRTC实时音视频通话技术EasyRTC嵌入式音视频通信SDK,助力智慧物流打造实时高效的物流管理体系
人工智能·音视频
Icoolkj10 小时前
可灵 AI:开启 AI 视频创作新时代
人工智能·音视频
SuperW20 小时前
视频编码原理讲解一:VCL层和NAL层的讲解
音视频
Panesle1 天前
HunyuanCustom:文生视频框架论文速读
人工智能·算法·音视频·文生视频
程序员JerrySUN1 天前
驱动开发硬核特训 · Day 30(下篇): 深入解析 lm48100q I2C 音频编解码器驱动模型(基于 i.MX8MP)
linux·驱动开发·架构·音视频
读心悦2 天前
5000字总结 HTML5 中的音频和视频,关羽标签、属性、API 和最佳实践
前端·音视频·html5
东风西巷2 天前
BLURRR剪辑软件免费版:创意剪辑,轻松上手,打造个性视频
android·智能手机·音视频·生活·软件需求
weixin_446260852 天前
视觉革命来袭!ComfyUI-LTXVideo 让视频创作更高效
人工智能·音视频