所有從 Kepler 一代開始的 NVIDIA GPUs 都支持完全加速的硬件視頻編碼,而從費(fèi)米一代開始的所有 GPUs 都支持完全加速的硬件視頻解碼。截至 2019 年 7 月,Kepler、Maxwell、Pascal、Volta 和 Turing 一代 GPUs 支持硬件編碼,F(xiàn)ermi、Kepler、Maxwell、Pascal、Volta 和 Turing 一代 GPUs 支持硬件解碼。
高質(zhì)量視頻應(yīng)用的處理需求對廣播和電信網(wǎng)絡(luò)提出了限制。消費(fèi)者行為已經(jīng)發(fā)生了變化,這在 OTT 視頻訂閱和實(shí)時(shí)流媒體迅速普及的趨勢中表現(xiàn)得很明顯。現(xiàn)在所有的社交媒體應(yīng)用程序都在各自的平臺上加入了這一功能。隨著消費(fèi)者從觀看點(diǎn)播視頻轉(zhuǎn)向觀看直播視頻,直播將推動(dòng)手機(jī)和 Wi-Fi 的整體視頻數(shù)據(jù)流量增長。
分發(fā)給觀眾的視頻內(nèi)容通常被轉(zhuǎn)換成幾個(gè)自適應(yīng)比特率( ABR )配置文件以進(jìn)行傳輸。生產(chǎn)中的內(nèi)容可能以大量編解碼器格式之一到達(dá),這些格式需要轉(zhuǎn)換為另一種格式以供分發(fā)或存檔。
這使得視頻轉(zhuǎn)碼成為高效視頻管道中的一個(gè)關(guān)鍵部分——無論是 1 : N 還是 M : N 配置文件。理想的轉(zhuǎn)碼解決方案需要在成本(美元/流)和能效(瓦特/流)方面具有成本效益,同時(shí)為數(shù)據(jù)中心提供具有最大吞吐量的高質(zhì)量內(nèi)容。視頻提供商希望降低向更多屏幕提供更多高質(zhì)量內(nèi)容的成本。
在各個(gè)方面生成的大量視頻內(nèi)容需要對視頻編碼、解碼和轉(zhuǎn)碼進(jìn)行健壯的硬件加速。讓我們看看 NVIDIA GPUs 是如何整合專用視頻處理硬件的,以及如何利用它。
NVIDIA 編解碼硬件
NVIDIA GPUs 船上配備了片上硬件編碼器和解碼器單元,通常稱為 NVENC 和 NVDEC 。與 CUDA 核心分開, NVENC / NVDEC 運(yùn)行編碼或解碼工作負(fù)載,而不會(huì)減慢同時(shí)運(yùn)行的圖形或 CUDA 工作負(fù)載的執(zhí)行。
NVENC 和 NVDEC 支持許多重要的編解碼編解碼器。 NVIDIA 。最新的支持矩陣可以在 GPU 上找到。
圖 1 : GPU 硬件功能
基于 FFmpeg 的硬件加速轉(zhuǎn)碼
在對視頻數(shù)據(jù)進(jìn)行轉(zhuǎn)碼時(shí),通常使用 FFmpeg 庫 。硬件加速極大地提高了工作流的性能。圖 2 顯示了 FFmpeg 轉(zhuǎn)換過程的不同元素。
圖片 2 :使用 NVIDIA 硬件加速的 FFmpeg 流水線轉(zhuǎn)碼
FFmpeg 通過 h264_cuvid 、 hevc_cuvid 和 h264_nvenc 、 hevc_nvenc 模塊支持硬件加速解碼和編碼。從源代碼構(gòu)建時(shí)激活對硬件加速的支持需要一些額外的步驟:
克隆 FFmpeg git 存儲(chǔ)庫 https://git.ffmpeg.org/ffmpeg.git
從 NVIDIA 網(wǎng)站 下載并安裝兼容的驅(qū)動(dòng)程序
下載并安裝 CUDA 工具箱
克隆 nv-codec-headers 存儲(chǔ)庫 并僅使用此存儲(chǔ)庫作為頭進(jìn)行安裝: make install
使用以下命令配置 FFmpeg (使用正確的 CUDA 庫路徑):
./configure --enable-cuda --enable-cuvid --enable-nvenc --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64
-
使用多個(gè)進(jìn)程進(jìn)行構(gòu)建,以提高構(gòu)建速度并抑制過度輸出:
make -j
-s
使用 FFmpeg 進(jìn)行軟件 1 : 1 轉(zhuǎn)碼非常簡單:
ffmpeg -i input.mp4 -c:a copy -c:v h264 -b:v 5M output.mp4
但這將是緩慢的,因?yàn)樗皇褂没?CPU 的軟件編碼器和解碼器。使用硬件編碼器 NVENC 和解碼器 NVDEC 需要添加更多參數(shù)來告訴 ffmpeg 使用哪個(gè)編碼器和解碼器。最大化轉(zhuǎn)碼速度還意味著確保解碼后的圖像保存在 GPU 存儲(chǔ)器中,以便編碼器能夠有效地訪問它。
ffmpeg -vsync 0 -hwaccel cuvid -c:v h264_cuvid -i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4
如果沒有 -hwaccel-cuvid 選項(xiàng),解碼后的原始幀將通過 PCIe 總線復(fù)制回系統(tǒng)內(nèi)存,如圖 3 所示。稍后,相同的圖像將通過 PCIe 復(fù)制回 GPU 內(nèi)存,以便在 GPU 上進(jìn)行編碼。這兩個(gè)額外的傳輸由于傳輸時(shí)間而造成延遲,并將增加 PCIe 帶寬占用。
圖3 :沒有 hAccel 的內(nèi)存流(& M )
添加 -hwaccel-cuvid 選項(xiàng)意味著原始解碼幀將不會(huì)被復(fù)制,轉(zhuǎn)碼將更快、使用更少的系統(tǒng)資源,如圖 4 所示。
hwaccel 的內(nèi)存流
給定 PCIe 帶寬限制,復(fù)制未壓縮的圖像數(shù)據(jù)會(huì)使 PCIe 總線迅速飽和。防止系統(tǒng)和 GPU 內(nèi)存之間不必要的復(fù)制,使用 -hwaccel-cuvid 的吞吐量比不使用 -hwccel-cuvid 的未優(yōu)化調(diào)用高出 2 倍。
處理篩選器
代碼轉(zhuǎn)換通常不僅涉及到更改輸入流的格式或比特率,還包括調(diào)整其大小。有兩個(gè)選項(xiàng)可用于調(diào)整 GPU 上的大小:使用 npp_scale 過濾器或 nvcuvid resize 選項(xiàng)。當(dāng)從一個(gè)輸入到一個(gè)具有不同分辨率( 1 : 1 轉(zhuǎn)碼)的輸出流轉(zhuǎn)碼時(shí),可以使用 nvcuvid resize 選項(xiàng)。請參見下一行的示例。
ffmpeg -vsync 0 –hwaccel cuvid -c:v h264_cuvid –resize 1280x720-i input.mp4 -c:a copy -c:v h264_nvenc -b:v 5M output.mp4
如果需要多個(gè)輸出分辨率( 1 : N 轉(zhuǎn)碼),則scale_npp
濾波器可以調(diào)整 GPU 上解碼幀的大小。通過這種方式,我們可以生成具有多個(gè)不同分辨率的多個(gè)輸出流,但對所有流只使用一個(gè)調(diào)整大小的步驟。關(guān)于 1 : 2 轉(zhuǎn)碼的示例,請參見下一行。
ffmpeg -vsync 0 –hwaccel cuvid -c:v h264_cuvid -i input.mp4 \-c:a copy –vf scale_npp=1280:720-c:v h264_nvenc -b:v 5M output_720.mp4 \-c:a copy -vfscale_npp=640:320-c:v h264_nvenc -b:v 3M output_360.mp4
使用-vf "scale_npp=1280:720"
將設(shè)置scale_npp
作為解碼圖像的過濾器
插值算法可以作為附加參數(shù)為scale_npp
定義。默認(rèn)情況下使用三次插值,但其他算法 MIG ht 會(huì)根據(jù)比例因子和圖像提供更好的結(jié)果。建議在縮小尺度時(shí)使用超級采樣算法以獲得最佳質(zhì)量。示例如下:
ffmpeg -vsync 0 –hwaccel cuvid -c:v h264_cuvid -i input.mp4-c:a copy –vf scale_npp=1280:720:interp_algo=super-c:v h264_nvenc -b:v 5M output_720.mp4
混合 CPU 和 GPU 處理
有時(shí) MIG 需要混合使用 CPU 和 hwupload_cuda 處理。例如,您可能需要在 CPU 上解碼,因?yàn)?-hwaccel cuvid 解碼器不支持該格式,或者 GPU 上沒有濾波器。在這種情況下,不能使用 GPU 標(biāo)志。相反,您需要使用 GPU 過濾器將數(shù)據(jù)從系統(tǒng)上傳到 GPU 內(nèi)存。在下面的示例中,由于未設(shè)置 -hwaccel cuvid ,因此在 GPU 上解碼 H 。 264 流并將其下載到系統(tǒng)內(nèi)存中。淡入濾波器應(yīng)用于系統(tǒng)存儲(chǔ)器中,并使用 hwupload_cuda 濾波器將處理后的圖像上傳到 GPU 存儲(chǔ)器。最后,使用 scale_npp 縮放圖像并在 GPU 上編碼。
ffmpeg -vsync 0 -c:v h264_cuvid -i input.264-vf "fade,hwupload_cuda,scale_npp=1280:720"-c:v h264_nvenc output.264
多 -GPU
當(dāng)在一個(gè)系統(tǒng)中使用多個(gè) GPUs 時(shí),編碼和解碼工作必須顯式地分配給 GPU 。 GPUs 由其索引號標(biāo)識;默認(rèn)情況下,所有工作都在索引為 0 的 GPU 上執(zhí)行。使用以下命令獲取系統(tǒng)中所有 NVIDIA GPUs 及其相應(yīng)的 ID 號的列表:
ffmpeg -vsync 0 -i input.mp4 -c:v h264_nvenc -gpu list -f null –
一旦知道了索引,就可以使用-hwaccel_device
索引標(biāo)志來設(shè)置解碼和編碼的活動(dòng) GPU 。在下面的例子中,工作將在索引為 1 的 GPU 上執(zhí)行。
ffmpeg -vsync 0 -hwaccel cuvid -hwaccel_device 1 -c:v h264_cuvid -i input.mp4-c:a copy -c:v h264_nvenc -b:v 5M output.mp4
優(yōu)化
為了獲得最佳的吞吐量,所有的編碼器和解碼器單元都應(yīng)該被盡可能地利用。 nvidia-smi 可用于生成有關(guān) NVENC 、 NVDEC 和一般 GPU 利用率的實(shí)時(shí)信息。
nvidia-smi dmon nvidia-smi -q -d UTILIZATION
根據(jù)這些結(jié)果可以采取多種措施。如果編碼器利用率低, MIG 可以引入另一個(gè)轉(zhuǎn)碼管道,該管道使用 CPU 解碼和 NVENC 編碼來為硬件編碼器生成額外的工作負(fù)載。
使用 CPU 篩選器時(shí), PCIe 帶寬 MIG ht 成為瓶頸。如果可能,篩選器應(yīng)在 GPU 上運(yùn)行。 FFmpeg 中有幾個(gè) CUDA 過濾器,可以用作模板來實(shí)現(xiàn)您自己的高性能 CUDA 過濾器。
通過使用 GPU SDK 的 NVIDIA 可視化分析器分析 ffmpeg 應(yīng)用程序,您可以始終跟蹤主機(jī)和設(shè)備之間的 GPU 利用率和內(nèi)存?zhèn)鬏敗V恍鑶?dòng)“ Run application to generateCPU andGPU timeline ”,然后選擇帶有相關(guān) CLI 選項(xiàng)的 ffmpeg 應(yīng)用程序。圖 5 說明了應(yīng)用程序
圖 5 :
綠松石塊顯示 CUDA 內(nèi)核完成的顏色空間轉(zhuǎn)換,而黃色塊顯示主機(jī)和設(shè)備之間的內(nèi)存?zhèn)鬏敗J褂?visualprofiler ,用戶可以輕松地跟蹤在 GPU 上執(zhí)行的操作,例如 CUDA 加速的過濾器和數(shù)據(jù)傳輸,以確保不會(huì)執(zhí)行過多的內(nèi)存拷貝。
通過使用 --disable-stripping CLI 選項(xiàng)編譯 ffmpeg 來收集 CPU – 端性能統(tǒng)計(jì)信息,以啟用性能分析。
這可以防止編譯器剝離函數(shù)名,以便像 Gprof 或 visualstudioprofiler 這樣的商品探查器可以收集性能統(tǒng)計(jì)信息。 CPU 在硬件加速開啟的情況下,負(fù)載水平應(yīng)較低,并且大部分時(shí)間應(yīng)花費(fèi)在視頻代碼 SDK API 調(diào)用中,這些調(diào)用標(biāo)記為“外部代碼因?yàn)楹瘮?shù)名從驅(qū)動(dòng)程序庫中被刪除。圖 6 顯示了一個(gè)示例屏幕截圖。
圖 6 : visualstudio 的 ffmpeg 性能評測
進(jìn)一步閱讀
有關(guān)如何使用 FFmpeg 的更多示例以及可用的高級質(zhì)量設(shè)置,請查看“ 使用 FFmpeg 和 NVIDIA GPU 硬件加速 “向?qū)А?/p>
結(jié)論
FFmpeg 是一個(gè)強(qiáng)大而靈活的開源視頻處理庫,具有硬件加速的解碼和編碼后端。它允許快速的視頻處理和完整的 NVIDIA GPU 硬件支持,只需幾分鐘。 Gprof 、 visualprofiler 和 microsoftvisualstudio 等商品開發(fā)工具可以用于精細(xì)的性能分析和調(diào)優(yōu)。看看 ffmpeg 源 試試吧!
關(guān)于作者
俄羅斯南部羅曼大學(xué)( Rostov-on-Don , 2012 )和羅曼大學(xué)應(yīng)用數(shù)學(xué)碩士學(xué)位。之后,他在俄羅斯三星研發(fā)院( 2012-2015 )、英特爾公司( 2015-2017 )工作。目前,他在莫斯科擔(dān)任開發(fā)技術(shù)工程師。他的研究興趣包括視頻編碼、高性能和 GPGPU 。
Stefan Schoenefeld 是 DevTech Engeniner 和 NVIDIA 專業(yè)解決方案組的經(jīng)理,他和他的團(tuán)隊(duì)致力于幫助媒體和娛樂、電信和其他行業(yè)的開發(fā)人員開發(fā)和改進(jìn)視頻和圖像處理、機(jī)器學(xué)習(xí)和視頻轉(zhuǎn)碼的高速應(yīng)用程序。他擁有烏爾姆大學(xué)工程、計(jì)算機(jī)科學(xué)和心理學(xué)系的計(jì)算機(jī)科學(xué)文憑。
審核編輯:郭婷
-
NVIDIA
+關(guān)注
關(guān)注
14文章
5060瀏覽量
103413 -
gpu
+關(guān)注
關(guān)注
28文章
4762瀏覽量
129151 -
CUDA
+關(guān)注
關(guān)注
0文章
121瀏覽量
13649
發(fā)布評論請先 登錄
相關(guān)推薦
評論