NVEnc/ffmpeg自用壓制命令
前言-為什么要用NVEnc
之前在翻AC0這期視頻的時(shí)候曾經(jīng)用了ASS字幕來達(dá)到一些比較特殊的字幕效果(Arctime還是適合打比較普通的字幕),所以也被迫用了ffmpeg來壓制視頻。

但是眾所周知ffmpeg用的一般是CPU來進(jìn)行運(yùn)算,而我家里也沒有啥礦業(yè),于是在家里電腦的i5-6500(四核基頻3.20Ghz屬實(shí)很拉)上壓制的就特別慢。
當(dāng)時(shí)為了解決這個(gè)問題也是花了幾塊錢到騰訊云上臨時(shí)租賃了個(gè)32核64G內(nèi)存的云服務(wù)器,利用COS對象服務(wù)上行不收費(fèi)和同地域內(nèi)網(wǎng)上下載免費(fèi)的方式把視頻字幕和整個(gè)壓制軟件都放到服務(wù)器上跑,跑完了再上傳到COS下回來(這個(gè)要收費(fèi),但是因?yàn)槲沂抢嫌脩羲悦吭旅赓M(fèi)10G外網(wǎng)下行) 。
整體來說挺繁瑣的。而且即便性能相比我家里的小機(jī)器已經(jīng)是夢幻級別了,一次單獨(dú)壓制還是需要接近半個(gè)小時(shí);如果過程中發(fā)現(xiàn)字幕有誤還得重新來過,繼續(xù)花錢等著壓制完畢。。。所以我就想著有沒有什么更快的壓制字幕的方法。
AC0視頻出來之后,我在視頻下邊評論區(qū)講了下這次壓制的困難,同時(shí)跟各位推薦了個(gè)UP主“Barnett-Wong”。Barnett-Wong大佬后來也是來下邊評論了,然后我就順便問了下有沒有什么快速壓制的工具,于是他就給我推了今天這個(gè)主角,NVEnc。
NVIDIA確實(shí)支持,但是……
我覺得大部分人的情況都是這樣:沒有一臺專門的幾十核的服務(wù)器擺在旁邊給你壓制,手上卻有一張比較高端的游戲顯卡(并且假設(shè)你還是N家的)。那有沒有可能我們能不用CPU壓制,而用游戲卡上的硬件解編碼引擎來壓制呢?更簡單的話來說,有沒有可能硬件加速?
確實(shí)可以。NVIDIA家實(shí)際上是開放了硬件解編碼器的SDK的,所以這就讓OBS和Action!之類的一些第三方錄屏軟件可以采用更省力更高效的硬件編碼。事實(shí)上,NVIDIA還專門有一個(gè)文檔就是教你怎么用ffmpeg進(jìn)行硬件加速的。(https://docs.nvidia.com/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/)
但是這個(gè)方法不是所有人的適用的。比方說我就先后遇到了
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
兩個(gè)錯(cuò)誤。第一個(gè)錯(cuò)誤看StackOverflow上的一個(gè)帖子是能規(guī)避了,但是規(guī)避完之后就出現(xiàn)了第二個(gè)錯(cuò)誤,并且看了下感覺是需要自己從頭編譯ffmpeg的(順便一提,NVIDIA那篇文檔確實(shí)是列出了編譯的步驟的)……
雖然如今在Windows上配置編譯環(huán)境可能已經(jīng)沒有以前那么困難了,但是還是很麻煩。
當(dāng)某件事很麻煩(實(shí)際上是極其麻煩)的時(shí)候,我就不想干了。
不如給NVEnc一個(gè)機(jī)會。
NVEnc命令詳解
項(xiàng)目地址:https://github.com/rigaya/NVEnc
第一感覺是:ffmpeg,但是NVIDIA硬件加速版。
所以ffmpeg的命令可以通用……吧?
實(shí)際上還真不太能。NVEnc雖然有用到ffmpeg的部分,且部分參數(shù)看起來也和ffmpeg很像,但是一些控制參數(shù),例如碼率、字幕等等都是不一樣的。如果傳進(jìn)了不支持或不存在的參數(shù),NVEnc會直接退出,拒絕運(yùn)行。
所以我花了大概40分鐘啃了下文檔,大概根據(jù)自己的實(shí)際需要整合出了這么一道命令:
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'
各個(gè)參數(shù)解釋如下(其實(shí)項(xiàng)目文檔里就有):
--vpp-subburn:指明要把字幕燒刻進(jìn)視頻里(非外掛字幕)。filename后跟字幕文件位置,shaping=complex指明字幕為復(fù)雜渲染方式。
--perf-monitor all:可以去掉。這個(gè)只是告訴它記錄性能參數(shù)罷了,會略微影響編碼性能。好奇的可以保留。
--profile:指定編碼器配置(profile)。H264一般常用“main”或“high”,這里我選了后者。
-c:指定編碼器。可選“h264”和“hevc”(即H265)。H265疑似只能搞一條軌道,加了字幕是燒錄不上去的(會報(bào)錯(cuò)),要用H264。
--audio-copy:指明要復(fù)制輸入源里的音頻。必須加上,否則輸出的視頻沒聲音。
--max-bitrate:指定最大碼率,后跟碼率(kbps)。這個(gè)可以不加。
-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
各個(gè)參數(shù)解釋如下:
-i:指定輸入文件,后跟文件路徑。
-c:v:指定視頻的編碼器。一般為“l(fā)ibx264”(H264)和“l(fā)ibx265”(H265)。
-crf:Constant Rate Factor,大概就是決定畫面質(zhì)量的東西,越大畫面質(zhì)量越垃圾。建議值25~28。
-perset:輸出預(yù)設(shè)。一般為“slow”或“fast”。越慢視頻能更好壓縮,節(jié)約空間。
-c:a:指定音頻編碼器。一般為“copy”,即復(fù)制音頻流(不轉(zhuǎn)換)。
-vf:燒錄字幕的相關(guān)參數(shù)。ASS字幕需要這么寫(包括英文雙引號):"ass=文件路徑"。
-o:指定輸出文件,后跟文件路徑
差不多就這樣吧。
關(guān)于輸出(只針對本視頻)

文件大?。簳蛎浺恍?,原因不明。
原視頻304MB,輸出為730MB。加了最大碼率限制沒用。
所需時(shí)間:大概只需要原來的10%左右的時(shí)間。
這個(gè)視頻導(dǎo)出平均在一分半左右。按照常規(guī)壓制流程可能需要30分鐘左右(預(yù)設(shè)slow,crf 29)。
總結(jié)
比ffmpeg快,就是稍微有點(diǎn)折騰(指啃了命令性參數(shù)文檔將近四十分鐘)。
但是一旦能用了那就是真的快到飛起。
另外有任何錯(cuò)誤歡迎指出。