一视频编解码基础
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值。
---------------------
原文:https://blog.csdn.net/Mrhiuser/article/details/50824648