欢迎光临散文网 会员登陆 & 注册

NVEnc/ffmpeg自用压制命令

2023-01-12 01:13 作者:童年是个风筝  | 我要投稿

前言-为什么要用NVEnc

之前在翻AC0这期视频的时候曾经用了ASS字幕来达到一些比较特殊的字幕效果(Arctime还是适合打比较普通的字幕),所以也被迫用了ffmpeg来压制视频。

但是众所周知ffmpeg用的一般是CPU来进行运算,而我家里也没有啥矿业,于是在家里电脑的i5-6500(四核基频3.20Ghz属实很拉)上压制的就特别慢。

当时为了解决这个问题也是花了几块钱到腾讯云上临时租赁了个32核64G内存的云服务器,利用COS对象服务上行不收费和同地域内网上下载免费的方式把视频字幕和整个压制软件都放到服务器上跑,跑完了再上传到COS下回来(这个要收费,但是因为我是老用户所以每月免费10G外网下行) 。

整体来说挺繁琐的。而且即便性能相比我家里的小机器已经是梦幻级别了,一次单独压制还是需要接近半个小时;如果过程中发现字幕有误还得重新来过,继续花钱等着压制完毕。。。所以我就想着有没有什么更快的压制字幕的方法。

AC0视频出来之后,我在视频下边评论区讲了下这次压制的困难,同时跟各位推荐了个UP主“Barnett-Wong”。Barnett-Wong大佬后来也是来下边评论了,然后我就顺便问了下有没有什么快速压制的工具,于是他就给我推了今天这个主角,NVEnc。

NVIDIA确实支持,但是……

我觉得大部分人的情况都是这样:没有一台专门的几十核的服务器摆在旁边给你压制,手上却有一张比较高端的游戏显卡(并且假设你还是N家的)。那有没有可能我们能不用CPU压制,而用游戏卡上的硬件解编码引擎来压制呢?更简单的话来说,有没有可能硬件加速?

确实可以。NVIDIA家实际上是开放了硬件解编码器的SDK的,所以这就让OBS和Action!之类的一些第三方录屏软件可以采用更省力更高效的硬件编码。事实上,NVIDIA还专门有一个文档就是教你怎么用ffmpeg进行硬件加速的。(https://docs.nvidia.com/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/)

但是这个方法不是所有人的适用的。比方说我就先后遇到了

  • Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0:0' and the filter 'auto_scale_0'

  • Failed using scale_npp ffmpeg filter

两个错误。第一个错误看StackOverflow上的一个帖子是能规避了,但是规避完之后就出现了第二个错误,并且看了下感觉是需要自己从头编译ffmpeg的(顺便一提,NVIDIA那篇文档确实是列出了编译的步骤的)……

虽然如今在Windows上配置编译环境可能已经没有以前那么困难了,但是还是很麻烦。

当某件事很麻烦(实际上是极其麻烦)的时候,我就不想干了。

不如给NVEnc一个机会。

NVEnc命令详解

项目地址:https://github.com/rigaya/NVEnc

第一感觉是:ffmpeg,但是NVIDIA硬件加速版。

所以ffmpeg的命令可以通用……吧?

实际上还真不太能。NVEnc虽然有用到ffmpeg的部分,且部分参数看起来也和ffmpeg很像,但是一些控制参数,例如码率、字幕等等都是不一样的。如果传进了不支持或不存在的参数,NVEnc会直接退出,拒绝运行。

所以我花了大概40分钟啃了下文档,大概根据自己的实际需要整合出了这么一道命令:

NVEncC64.exe --vpp-subburn filename=".\GamesSchools_zhcn.ass",shaping=complex --perf-monitor all --profile high -c "h264" --audio-copy --max-bitrate 3000 -i ".\Games, Schools, and Worlds Designed for Violence.mp4" -o '.\GamesSchools_zhcn.mp4'

各个参数解释如下(其实项目文档里就有):

  • --vpp-subburn:指明要把字幕烧刻进视频里(非外挂字幕)。filename后跟字幕文件位置,shaping=complex指明字幕为复杂渲染方式。

  • --perf-monitor all:可以去掉。这个只是告诉它记录性能参数罢了,会略微影响编码性能。好奇的可以保留。

  • --profile:指定编码器配置(profile)。H264一般常用“main”或“high”,这里我选了后者。

  • -c:指定编码器。可选“h264”和“hevc”(即H265)。H265疑似只能搞一条轨道,加了字幕是烧录不上去的(会报错),要用H264。

  • --audio-copy:指明要复制输入源里的音频。必须加上,否则输出的视频没声音。

  • --max-bitrate:指定最大码率,后跟码率(kbps)这个可以不加

  • -i:指定输入文件,后跟文件路径。

  • -o:指定输出文件,后跟文件路径

ffmpeg命令详解

顺便放一下我用的ffmpeg命令

.\ffmpeg.exe -i "input.mp4"-c:v libx264 -crf 28 -preset slow -c:a copy -vf "ass=sub.ass" -o .\out.mp4

各个参数解释如下:

  • -i:指定输入文件,后跟文件路径。

  • -c:v:指定视频的编码器。一般为“libx264”(H264)和“libx265”(H265)。

  • -crf:Constant Rate Factor,大概就是决定画面质量的东西,越大画面质量越垃圾建议值25~28

  • -perset:输出预设。一般为“slow”或“fast”越慢视频能更好压缩,节约空间

  • -c:a:指定音频编码器。一般为“copy”,即复制音频流(不转换)。

  • -vf:烧录字幕的相关参数。ASS字幕需要这么写(包括英文双引号):"ass=文件路径"

  • -o:指定输出文件,后跟文件路径

差不多就这样吧。

关于输出(只针对本视频)

文件大小:会膨胀一些,原因不明。

原视频304MB,输出为730MB。加了最大码率限制没用。

所需时间:大概只需要原来的10%左右的时间。

这个视频导出平均在一分半左右。按照常规压制流程可能需要30分钟左右(预设slow,crf 29)。

总结

比ffmpeg快,就是稍微有点折腾(指啃了命令性参数文档将近四十分钟)。

但是一旦能用了那就是真的快到飞起。


另外有任何错误欢迎指出。


NVEnc/ffmpeg自用压制命令的评论 (共 条)

分享到微博请遵守国家法律