FFmpeg 是一个强大的命令行音视频工具,可以承担转码、混流、嵌挂字幕、剪辑等工作。
![图片[1]-FFmpeg常见实用命令-小七笔记](https://www.snswm.com/wp-content/uploads/2024/07/d2b5ca33bd20240711105124.png)
安装
本小节的内容以 Windows 用户为例。
前往 FFmpeg 官网建议的 Windows 版本的已编译文件 (gyan.dev) 进行下载,或者在 FFmpeg 官网下载页 选择其他编译版本。
安装后打开cmd,检查是否能从命令行正常启动。打开 PowerShell,输入:ffmpeg
来查看返回的版本号是否与你下载的一致。
基本视频概念
在介绍 FFmpeg 的工作命令之前,我们首先对视频文件内部的一些概念做一个通俗的说明。
- 流(stream):通常的视频文件中最易见的是视频流与音频流两个流。部分视频文件(多为 mkv 文件)还有字幕流,即内挂字幕。注意,有的视频将字幕嵌入到了视频流中(内嵌字幕),这类视频没有字幕流,也无法提取出字幕文件。至于数据流,本文不作介绍。
- 码率/比特率(bitrate):衡量流的数据量的标准。高码率的视频、音频携带了比低码率更多的数据,在压制时(允许的)损失较小,因此它们的质量一般更高。例如,128 kbps 的 MP3 音频的听感效果一般比 64 kbps 的好。
- 分流/混流(mux/demux):将多个流从一个视频文件中对应地抽取出来,称为分流。反之,将多个流整理后写入某个文件,称为混流。
- 容器(container):可以粗略地理解为某种扩展名类型的视频文件。比如 MP4 是一种容器,MKV 是另一种容器。
- 编码/解码(encode/decode):将流用某种格式或规范记录下来并存储,称为编码;将编码后的流,根据格式或规范来逆向实现编码的过程,从而将流还原出来,称为解码。我们最经常听到的规范大概是 H.264,最常见到的编码器可能是 libx264。
色深与色度采样
在很长的一段时间内,8 bit 色深、4:2:0 色度采样是最常见的视频像素格式。
- 色深位(bit):该概念与图片中颜色分级的位概念一致。在很长一段时间内,最广泛使用的颜色分级会把纯黑到纯白的灰阶分成 256 级,因此叫 8 位(因为 28=256)色深。8 bit 的视频也是最广为使用的。我们预期 10 bit 将继任;但目前 10 bit(甚至更高)色深主要在录制设备上应用,而在播放设备(显示屏等)上的普及尚远。
- 色度采样(chroma sampling):视频在录制或编码时,我们常逐个记录像素的明度、而采样式地(非逐个)记录像素的色度,以此减小视频大小。这种方式称为 YCrCb,其中 Y 表示明度,Cr 与 Cb 用于记录色度(红色与蓝色的偏移量)。色度采样方式常常使用 x:y:z 的方式来表示,如 4:2:0。这种记法表示在 4 个像素宽、2像素高的区域中,每行对 x 个像素进行亮度采样。x 通常是 4,也就是全像素亮度记录。而 y 与 z 分别代表第一行与第二行的采样数。例如,4:2:2 表示在两行中均只对 2 个像素采样色度(剩余像素的色度由采样速度推断),因此实际只使用了这 8 个像素中 4 个像素的色度信息,即丢失了 50% 的色度。同理,4:2:0 在第一行对 2 像素色度采样、不在第二行色度采样,因此丢失了 75% 的色度信息。最后,4:4:4 表示对全像素记录色度。
在 FFmpeg 中,可以使用 ffmpg -pix_fmts
来查看 FFmpeg 支持的所有像素格式。
常用的编码格式
FFmpeg 支持基本所有的主流编码格式。
常用的视频编码格式有:
- H.264 是上一代最广为使用的视频编码格式,始于 2003 年,当之无愧的一代霸主。在 FFmpeg 中可由
libx264
编码器支持。 - H.265 (或称 HEVC) 是 H.264 的接任者,于 2013 年正式面世。它在同等视频质量下提供了相比 H.264 而言可达 50% 的体积缩减。
libx265
编码器对该编码格式提供了支持。 - VP9 经历了从 VP3 起漫长的版本迭代,VP 系列解码器的开发公司 On2 被谷歌收购。谷歌在 2013 年左右推出了取代上一代 VP8 编码的 VP9,主要为旗下的互联网视频平台 Youtube 所采用。
- AV1 (AOMedia Video 1) 是 H.265 的免版税竞争者,极大地基于 VP9 的技术,并在 VP9 的基础上提供了惊人的压缩比率。其开发联盟由诸多互联网公司支持,并受到主流浏览器 Chrome 与 Firefox 的积极推动。它在 FFmpeg 中由
libaom-av1
编码器对该编码格式提供支持。
常用的音频编码格式有:
- MP3 时至今日仍最流行的有损编码格式。编码器
libmp3lame
。 - AAC 是 MP3 的接任者,常常作为视频容器 MKV 选用的音频格式,而其作为音频时的容器则通常是是 m4a。编码器有 FFmpeg 原生提供的、针对低码率音频(AAC LC)的
aac
编码器;此外,需要制作高质量 AAC 时(HE-AAC)可以使用libfdk_aac
编码器。 - AC3 杜比数字格式,编码器
ac3
(Dolby Digital) 或者eac3
(Dolby Digital Plus)。 - FLAC 是较常用的无损音频格式;FFmpeg 对其有原生的编码器
flac
支持。 - PCM 是 WAV 容器内包含的最常见音频编码格式。FFmpeg 默认使用
pcm_s16le
编码器来处理 PCM 输出。
码率选择:如何兼顾质量与文件体积?
- 表中码率的推荐值基于 H.264 编码。
- 表中推荐高帧率视频使用同规格低帧率 1.5 倍的码率,而 HDR 使用 SDR 1.25 倍的码率。
规格 | 帧率 | 推荐码率(SDR) | 推荐码率(HDR) |
---|---|---|---|
8K | 24~30 | 80 – 160 Mbps | 100 – 200 Mbps |
48~60 | 120 – 240 Mbps | 150 – 300 Mbps | |
4K (2160p) | 24~30 | 35 – 45 Mbps | 44 – 56 Mbps |
48~60 | 53 – 68 Mbps | 66 – 85 Mbps | |
2K (1440p) | 24~30 | 16 Mbps | 20 Mbps |
48~60 | 24 Mbps | 30 Mbps | |
1080p | 24~30 | 8 Mbps | 10 Mbps |
48~60 | 12 Mbps | 15 Mbps | |
720p | 24~30 | 5 Mbps | 6.5 Mbps |
48~60 | 7.5 Mbps | 9.5 Mbps |
Youtube 的音频码率推荐则为单声道 128 Kbps、环绕声 384 Kbps 以及 5.1 声道 512 Kbps.
FFmpeg 实用命令-格式转换
转码
比如将一个 FLV 文件转为 MP4 文件并重编码,FFmpeg 会自动寻找编解码器:
ffmpeg -i video.flv video.mp4
其中,在 -i
后指定输入文件的文件名,在所有命令的最后指定输出文件的文件名。 如果文件名带有空格,请用双引号将文件名包裹。 上述的 video.mp4
在 -i
参数之后,称为 输出参数 ;反之,在 -i
之前的称为 输入参数。
用户也可以显式地指定编码器,比如使用 h.264 视频编码器与 flac 音频编码器。
ffmpeg -i video.flv -c:v libx264 -c:a flac video.mkv
其中 -c
是 -codec
的简写。用 v
表示视频(video)编码器、 a
表示音频(audio)编码器。
流复制
格式转换还有一种快速的情形。如果两者的所有流都不改动且输出容器支持输入的所有流,那么可以直接向 -c
传递 copy
以进行流复制。这样省去了重新编码的时间,格式转换将十分迅速:
ffmpeg -i video.avi -c copy video.mp4
其中,-c
是 codec 的简称,表示所有流的编解码器。该命令表示所有流均不进行额外操作,直接复制到新容器中。
提取流(音频、字幕)
有时需要指定流来完成格式转换,比如将一个 MP4 视频文件转为 AAC 音频文件(此处实质上是直接提取):
ffmpeg -i video.mp4 -c:a copy audio.aac
此处的 -c:a
表示音频流;视频流 -c:v
与字幕流 -c:s
自然也类似。 注意:如果音频流与容器冲突时,你需要将 copy
改为正确的编解码器(或者删去 -c:a copy
来让 FFmpeg 自动选择),以执行重编码。
也可以在提取流的时候进行转码:
ffmpeg -i video.mkv -c:a libmp3lame -q:a 2 audio.mp3
对于内挂了字幕的视频文件,也可以将其字幕单独提取出来,例如:
ffmpeg -i video.mkv -c:s copy subtitle.srt
截取视频
视频文件的截取可以分为截取视频与截取图片两种。
截取帧为图片
下例利用 select 过滤器,抽取了视频中的第 105 帧,保存为 extract.png:
实际上,帧序号是从 0 开始的,因此参数 select=eq(n\,105)
实际选取的是第 106 帧。但为了避免叙述上的繁琐与混乱,本文并未忠于这一细节。对于确实需要精确到某一帧的读者,请特别注意这一点。
如果不需要特别精确,也可以将帧序号转换为时间戳来截取:
# 假如该视频每秒 30 帧
ffmpeg -ss 00:00:03.50 -i video.mp4 -vframes 1 extract.png
上例中的两个命令,对同一个每秒 30 帧的视频的帧截取结果是等同的。但是,如果时间戳的小数不能除近,则很难准确地选中想要的帧。因此,还是更推荐使用 select 过滤器配合帧序号的方法。
截取视频片段
下面,以想要截取 video.mp4 视频的第2到第5分钟为例。
对于容易计算片段秒数的截取任务(本例中片段长为 (5-2)*60=180秒),可以使用 -t
参数,即指定片段长度。
ffmpeg -ss 00:02:00 -i video.mp4 -t 180 cut.mp4
其中, -ss
参数指定了起始的时间戳记,而 -t
参数指定了片段长度(秒)。传递给 -t
的片段长度可以写成 00:03:00
的形式。它也可以带有小数,比如用 180.5 表示 180.5 秒。
或者,用户可以不用 -t
指定片段长度,而是用 -to
指定终止时刻。下例中把参数 -ss
与 -to
都放在了 -i
参数之前:
ffmpeg -ss 00:02:00 -to 00:05:00 -i video.mp4 cut.mp4
需要注意,在上面的例子中, 参数 -ss
均被放在了 -i
参数之前,这称为输入(inputing)参数语法;对应的时间戳检索方式称为输入检索(inputing seek)。如果放在 -i
参数之后,则称为输出(outputing)参数与输出检索。
分辨率改变:缩放与裁切
分辨率缩放
分辨率缩放也是一个常见的需求,这需要使用到 FFmpeg 提供的视频过滤器(或称视频滤镜,video filter),也即 -vf
参数。
例如,我们要将一个高分辨率视频从 1440p 缩放,那么我们可以使用参数:
# 输出到1280x720的例子
## 直接指定宽1280、高720。选择以下任意一种写法即可
scale=w=1280:h=720
scale=1280:720
scale=1280x720
## 可以用-1表示按原视频宽高比自动计算
scale=1280:-1
scale=-1:720
## 也可以使用倍率的写法,用iw、ih代表输入视频的宽和高
scale=iw/2:ih/2
# 输出到方形720x720的例子。
## 可以用ow、oh代表变换后输出视频的宽和高
scale=iw/2:ow
这些参数中,使用冒号作为分隔符、等号作为键值对的连接符。
在降分辨率时使用 Lanczos 或 spline,在升分辨率时使用 bicubic 或 Lanczos 。
一些分辨率缩放的命令示例:
# 使用默认的 bicubic 算法缩放到高720并保持原宽高比,并用默认编码格式(H.264)编码
ffmpeg -i video.mp4 -vf scale=-1:720 out.mp4
# 指定使用 Lanczos 算法缩放到原视频的宽高的各一半,并用 H.265 格式以默认质量编码
ffmpeg -i video.mp4 -vf scale=iw/2:ih/2:flags=lanczos -c:v libx265 -c:a copy out.mp4
裁切
裁切同样使用视频过滤器完成,使用 crop
字段:
# 从原视频距左上角横20、竖30的位置,向右下角裁切一个宽100、高200的矩形
crop=w=100:h=200:x=20:y=30
crop=100:200:20:30
# 在视频的正中央进行裁切
crop=100:200
# 也可以使用倍率的写法,用iw、ih代表输入视频的宽和高
## 裁切视频的中间 3/5 宽度画面
crop=3/5*iw:ih:iw/5:0
例子:
# 裁切 1/6 到 5/6 宽的画面范围,并用 x265 编码器以 CRF 30 的质量来编码
ffmpeg -i video.mp4 -c:v libx265 -crf 30 -vf "scale=2/3*iw:ih:iw/6:0" -c:a copy out.mp4
FFmpeg 还支持一种自动检测裁切区域的参数 cropdetect
,常用于四周有黑色边框的情形:
# 自动检测黑色边框来裁切
ffmpeg -i video.mp4 -vf "cropdetect" -c:a copy out.mp4
设置视频预览图
在为视频文件设置预览图(缩略图)之前,我们首先要准备这样一张图片。FFmpeg 支持用 thumbnail 过滤器自动从视频中抽取一张预览图。它会从头到尾以 thumbnail=n
中的 n (默认为 100)数量的帧为扫描步长来抽取预览图。
# 自动选取 1 张预览图,按宽边为 1080 缩放分辨率,然后保存到文件
ffmpeg -i clip.mp4 -vf thumbnail,scale=-1:1080 -vframes 1 thumb.png
# 以 30 帧为扫描步长,从视频中自动选取 3 张预览图以供挑选(并在保存时进行三位数编号)
ffmpeg -i clip.mp4 -vf thumbnail=30,scale=-1:1080 -vframes 3 thumb-%03d.pngs
或者,利用在 截取帧为图片 一节中提到的帧截取方法,指定截取某一帧作为图片:
# 指定截取视频中的第 100 帧
ffmpeg -i clip.mp4 -vf 'select=eq(n\,100)' -vframes 1 thumb.png
预览图当然也可以由用户利用 FFmpeg 以外的软件自行准备
在预览图文件 thumb.png
准备完成后,我们就可以将其嵌入到视频文件了。对于 MP4 文件,这需要使用 disposition
参数:
ffmpeg -i video.mp4 -i thumb.png -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4
上例接受了第 1 个输入文件 video.mp4
与第 2 个输入文件 thumb.jpg
的所有流数据,然后将输入设置为预览图。请注意,我们必须像例中一样用 -map
指明接受两个输入的流数据,否则 ffmpeg 会自动只保留一个视频流。
对于 MKV 文件,我们则需要使用 -attach
参数来嵌入缩略图(也称 MKV 封面)。
请注意: MKV 封面图片的文件名必须为 cover,例如 cover.jpg 或 cover.png。否则,嵌入的封面不能作为预览图被正常地显示。
# 如果使用 PNG 文件(cover.png),请相应地将后续参数改为 mimetype=image/png
ffmpeg -i video.mkv -c copy -attach cover.jpg -metadata:s:t:0 mimetype=image/jpeg out.mkv
更改帧率/速度
视频变速的一个常见应用场景是帧率减半,例如将 60 帧视频通过变速输出为 30 帧的视频。
需要指出, 通过 FFmpeg 自带的 -vf
参数的 fps
或者 setpts
键,我们可以指定视频帧率。但是,这些方法不是一个无损转换,因此不推荐使用。下例中, FFmpeg 将输入的 60 帧视频通过每两帧丢弃一帧的方式降为 30 帧:
# 以下方法会抽帧,均不推荐!
ffmpeg -i video-60p.mp4 -vf fps=30 video-30p.mp4
ffmpeg -i video-60p.mp4 -vf "setpts=0.5*PTS" video-30p.mp4
变速方式,它无损且无需重新编码。原理是将视频输出为不包含时间戳的数据流,然后在重封装时指定变速后的时间戳。
# 如果是 H265,使用: ... -bsf:v hevc_mp4toannexb raw.h265
ffmpeg -i video-60p.mp4 -map 0:v -c:v copy -bsf:v h264_mp4toannexb raw.h264
# 只处理视频流
ffmpeg -fflags +genpts -r 30 -i raw.h264 -c:v copy video-30p.mp4
如果需要同时对视频、音频进行降速,可以利用 atempo 过滤器。将上述第二条命令更换为:
ffmpeg -fflags +genpts -r 30 -i raw.h264 -i video-60p.mp4 -map 0:v -c:v copy -map 1:a -af atempo=0.5 output.mp4
其中, atempo 过滤器只支持 0.5 到 100 之间的变速倍率;不过你可以重复调用,例如 -af "atempo=0.5,atempo=0.5" 将会把音频降速为 0.25 倍。
如果需要对加速或减速后的帧之间进行动态插值(运动补偿),可以使用 minterpolate 过滤器。但这就需要对视频重新编码了:
ffmpeg -i input.mkv -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:vsbmc=1:fps=30'" output.mkv
定限码率压制
定限码率压制并不考虑文件大小,而是只限制文件码率
种码率限制参数:
-b:v
目标平均码率,也即希望得到的输出文件的平均码率(单位 bit/s)。该参数也在二压中被使用。值得说明的是,输出视频的码率总是大于指定的平均码率的。这是由于容器本身还需要记录元数据等内容(可能占用数百 KB),因此我们总是需要对传入码率参数进行调低。这个码率超出问题在压制短时长视频压制时比较明显,请特别注意。-maxrate
最大码率,需要与-bufsize
参数同时使用。-minrate
最小码率。这个较少使用。
只给定平均码率 -b:v
是一种比较粗糙的码率控制方法。正如上面所说,它会使得输出文件的码率总是略高于指定值。
ffmpeg -i input -c:v libx264 -b:v 8M output.mp4
相对的,利用最大码率参数 -maxrate
与缓冲区参数 -bufsize
可以更严格地控制码率上限。它会完成一段缓冲区大小就检验一次码率是否符合要求,因此在缓冲区设置上也存在一些技巧。通常,我们将缓冲区设置为与码率值相同。你也可以增大缓冲区,直到发现码率输出开始大幅度高于或低于目标值的临界点,然后以略低于该临界点的值作为缓冲区大小;当然,这需要更多的时间去尝试。
ffmpeg -i input -c:v libx264 -b:v 8M -maxrate 8M -bufsize 8M output.mp4
网络视频优化:快速加载
使用 -movflags +faststart
参数,可以在输出时让视频文件将一些数据前置,从而实现在网络视频未被全部下载时就能够开始播放。
显卡硬件加速
FFmpeg 支持显卡硬件加速;本节主要以 Nvidia 的显卡与 H.264 编码方式为例展示一些用法。
硬件支持
关于用户当前的显卡支持哪些编码格式的硬件加速,可以参考 Nvidia 给出的一张表格: Video Encode and Decode GPU Support Matrix。简要来说,大概是:
- 大多 Maxwell 一代显卡(GTX 745/850/850M/960M 及同代更高型号)支持完整的 H.264 编码硬件加速
- Maxwell 二代(GTX 750/950/965M 及同代更高型号)还支持 4K YUV 4:2:0 的 H.265 编码硬件加速
- 大多 Pascal 显卡(GTX 1050 及同代更高型号)及之后架构的显卡,都支持完整的 H.265 编码硬件加速
- 较新的显卡对于其他主流的编码格式,如 VP9 等,也有硬件加速支持
显卡加速使用特殊的编码器(而不是 CPU 编码时的标准编码器),它们通常以 nvenc
(或者 cuvid
)结尾。用户可以使用 -codec
来查找当前安装的 FFmpeg 是否在编译时添加了这些编码器的支持。
以 h264_nvenc
编码器为例,说明几个注意点:
- 编码器
h264_nvenc
使用与常规编码器libx264
不同的-preset
参数选项,可以通过如ffmpeg -h encoder=h264_nvenc
的命令查看。 - 编码器
h264_nvenc
不支持 CRF 参数控制压制质量,用户需要使用其他的参数,比如粗糙的-qp
参数,或者-rc
参数来指定码率控制模式并配合其他参数(例如-b:v
参数)。 - 关于该编码器的详细帮助,可以参考
ffmpeg -h encoder=h264_nvenc
命令给出的参数列表。
硬件加速命令
硬件加速有混合模式(CPU 与 GPU 共同工作)与独占模式(完全 GPU 工作)两种。
混合模式直接指定编码器为支持硬件加速的编码器即可,比如 h264_nvenc
:
# CPU+GPU 混合模式
ffmpeg -i video.mp4 -c:v h264_nvenc -c:a copy out.mp4
独占模式需要指定额外的输入参数 -hwaccel
与 -hwaccel_output_format
的值为 cuda
,表示启用 cuvid 解码器与 nvenc 编码器。
# GPU 独占模式
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i video.mp4 -c:v h264_nvenc -c:a copy out.mp4
上述命令会自动以 2000 kbps(即 2Mbps)左右的总文件比特率(视频、音频多轨综合,因此单独看视频码率可能会略高于 2M )来压缩视频。
硬件加速下的质量控制
由于 h264_nvenc
编码器不支持 CRF 参数,我个人的习惯是通过 -rc
参数来设置 vbr_hq
可变码率模式,并手动指定 -b:v
视频码率的数值。例如下述命令使用可变码率模式,并将视频设置在 2Mbps 附近:
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i video.mp4 -c:v h264_nvenc -rc vbr_hq -b:v 2M -c:a copy out.mp4
在此基础上,用户还可以配合 -maxrate
来限制最大码率、用 -bufsize
来调整缓冲区大小(缓冲区越小,码率波动越小)、用 rc_lookahead
来设定前览帧数等。
另一种方式是使用 -cq
参数。默认的硬件加速结果 q 值(据笔者测试)大约在 25 左右,用户可以通过稍微调高该值来获得压缩效果,例如:
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i video.mp4 -c:v h264_nvenc -rc vbr_hq -cq 28 -qmin 28 -c:a copy out.mp4
其中 -qmin
参数能够限制最小的 q 值(控制质量上限,减小文件体积);类似的还有 -qmax
参数,只不过作用相反。作为参考,笔者使用该命令来转码一个 2250Kbps 视频码率、时长6分钟的 99M 大小的视频文件,得到了 1814Kbps 的大小为 80M 的输出结果。
常用编码器与参数
libx264(H.264 视频)
H.264 在很长的一段时间内都是最广泛使用的视频编码方式,其编码器 libx264(参考 libx264_002c-libx264rgb)很可能是 FFmpeg 用户第一个接触的视频编码器。
在输出 mp4 格式的文件时,如果需要对视频流编码但用户未指定编码器,FFmpeg 将自动调用 libx264 并以其默认参数进行编码。
# 以下命令等于 ffmpeg -i input.mkv -c:v libx264 output.mp4
ffmpeg -i input.mkv output.mp4
恒定率系数(CRF):crf 越小,画面质量越好,但文件体积越大。
- 系数
-crf
:对于常见的 8 bit H.264 视频,-crf
参数可以从 0(无损)到 51(最差压缩)取值,而默认值是 23。一般地,我们只选择 17~28 之间的数值:从视觉观感上,17 已经很接近无压缩的结果,更小的 crf 值徒增文件体积罢了。- 对于 10 bit H.264 视频,
-crf
参数的取值是 0~63。
- 对于 10 bit H.264 视频,
- 预案
-preset
:指导视频压制的质量。越慢的预案,压缩越好,即输出同等质量的视频所需的文件体积越小。预案从快到慢包括:ultrafast, superfast, veryfast, faster, fast, medium(默认), slow, slower, veryslow。- 从输出质量上讲,只建议使用 medium 或更慢的预案,一般以使用 medium 或 slow 最为常见。例外的情形是指定了无损(CRF=0)的情形,此时可以选用 ultrafast。
- 风格
-tune
:告知输入视频的风格。风格包括:- animation:动画。提升去块(deblocking)强度与参考帧数量。
- fastdecode:快速解码。禁用滤镜来加快解码。
- film:电影。降低去块强度。
- grain:颗粒。保留旧电影的颗粒感。
- stillimage:静止图像。适用于相片幻灯片或类似主题的内容。
- zerolatency:零延迟。适用于快速编码,或者低延迟流媒体内容。
一个 CRF 的例子:
ffmpeg -i video.mp4 -c:v libx264 -preset slow -tune film -crf 20 -c:a copy out.mp4
- 定限码率压制:适用于强制要求码率的场合,比如直播。
- 二压(2Pass):适用于强制要求文件大小的场合。
libx265(H.265/HEVC 视频)
H.265 的许多参数与 H.264 相同(但取值含义可能不同),只是使用 libx265 编码器代替 libx264。
- 恒定率系数(CRF):crf 越小,画面质量越好,但文件体积越大。
- 不同于 H.264 的默认 CRF 取值 23,H.265 的默认 CRF 取值是 28;它们两者对应的视觉画面质量相同。
- 不同于 H.264 视觉上的无损 CRF 值 17,H.265 中该值(从经验上)大约在 20~22。
- 不同于 H.264 的 CRF 取值范围(8bit 0~51; 10bit 0~63),H.265 的取值范围始终为 0(无损)到 51(最差压缩)。libx264 与 libx265 的 CRF 取值无法对应libx264 与 libx265 的 CRF 取值没有一一对应的公式。除了上文所述的无损参数均为 CRF=0、libx264 CRF=23 对应 libx265 CRF=28,其余 CRF 值并不存在对应关系。
- 预案
-preset
:指导视频压制的质量。其取值与 libx264 相同,默认为 medium。- 与 libx264 类似,我们建议使用 medium/slow 或更慢的预案。例外的情形是指定了无损(CRF=0)的情形,此时可以选用 ultrafast。
- 风格
-tune
:告知输入视频的风格。libx265 支持的风格不如 libx264 多,只包括:- fastdecode:快速解码。禁用滤镜来加快解码。
- zerolatency:零延迟。适用于快速编码,或者低延迟流媒体内容。
- 定限码率压制:用法与 libx264 类似,适用于强制要求码率的场合,比如直播。
- 二压(2Pass):用法与 libx264 类似,适用于强制要求文件大小的场合。但请注意,编码器 libx265 需要额外在两步中指定
-x265-params
参数。
libmp3lame(MP3 音频)
可变比特率(VBR)
推荐利用可变比特率(VBR)来编码 MP3 音频:
ffmpeg -i input.wav -c:a libmp3lame -q:a 2 output.mp3
其中,质量参数 -q:a
(或者其全称 -qscale:a
)用于控制 MP3 品质。编码器 libmp3lame 支持 0~9 的质量参数,其中 0 表示最高质量(最高比特率,245 kbps 左右),而默认值是 4。一般认为 0~3 的取值可以达到令人满意的质量。
FFmpeg 比特率参数与实际比特率范围(kbps)有如下对应关系:
参数 | 平均比特率 | 比特率范围 |
---|---|---|
-b:a 320k* | 320 | 320 (CBR) |
-q:a 0 | 245 | 220 ~ 260 |
-q:a 1 | 225 | 190 ~ 250 |
-q:a 2 | 190 | 170 ~ 210 |
-q:a 3 | 175 | 150 ~ 195 |
-q:a 4 | 165 | 140 ~ 185 |
-q:a 5 | 130 | 120 ~ 150 |
-q:a 6 | 115 | 100 ~ 130 |
-q:a 7 | 100 | 80 ~ 120 |
-q:a 8 | 85 | 70 ~ 105 |
-q:a 9 | 65 | 45 ~ 85 |
固定比特率(CBR)
除了可变比特率,在网络上分享的 MP3 文件也常常采用固定比特率(CBR)编码,如 128, 192, 256 kbps。编码器 libmp3lame 通过 -b:a
参数支持一系列固定比特率,分别是 8, 16, 24, 32, 40, 48, 64, 80, 96, 112, 128, 160, 192, 224, 256, 以及 320 kbps。
一般认为在 MP3(或者其他压缩格式上)追求高码率(如 320 kbps) 是没有意义的,因为 VBR 0~3 的质量对压缩格式已经足够好。毕竟无论如何,MP3 都是有损压缩;想要更高的质量,建议转向 FLAC 等无损格式。
下例将音频以 192 kbps 的固定码率输出为 MP3(不要忘记码率数字后面的字母 “k”):
ffmpeg -i input.wav -c:a libmp3lame -b:a 192k output.mp3
平均比特率(ABR)
平均比特率(ABR)介于固定与可变之间,可以向参数 -abr
赋值 1
来启用。除此之外,libmp3lame 编码器此时仍需要 -b:a
的码率参数作为指导:
ffmpeg -i input.wav -c:a libmp3lame -abr 1 -b:a 192k output.mp3
暂无评论内容