FFmpeg常见实用命令

FFmpeg 是一个强大的命令行音视频工具,可以承担转码、混流、嵌挂字幕、剪辑等工作。

图片[1]-FFmpeg常见实用命令-小七笔记

安装

本小节的内容以 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)
8K24~3080 – 160 Mbps100 – 200 Mbps
48~60120 – 240 Mbps150 – 300 Mbps
4K (2160p)24~3035 – 45 Mbps44 – 56 Mbps
48~6053 – 68 Mbps66 – 85 Mbps
2K (1440p)24~3016 Mbps20 Mbps
48~6024 Mbps30 Mbps
1080p24~308 Mbps10 Mbps
48~6012 Mbps15 Mbps
720p24~305 Mbps6.5 Mbps
48~607.5 Mbps9.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。
  • 预案 -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*320320 (CBR)
-q:a 0245220 ~ 260
-q:a 1225190 ~ 250
-q:a 2190170 ~ 210
-q:a 3175150 ~ 195
-q:a 4165140 ~ 185
-q:a 5130120 ~ 150
-q:a 6115100 ~ 130
-q:a 710080 ~ 120
-q:a 88570 ~ 105
-q:a 96545 ~ 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
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    blank

    暂无评论内容