前言

最近整了张RTX4080,听说这玩意支持AV1硬编解码,于是把我大部分视频都开始用AV1编码格式录制了

其中使用OBS录制AV1硬编码视频是没遇到什么问题的(应该是v28.1+)

但是在转码压制视频时就遇到大量问题了,各种速度慢,不跑GPU等问题频繁出现(注意SVT-AV1不支持N卡硬解,会跑CPU),各路知名和非知名的转码程序,试了好几家结果全部扑街(包括格式工厂、AdobePR、AdobeMediaEncoder、ShanaEncoder、NotEnoughAV1Encodes、小丸压制工具、必剪、快剪辑等)都没有成功完整的发挥N卡的硬编解码实力。

于是一番折腾下来还是只能开始手撸终极王者FFmpeg(需要注意的是大部分上述软件、其他视频转码软件均套娃FFmpeg,总结就是依托答辩套娃都套不清楚,还有Adobe 2022这傻逼软件直接不支持AV1)(不过听说剪映专业版支持AV1硬编码)

需要注意的是本文指的是N卡相关命令,非N卡可能不能用,另外AV1编码器需要RTX40系等显卡才有。

FFmpeg安装

一开始我跟着N卡官网教程走,结果下了CUDA工具包等软件包,编译了一个多小时告诉我一个傻逼玩意librtmp失败导致不能继续,查了下也没有解决方法,只能暂时放弃

   痛苦的编译过程  ==>  展开 / 收缩

那么编译搞破防了,那就只能找别人编译好的,一开始我还以为官网没有,去百度谷歌看了下结果没找到能用的

然后看了下官网的WIN下载方法,提供了2个第三方网站给我,第一个一开始我以为没有编译好的,只是仓库镜像,于是就打开了第二个下载看看 https://github.com/BtbN/FFmpeg-Builds/releases

结果第二个这什么傻卵玩意自动编译日期看着挺新的,结果一用发现不支持N卡的CUDA AV1编码器,依托答辩

然后回去看第一个,认真看了下发现有最新的编译,只是下面那个发行版本是旧的而已。

那么直接下载最新的编译版本,最后测了下没问题确实支持N卡的CUDA AV1编码器 https://www.gyan.dev/ffmpeg/builds/

下载好直接就是二进制文件,用CMD运行即可。

初步使用

打开CMD的方法,比如我的FFmpeg.exe在D:\Program Files\ffmpeg\bin中

第一种方法是直接通过文件管理器打开这个目录,在地址栏输入cmd后回车,这样就可以直接在cmd中打开这个目录

第二种方法是通过WIN+R或者搜索打开cmd,此时默认目录是C盘的用户文件夹,需要先切换盘区再cd打开目录
先输入(注意英文符号)

D:

再输入

cd D:\Program Files\ffmpeg\bin

常用参数配置解读

-y 不提示,直接覆盖输出文件。
-n 不要覆盖输出文件,如果输出文件已存在直接退出。

-vsync 0 视频同步方法(0:直通,1:CFR,2:VFR,drop,-1:auto)【这个应该可以直接不用】

//passthrough 每一帧从解码器到编码器,时间戳保持不变
cfr 如果指定了输出帧率,输入帧会按照需要进行复制(如果输出帧率大于输入帧率)或丢弃(如果输出帧率小于输入帧率)
vfr 输入帧从解码器到编码器,时间戳保持不变;如果出现相同时间戳的帧,则丢弃之
drop 同 passthrough,但将所有帧的时间戳清空
根据NV的官网说明和示例(Use -vsync 0 option with decode to prevent FFmpeg from creating output YUV with duplicate and extra frames.)还是跟着选择0直通比较好
不过ffmpeg在提示中提到
-vsync is deprecated. Use -fps_mode
Passing a number to -vsync is deprecated, use a string argument as described in the manual.
看上去已被弃用,现在用的是-fps_mode(不过输入vsync并不会出现报错的问题)

-fps_mode 0 【这个可以直接不用】
//设置视频同步方式/帧率模式。vsync 应用于所有输出视频流,但可以通过设置 fps_mode 为流覆盖。vsync 已弃用,将来会被删除。
出于兼容性原因,可以将 vsync 的某些值指定为数字(显示在下表的括号中)。
直通 (0)
每个帧连同其时间戳从多路分解器传递到多路复用器。
恒定帧频CFR (1)
帧将被复制和丢弃以准确地达到请求的恒定帧速率。
可变帧频VFR (2)
帧通过它们的时间戳传递或丢弃,以防止 2 个帧具有相同的时间戳。
降低
作为直通但会破坏所有时间戳,使复用器根据帧速率生成新的时间戳。
自动 (-1)
根据复用器功能在 cfr 和 vfr 之间进行选择。这是默认方法。

-i 输入文件的路径,比如 "G:\EV\2022-12-29 10-10-07.mp4"

-hwaccel cuda -hwaccel_output_format cuda 硬件加速的附加参数,使用N卡的CUDA工具
//根据官网说明,要编译 FFmpeg,必须在系统上安装 CUDA 工具包,尽管运行FFmpeg 编译二进制文件 不需要 CUDA 工具包。

-c:v av1_nvenc 选择av1编码器(影响输出文件的编码类型)
//FFMPEG 中的 NVENC 插件支持以下编解码器【注意有的显卡支持AV1解码但是不支持AV1编码】
h264_nvenc:H264(AVC) 编码器
hevc_nvenc:H265(HEVC) 编码器
av1_nvenc:AV1 编码器【需要RTX40系及以上的消费级显卡才支持AV1编码】

-c:a 使用复制流,不会对输入流进行重新编码【只建议在同编码的情况下才使用该参数】

-b:v 15M 设置输出文件的视频码率为15Mbps,注意这里是bit而不是byte,比例1比8,15M相当于1小时6.75G
//哔哩哔哩推荐的视频码率为 4K大于20M,1080P大于6M,实际我的视频在哔哩哔哩转码后,4K60的AV1编码视频最多大概17M(低的也有4M、9M、12M)

–resize 1280x720 指定输出文件分辨率(使用 cuvid 解码器中的内置调整器)【可能需放在输出文件的前面,不过我实测没效果】
-vf scale=1280:720 更改输出文件的分辨率(使用scale过滤器)【不过我实测直接报错】
-vf scale_cuda=1280:720 更改输出文件的分辨率(使用scale_cuda过滤器)【可能需放在输出文件的前面,输入文件的后面,实测这个可用】
-ss 1:23.456 起始时间为1分钟23秒456毫秒
-t 持续时间
-to 终止时间【-to一定要写在-i前面】
-bufsize 5M 设置码率控制缓冲区大小为5M
-r 帧率

运行命令演示

将高码率视频压制到指定码率,使用AV1编码,不改变分辨率和帧率等参数,不截取视频

ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i "G:\EV\2023-01-06 10-31-56.mp4" -c:a copy -c:v av1_nvenc -b:v 15M "G:\EV\output.mp4"

将高码率视频压制到指定码率,使用AV1编码,不改变分辨率和帧率等参数,并截取视频(从30s起截取1分钟)

ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda  -ss 0:30.000 -t 1:00.000 -i "G:\EV\2023-01-06 10-31-56.mp4" -c:a copy -c:v av1_nvenc -b:v 5M "G:\EV\output2.mp4"

将高码率视频压制到指定码率,使用AVC编码,截取视频(从30s起截取到1min30s),且压制视频到720P30FPS

ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -ss 0:30.000 -to 1:30.000  -r 30  -i "G:\EV\2023-01-06 10-31-56.mp4" -vf scale_cuda=1280:720 -c:a copy -c:v h264_nvenc -b:v 2M "G:\EV\output3.mp4"

 

演示效果图

原视频码率大概47M(19.8G),转码后视频码率16M(6.74G),编码AV1分辨率4K帧率60,视频时长1小时9秒,使用RTX4080转码时间28分钟,对比CMD告诉我的2.15X Speed,估计就是这个时间比率了,然后转码时估计没触发复制流,因为解码器和编码器同时在跑(不过都跑不满,任务管理器中,不过显卡功耗倒是没有直接起飞,还是一个比较低的水平,CPU也基本没什么动静,内存和磁盘IO也没有明显异常)

参考资料

https://docs.nvidia.com/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/#video-encoding
https://docs.nvidia.cn/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/#video-encoding
https://developer.nvidia.com/video-encode-and-decode-gpu-support-matrix-new
https://docs.nvidia.com/video-technologies/video-codec-sdk/pdf/Using_FFmpeg_with_NVIDIA_GPU_Hardware_Acceleration.pdf
https://ffmpeg.org/ffmpeg.html