-
基于 Windows 下演示,Linux 下也可以通用。建议先阅读关于使用硬件加速的基础部分。文章链接:ffmpeg 硬件加速视频转码指南
-
后文将会演示 wmv3 以及 vc1 编码的 wmv 格式视频向 h264 编码的 mp4 格式视频的转换。如果你理解了原理,那么类似 wmv2 转 hevc 也是类似的。
-
测试案例1
可以看到原视频是一段 wmv3 编码的 4000k 码率 720p 30帧的视频
-
首先还是默认情况下,用 CPU 编解码:
ffmpeg -i input.wmv output.mp4
,速度如图所示,CPU 满载,GPU 围观。
-
接着尝试使用加入
-hwaccel auto
参数,使用自动的硬件加速:ffmpeg -hwaccel auto -i input.wmv output.mp4
程序自动选择了 dxva2 的硬件加速方法( cuda 我也测试了,差不多)
速度提升不能说没有,只能说差不多
用到了一点点的 GPU 解码器,约等于没有用,主要依旧还是 CPU 在干活。
-
尝试寻找适用于 wmv3 的硬件解码器
ffmpeg -codecs | findstr "wmv3"
,可以看到并没有
-
但是没有关系,转码过程中主要的负载来自于编码工作,我们可以手动指定 编码器 encoder,来达到硬件加速的作用
通过加入-c:v
参数,来调用 N 卡的硬件编码器:ffmpeg -hwaccel cuda -i input.wmv -c:v h264_nvenc output.mp4
可以看到指定的编码器生效了,转码速度也快了很多,GPU 的硬件编解码器也得到了较为充分的利用,CPU 占用也维持在一个较低的水平。但是编码器默认的码率(2000k)较低,清晰度有所下降,可以通过参数 -b:v 4000k
设定输出视频的码率与原视频一致来避免画质损失。
- 测试案例2
vc1 编码,1080p 30帧 6000k 码率,直接 CPU 编解码和打开自动硬件解码和上面差不多的结论,都很慢。
-
不过有一个特殊情况就是指定
-hwaccel cuda
的时候,转码速度会非常慢。GPU 的硬件解码器使用率会达到 100% ,但是编码器没有用到,CPU 也是占用率很低。ffmpeg -hwaccel cuda -i input2.wmv output.mp4
-
手动指定编解码器
通过ffmpeg -codecs | findstr "vc1"
查看 vc1 的编解码器
可以看到有 i卡 专用的vc1_qsv
和 N卡 专用的vc1_cuivid
解码器
加入参数-c:v
来指定解码器:ffmpeg -c:v vc1_cuvid -i input2.wmv -c:v h264_nvenc output.mp4
(根据你的显卡选择对应的编解码器,我这里是 N卡 所以选择了vc1_cuvid
作为解码器,h264_nvenc
作为编码器)
可以看到转码速度非常快,并且硬件编解码器也得到了充分的利用,CPU 占用也较低。
同样也是注意 nvenc 默认编码输出为 2000k 码率,可以手动设置码率来降低画质损失。