ffmpeg入门篇

ZTOA10 2023/10/9 发布 · 2023/10/9 更新 · 5024 次阅读

简单了解视频组成

视频流和音频流信息

如图所示

1.「视频」由「视频流」和「音频流」信息组成

2.「总比特率」=视频流的「数据速率」+音频的「比特率」

3.数据速率、帧速率和视频时长三者之间关系

  • 文件大小 = 数据速率 x 视频时长
  • 总帧数 = 帧速率 x 视频时长
  • 数据速率和帧速率之间没有直接的关系,但是它们都会影响视频的质量和文件大小。

浅白说法(不一定对):数据速率:画质,帧速率:流畅度

4.视频流是由帧组成的

4.1帧的宽度和高度构成画布分辨率由-s-video_size-vf scale参数控制,

  • -s 640x480:用于设置输出视频的分辨率
  • - -vf scale=640:480:用于设置输出视频的分辨率
  • - -video_size 640x480:用于设置输入视频的分辨率

4.2帧速率指每秒输出帧数量,由参数是-r-fps控制,两者作用相同,写法不同。

  • -r 30
  • - -vf fps=30

4.3 数据速率(码率)由-b:v参数控制,如:-b:v 3000k

5.音频流

5.1比特率由-b:a参数控制,如:-b:a 128k

命令行参数

大体可以分成五个部分。

$ ffmpeg {1} {2} -i {3} {4} {5}

上面命令中,五个部分的参数依次如下。

全局参数 输入文件参数 输入文件 输出文件参数 输出文件

参数太多的时候,为了便于查看,ffmpeg 命令可以写成多行。

$ ffmpeg \
[全局参数] \
[输入文件参数] \
-i [输入文件] \
[输出文件参数] \
[输出文件]

下面是一个例子。

$ ffmpeg \
-y \ # 全局参数
-c:a libfdk_aac -c:v libx264 \ # 输入文件参数
-i input.mp4 \ # 输入文件
-c:v libvpx-vp9 -c:a libvorbis \ # 输出文件参数
output.webm # 输出文件

上面的命令将 mp4 文件转成 webm 文件,这两个都是容器格式。输入的 mp4 文件的音频编码格式是 aac,视频编码格式是 H.264;输出的 webm 文件的视频编码格式是 VP9,音频格式是 Vorbis。

如果不指明编码格式,FFmpeg 会自己判断输入文件的编码。因此,上面的命令可以简单写成下面的样子

$ ffmpeg -i input.avi output.mp4

视频编码参数

FFmpeg提供了大量的参数,允许你精细控制视频和音频编码的各个方面。你可以通过运行ffmpeg -h来查看所有可用的选项和参数,以获取更详细的信息。

-vcodec 相关参数

-vcodec 参数 含义
copy 复制原始视频编解码器,不重新编码。
libx264 将视频压缩为H.264格式。
libx265 将视频压缩为H.265/HEVC格式。
h264_nvenc 使用NVIDIA GPU硬件加速进行H.264编码。
hevc_nvenc 使用NVIDIA GPU硬件加速进行H.265/HEVC编码。
h264_qsv 使用Intel Quick Sync Video硬件加速进行H.264编码。
hevc_qsv 使用Intel Quick Sync Video硬件加速进行H.265/HEVC编码。
libvpx 将视频压缩为VP8或VP9格式(通过-b:v指定压缩比特率)。
huffyuv 生成无损视频。

-acodec 相关参数

-acodec 参数 含义
copy 复制原始音频编解码器,不重新编码。
aac 将音频压缩为AAC格式。
libmp3lame 将音频压缩为MP3格式。
libopus 将音频压缩为Opus格式。
libvorbis 将音频压缩为Vorbis格式。
pcm_s16le 生成16-bit线性PCM音频。
flac 将音频压缩为FLAC格式(无损)。

视频解码

视频解码方式(Dcodec)

解码器选项 描述
h264_cuvid NVIDIA CUDA加速的H.264解码器
hevc_cuvid NVIDIA CUDA加速的HEVC解码器
mpeg2_cuvid NVIDIA CUDA加速的MPEG-2解码器
vp9_cuvid NVIDIA CUDA加速的VP9解码器
h264_qsv Intel Quick Sync Video加速的H.264解码器
hevc_qsv Intel Quick Sync Video加速的HEVC解码器
mpeg2_qsv Intel Quick Sync Video加速的MPEG-2解码器
vp9_qsv Intel Quick Sync Video加速的VP9解码器
h264_vdpau NVIDIA VDPAU加速的H.264解码器
mpeg2_vdpau NVIDIA VDPAU加速的MPEG-2解码器
vc1_vdpau NVIDIA VDPAU加速的VC-1解码器
h264_amf AMD AMF加速的H.264解码器
hevc_amf AMD AMF加速的HEVC解码器

示例:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -preset fast -tune hq -rc constqp -c:a copy -y output.mp4
ffmpeg -hwaccel cuvid -c:v hevc_cuvid -i input.mp4 -c:v copy -c:a copy output.mp4
ffmpeg -hwaccel qsv -c:v h264_qsv -i input.mp4 -c:v copy -c:a copy output.mp4
ffmpeg -hwaccel amf -c:v h264_amf -i input.mp4 -c:v copy -c:a copy output.mp4

视频编码

一、视频编码方式(Ecodec)

cpu(h264和h265),显卡,核显,如-c:v libx264-vcodec libx264

编码方式 参数 优点 缺点
CPU H.264 libx264 兼容性好,可用于各种设备 编码速度较慢,对CPU性能要求较高
CPU H.265 libx265 压缩率高,文件体积小 编码速度较慢,对CPU性能要求较高
NVIDIA NVENC h264_nvenc 编码速度快,对CPU占用低 兼容性较差,只能在英伟达显卡上使用
NVIDIA NVENC hevc_nvenc 压缩率高,文件体积小,编码速度快 兼容性较差,只能在英伟达显卡上使用
AMD VCE h264_amf 编码速度快,对CPU占用低 兼容性较差,只能在AMD显卡上使用
AMD VCE hevc_amf 压缩率高,文件体积小,编码速度快 兼容性较差,只能在AMD显卡上使用
Intel Quick Sync Video h264_qsv 编码速度快,对CPU占用低 兼容性较差,只能在搭载Intel核显的设备上使用
Intel Quick Sync Video hevc_qsv 压缩率高,文件体积小,编码速度快 兼容性较差,只能在搭载Intel核显的设备上使用

使用显卡和核显一定要安装好匹配的驱动!!

H.264编码

要保持H.264编码的视频视觉无损,你可以使用以下参数来最大程度地减少编码引入的失真:

ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 0 -c:a copy output.mp4

这个命令将输入视频文件input.mp4使用libx264编码器进行重新编码,设置预设为slow以获得更好的质量。-crf 0参数指定了恒定质量因子为0,表示最高的质量。音频流将直接复制到输出文件中,保持无损。

NVIDIA显卡

可以使用-hwaccel参数来指定使用的硬件加速器,例如:

ffmpeg -hwaccel cuvid -i input.mp4 -c:v h264_nvenc -preset slow -tune hq -rc constqp -crf 18 -c:a copy output.mp4

在这个命令中,-hwaccel cuvid表示使用NVIDIA显卡的硬件加速器来加速视频解码。同时,-c:v h264_nvenc表示使用NVIDIA显卡的硬件加速器来加速视频编码。这样可以大大提高视频编码和解码的速度,同时获得更好的视频质量。

AMD显卡

可以使用AMF SDK来实现。下面是一个示例代码:

ffmpeg -hwaccel amf -i input.mp4 -c:v h264_amf -b:v 5M -c:a copy output.mp4

其中,-hwaccel amf表示使用AMF SDK加速编码,-c:v h264_amf表示使用AMD的H.264编码器,-b:v 5M表示设置视频比特率为5Mbps。其他参数可以根据需要进行调整。

intel核显

如果您的电脑配备了Intel集成显卡,可以使用以下代码进行核显加速编码:

ffmpeg -i input.mp4 -c:v h264_qsv -global_quality 25 -c:a copy output.mp4

使用动态线程数来优化混合编码的性能

NVIDIA显卡+CPU

在FFmpeg中,可以使用-threads选项来指定线程数,也可以使用-threads auto选项来自动检测系统的CPU核心数,并根据核心数动态调整线程数。

ffmpeg -hwaccel cuvid -i input.mp4 -c:v h264_nvenc -preset slow -tune hq -rc constqp -crf 18 -c:a copy -threads auto output.mp4

这样,FFmpeg将自动根据系统的CPU核心数来动态调整线程数,以获得更好的性能和效率。

要同时使用NVIDIA的NVENC和CPU进行转码加速,你可以配置ffmpeg来利用系统中的多个处理器(CPU)和GPU资源。以下是一个示例命令,演示在转码过程中同时使用NVENC和CPU加速:

ffmpeg -i input.mp4 -c:v h264_nvenc -c:a copy -c:v hevc -preset faster -c:a copy output.mp4

二、音频编码

如:-c:a mp3-acodec libmp3lame

编码方式 参数 优点 缺点
AAC - 压缩率高,文件大小小,兼容性好 对CPU性能要求较高
MP3 libmp3lame 兼容性好,可用于各种设备 压缩率较低,文件大小较大
FLAC - 无损压缩,音质高 压缩率较低,文件大小较大
Opus - 压缩率高,文件大小小,适用于网络传输 兼容性较差,只能在支持Opus的设备上使用
Vorbis - 压缩率高,文件大小小,兼容性好 对CPU性能要求较高

三、编码速度

下表列出了ffmpeg中-preset参数的常用取值及其对应的编码效果:

参数 速度 质量 说明
ultrafast 最快 最差 适用于实时编码或者对速度要求较高的场景
superfast 较快 较差 适用于对速度要求较高,但对质量要求不高的场景
veryfast 一般 适用于对速度要求较高,但对质量要求一般的场景
faster 较快 一般 适用于对速度要求较高,但对质量要求一般的场景
fast 中等 一般 适用于对速度和质量都有一定要求的场景
medium 中等 中等 适用于对速度和质量都有一定要求的场景
slow 较慢 较好 适用于对质量要求较高,但对速度要求不高的场景
slower 较好 适用于对质量要求较高,但对速度要求不高的场景
veryslow 最慢 最好 适用于对质量要求最高,对速度要求不高的场景

需要注意的是,编码速度越慢,质量越好,相应耗时越长。如-preset slow

四、控制参数

控制视频质量编码参数

ffmpeg中-crf-qp-b:v是用于控制视频编码质量的参数,当使用x264或x265编码器时,在不设置参数的情况下,FFmpeg默认使用**-crf**参数进行编码。

-crf、-qp和-b:v的区别和关系

下表展示了它们各自的优缺点和作用:

参数 作用 取值范围 优点 缺点
-crf 恒定质量因子;crf值越小,视频质量越高,但文件大小也越大。适用于需要保证视频质量的场景,如-crf 18 取值范围:0-51 推荐使用:18-28 可以自动调整比特率,在一定程度上控制视频质量和文件大小的平衡,适用于大多数情况,保证视频质量 文件大小不可控,不够精确,可能会出现一些视觉上的失真
-qp 恒定量化参数;qp值越小,视频质量越高,但文件大小也越大。适用于需要控制文件大小的场景,如-qp 12 取值范围:0-69 推荐使用:12-28 直接控制量化参数,可以精确控制视频质量,可控制文件大小 不够直观,需要根据经验或测试来确定最佳取值,不易掌握
-b:v 控制比特率;比特率越高,视频质量越高,但文件大小也越大。适用于需要控制文件大小的场景,如-b:v 4000k - 1080p @ 30fps: 3,000 - 6,000 kbps - 1080p @ 60fps: 4,500 - 9,000 kbps - 720p @ 30fps: 1,500 - 4,000 kbps - 720p @ 60fps: 2,250 - 6,000 kbps - 480p @ 30fps: 500 - 2,000 kbps - 480p @ 60fps: 750 - 3,000 kbps 直接控制比特率,可控制文件大小 视频质量不可控
  • 如果同时使用-crf和-qp,那么-crf会自动调整压缩质量,而-qp则会按照设置的量化参数进行压缩,这两种方式会产生冲突。
  • 如果同时使用-crf和-b:v,那么-crf会自动调整压缩质量,而-b:v则会按照设置的比特率进行压缩,这两种方式也会产生冲突。
  • 如果同时使用-qp和-b:v,那么-qp会按照设置的量化参数进行压缩,而-b:v则会按照设置的比特率进行压缩,这两种方式也会产生冲突。

因此,建议在使用ffmpeg时只选择其中一种压缩方式,以避免产生冲突。

示例

-crf参数

ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 18 -c:a copy output.mp4

-qp参数

ffmpeg -i input.mp4 -c:v libx264 -preset slow  -qp 22 -c:a copy output.mp4

解释:

  • -i input.mp4:指定输入文件为input.mp4。
  • -c:v libx264:指定视频编码器为libx264。
  • -preset slow:指定编码速度为慢速,以获得更好的质量。
  • -qp 18:指定视频质量为18,数值越小,视频质量越好,但文件大小也越大。
  • -c:a copy:指定音频编码器为copy,即不进行音频转码。
  • output.mp4:指定输出文件为output.mp4。

这个命令将会将input.mp4文件转码为H.264格式的output.mp4文件,并且尽可能地保留视频的清晰度。

· {{comment.createTimeStr}}
{{reply.votePoints}}
回复   – {{reply.createTimeStr}}
回复 x
标签
目录
相关操作