FFmpeg硬件加速视频转码指南
FFmpeg硬件加速视频转码指南
本文将详细介绍如何在Windows系统下使用FFmpeg进行视频硬件加速转码。通过对比CPU转码和硬件加速的效果,以及具体演示如何使用CUDA、Intel QSV等硬件加速方法,帮助读者掌握高效视频转码技巧。
系统环境
基于Windows演示,Linux下也可以适用。所使用FFmpeg版本为BtbN编译的win64-gpl版(非gpl-share),项目地址:BtbN / FFmpeg-Builds。也可以使用gyan.dev编译的git-full版,地址:gyan.dev,都是官方推荐的。所使用的测试片段是一段相机录制的h264编码的100兆码率的4k 25帧的视频。
默认CPU转码
在默认情况下,不加任何参数,会直接使用CPU编解码:
ffmpeg -i input.mp4 output.mp4
可以看到转码速度是相对比较慢的,并且过程中CPU是处于100%使用率的。
尝试使用硬件加速编解码
首先通过命令查看所支持的硬件加速方法:
ffmpeg -hwaccels
如果你是在Windows平台并且使用的是我所提到的那两个版本,那么结果应该和下图相同,Linux下的版本可能会略有不同。通过加上参数-hwaccel
可以指定硬件加速方法。如果你的是N卡,可以选择cuda,如果是Intel核显,可以选择qsv,(印象里还有一个A卡的amf)。
自动硬件加速
ffmpeg -hwaccel auto -i input.mp4 output.mp4
可以看到在自动的设置下选择了dxva2为硬件加速方法,但是从提升上看并不明显,调用了显卡很小一部分解码器,CPU依然满载。
CUDA硬件加速
ffmpeg -hwaccel cuda -i input.mp4 output.mp4
可以看到速度与auto设置下类似,实际情况也是只调用了显卡的部分解码能力,CPU依然满载。
手动指定视频的编解码器
查看支持的编解码器
通过命令查看所支持的h264编解码器:
ffmpeg -codecs | findstr "h264"
从图中可以看到decoders(解码器,对应input文件的编码)和encoders(编码器,对应output文件的编码)。
decoders中:
- h264_qsv是Intel核显/显卡专用的硬件加速解码器
- h264_cuvid是N卡专用的解码器
encoders中:
- h264_amf和h264_mf都是A卡专用的编码器
- h264_qsv对应I卡
- h264_nvenc对应N卡
测试
(由于我的笔记本的核显出厂被屏蔽了,因此只能使用N卡硬件加速测试,如果你的核显能用,可以试试,说不定不比独显编解码慢)
使用-c:v
参数来指定视频的编解码器,这里c是codec的缩写,v是指video,处理音频编码可以替换为a (audio)。
ffmpeg -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc output.mp4
注意:指定解码器-c:v h264_cuvid
必须放在输入文件-i input.mp4
之前,否则无效。
可以看到确实使用了指定的硬件编解码器,在编解码的过程中也充分调用了显卡的硬件编解码器,CPU也维持在一个很低的占用。
可以看到转码的速度提升非常大,但是存在一个问题就是这个编码器的默认设置下码率只有2000k,实际输出的视频画质也降低了很多。
手动指定视频码率
通过加入-b:v
参数(这里b指bitrate,v同理指video视频),可以手动指定视频的码率,以提升画质。
(这里码率的值只是作为演示,码率是清晰度的决定因素之一,码率越高越清晰,但体积也相应增大。想要深入了解可以自行查阅相关资料)
ffmpeg -c:v h264_cuvid -i input.mp4 -c:v h264_nvenc -b:v 10000k output.mp4
可以看到转码速度依然很快,并且画质也没有太大的损失。并且可以看到GPU的硬件编解码器是被充分利用了的,CPU也维持在一个很低的占用。
总结
本文只是简单介绍了如何利用硬件编解码器加速视频转码。最好是你了解视频编码、封装等相关的基础知识,那么在看了之后你应该也会了其他的视频编码之间的相互转换。关于FFmpeg更高级的使用方法也可以参考官方文档。