ffmpeg 硬件加速 wmv 视频转码

  1. 基于 Windows 下演示,Linux 下也可以通用。建议先阅读关于使用硬件加速的基础部分。文章链接:ffmpeg 硬件加速视频转码指南

  2. 后文将会演示 wmv3 以及 vc1 编码的 wmv 格式视频向 h264 编码的 mp4 格式视频的转换。如果你理解了原理,那么类似 wmv2 转 hevc 也是类似的。

  3. 测试案例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 设定输出视频的码率与原视频一致来避免画质损失。

  1. 测试案例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_qsvN卡 专用的 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 码率,可以手动设置码率来降低画质损失。

posted @ 2022-11-11 13:59  afnewiung  阅读(937)  评论(0编辑  收藏  举报