一視頻編解碼基礎
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值。