一 编解码基础
问:为什么要进行编解码?
答:如果不对视频进行编解码的话,数据量太大了,存储,IO速度将压力倍增。一个4K,24FPS,1小时的数据量为:3840 * 2160 * 3 * 3600 * 25= 2085.5 G, 播放一个4K网络视频,下载速度将要579M/S。经过H264编码后,数据将缩小40~100 倍, 而新一代编码算法H265 ,压缩率甚至高达200.
问:编码的本质是什么?
答:去冗余。就时间上来说,视频前一帧后一帧有很强的相关性,假设对后一帧只保留变化信息,数据量是不是小很多。 就空间上来说,相邻区域的像素很多都是相同的,假设只保留轮廓信息,那么数据量也会小很多。因此视频压缩就是利用相关性去冗余。
问:视频编码流程?
答:编码分为帧内/帧间编码,K 为帧内帧间编码的开关。
流程为:预测 > 变化 > 量化 > 熵编码
预测:帧内为当前像素和预测值的插值,帧间像一个运动的物体,在一定窗口内搜索到最佳匹配宏块,然后两个宏块相减得到残差值。
变化编码:时域转换到频域,在这个新领域信号能量重新分布,能量更集中,直流低频分量占大部分,高频占小部分。
量化:把DCT系数除以一个常量,量化后结果是量化步长的整数倍或更多零值,从而达到压缩目的。
熵编码:符号出现概率大的用短码字来表示,符号出现概率小的用长码字来表示。
问:视频解码流程?
答:解码是编码的逆过程,另外需要消除由反量化和反变化重建图像由于误差带来的块效应,还需要在最后加入环路滤波。因此解码流程为:
解析码流头 > 熵解码 > 反量化 > 反变换 > 运动补偿 > 滤波。
解析:码流头结构解析,获取量化步长等信息; 熵解码:MPEG-4 的VLD,H264的CAVLD,CABAD; 反量化:H.263的32级量化,MPEG量化表,H.264的52级量化; 反变换:H.263/MPEG的8x8浮点IDCT,H.264的4x4 块定点IDCT; 运动补偿:根据编码中的像素精度,运动方向信息等方向插值并运动补偿; 滤波:去除方块效应。
二 H.264视频编码
问:H.264视频编码有哪些特点?
答:1 提供16x16,8x8,4x4预测模式,2 多参考帧的运动补偿(以往标准P帧参考为1,B帧参考为2,而h.264 最多参考达32),3 1/4像素精度的运动补偿,4 环类去除块效应滤波器,5 CAVLC变长编码(比CABAC效果要好),6 SP,SI 用以解决视频码率切换,7 使用抽象网络层NAL,适应多种网络环境。
问: h.264 算法裆级有哪些及特点?
答:1 Baseline Profile: 提供I/P帧,仅支持Progressive 和 CAVLC,用于视频会话等要求延时低的场景。
2 Extended Profile:提供I/P/B/SP/SI帧,主要应用于网络视频流。
3 Main Profile: 常用,应用于消费电子,数字电视广播,数字视频存储。
4 High Profile: 针对高分辨率和高清晰度专业级视频。
问:H.264有哪些关键技术?
答:帧内预测:利用空间相关性实现的,概括的说就是利用周围的像素点预测当前的像素点。16x16四种预测模式:垂直,水平,直流分量,平面。
帧间预测:用先前编码帧作为参考,对当前图像进行预测编码。运动补偿,运动矢量,整数变换DCT及量化,熵编码,1/4精度运动矢量,多参考帧等方法。
问:SPS,PPS ,SEI 记录了哪些信息?
答:SPS:序列参数集,记录了这一组编码序列相关信息,比如profile(决定编码方式),level(决定最大分辨率和最大帧率),POC,最大参考帧数目,图像的宽度以宏块为单位,图像的高度以宏块为单位
PPS:图像参数集,编码后数据依赖的参数保存于图像参数集中。PPS/SPS 两者都会保存编码方式的信息。关于SPS/PPS 每个字段及含义请参考:https://www.cnblogs.com/wainiwann/p/7477794.html
SEI:补充增强信息, 不记录实际的图像数据, 主要起补充和增强作用。