【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 系统资源使用情况

相关推荐
云上先途20 小时前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频
2601_9623807620 小时前
MoneyPrinterTurbo 本地部署与出片全流程:从环境配置到一键生成短视频
音视频
可乐鸡翅yeah_1 天前
HLS视频编码兼容性全解,H.264/H.265流媒体浏览器适配排错实战
音视频·firefox·safari·m3u8
FlightYe1 天前
音视频修炼之编码器(一):AVC、HEVC编码器内部
android·linux·c++·音视频
昨日之日20061 天前
AuK:多任务语音生成编辑,支持克隆、改词、换情绪与分离,内容编辑与增强全覆盖
人工智能·音视频
林澈在路上1 天前
能做DJ的AI写歌软件推荐:MELO音乐对比Suno v6
大数据·人工智能·github·音视频·音频
YWamy1 天前
政企项目 RTC SDK 评估思路:从技术指标到落地选型
音视频·实时音视频
安河桥。1 天前
座舱显示接口笔记:DP、eDP、无线投屏到底怎么分工?
嵌入式硬件·车载系统·音视频·视频
做萤石二次开发的哈哈1 天前
视频汇集平台模板上线萤石蓝海AIoT一站式工作台:多品牌摄像机+NVR统一接入,GB/T28181国标级联实现工程施工多方视频调度(附部署教程)
大数据·人工智能·物联网·音视频·萤石开放平台·蓝海aiot一站式工作台·aiot开发
Htojk1 天前
多路直播 + AI 实时翻译:一套「会翻译的直播墙」的工程复盘
音视频