GPU視頻編解碼及性能質量測試基礎

一視頻編解碼基礎

1.1識別編碼流程


視頻編解碼流程

1.2 YUV顏色空間

YCbCr通常是YUV的同義詞,Y爲明度(luma),CbCr爲色度(chroma),Cb爲 藍色分量,Cr爲紅色分量。

顏色空間轉換公式:

–      RGB轉YUV

•      y = [0.299,0.587,0.114] *[r,g,b]’

•      u = [-0.147,-0.289,0.436] *[r,g,b]’ + 128

•      v = [0.615,-0.515,-0.100] *[r,g,b]’ + 128

–      YUV轉RGB

•      r = y + 1.371 * (v-128)

•      g = y - 0.338 * (u-128) - 0.698* (v-128)

•      b = y + 1.732 * (u-128)

 

1.3 YUV採樣比例與內存佈局

YUV444平面格式:各分量依次連續存儲,無交叉

•       採樣比例

–      人眼對顏色敏感度低於明度,因此UV分量可被亞採樣

–      4:2:0 橫向1/2,縱向1/2

–      4:2:2 橫向1/2,縱向1/1

•       4:2:0採樣下的內存佈局

–      I420(IYUV):YUV分別連續存儲(右圖)

–      YV12:YVU分別連續存儲

–      NV12(推薦格式):Y連續存儲,UV交錯(右圖)

–      NV21:Y連續存儲,VU交錯

 


1.4、H264文件分析

•       幀類型

–      I幀:獨立圖片

–      P幀:參考前向圖片

–      B幀:參考雙向圖片

•       幀的序號

–      流序號(streamorder):幀在流中的次序。該次序保證每幀的解碼只依賴前面已出現的幀

–      顯示序號(displayorder):圖像正常行進的次序

•       元數據:SPS/PPS

–      包含對流正確解碼所需要的元信息

–      如圖像大小,採樣比例

 

二:NVIDIA GPU 編解碼視頻

2.1 支持硬件編解碼的GPU

•       服務器顯卡:GRID系列

–      K1/K2/K340/K520/M60/

–      單GPU編碼速度:M60 =2.6 x K340,K340 = 1.5 x K1(單GPU芯片)

•       桌面顯卡:Quadro系列

–      K5000/M5000

–      單GPU編碼速度:M5000 =M60 = 4 x K5000 (K1)

•       桌面顯卡:GeForce系列,編碼限併發2路

2.2 視頻編解碼 GPU API

•       NVENC: 通用的底層API

–      可靈活控制所有編碼參數

–      可與CUDA/DX互操作

•       GRID: 遊戲視頻流化API

–      面向DX/OGL遊戲整合

–      接口簡單,易於使用

 


 


 

2.3 GPU 硬編碼NVENC(已經集成到ffmpeg)

•       輸入

–      格式:僅支持YUV平面格式,包括IYUV(I420),YV12, NV12, YUV444

–      載體:主存/CUDA設備內存/D3D9surface

•       輸出

–      H264, H265(即HEVC,僅GM2xx芯片支持)

–      載體:主存

NVENC編碼H264的編碼參數:

•       碼率

–      碼流的平均每秒比特數

•       碼率控制

–      CBR/VBR/CONSTQP

–      QP (體現量化步長)

•       Profile

–      編解碼所使用的工具集合

•       預設


 

2.4 GPU視頻硬解碼NVCUVID

•       支持硬件

–      全部NV顯卡,無使用限制

–      單GPU解碼速度:GM2xx = 3 x GK1xx

•       輸入格式

–      H264, MPEG-2

•       輸出格式

–      NV12

2.5 複用和解複用

•       媒體容器格式(mp4;avi;flv;)

•       複用/解複用

•       複用/解複用工具:FFmpeg

 

三、ffmpeg

3.1、ffmpeg

ffmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化爲流的開源計算機程序。ffmpeg 中只包含了GPU的硬編碼,nvenc。

3.2、Nvidia GPU解碼

如果需要將GPU的硬解碼加入到ffmpeg需要自己編寫解碼程序nvcuvid,具體編寫可參考NV的視頻編解碼Sample,然後放到目錄libavcodec下,並修改部分文件。如下要修改的文件:

•       configure,

•       libavcodec/allcodecs.c

•       libavcode.c/Makefile.c

•       libavfilter/allfilters.c

•       libavfilter/Makefile

 

四、視頻測試

4.1性能測試

         GPU性能測試有編碼模式有HP,HQ,HP是性能較高,但是圖像質量較差,HQ 是性能較差,編碼的質量好。

4.2編碼質量測試

名詞解釋:PSNR:峯值信噪比(PSNR),一種評價圖像的客觀標準,PSNR值越大,就代表失真越少。

目前GPU的硬編碼質量與軟編碼有較大差距。

測試方法:

1、  使用GPU 的sample中的nvenc編碼原始的YUV視頻,生成H264視頻文件。

2、  使用ffmpeg軟件解碼H264文件生成新的YUV視頻文件。

使用軟件Elecard測試原始的YUV與新生成的YUV視頻文件,得到平均PSNR值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章