做pc网站,网站建设 提升和扩大,深圳市建设工程交易服,wordpress不显示媒体库图片一、视频图像基础
像素#xff1a;图像的基本单元#xff0c;即一个带有颜色的小块分辨率#xff1a;图像的大小或尺寸#xff0c;用像素个数来表示。原始图像分辨率越高#xff0c;图像就越清晰位深#xff1a;存储每位像素需要的二进制位数#xff1b;位深越大#…一、视频图像基础
像素图像的基本单元即一个带有颜色的小块分辨率图像的大小或尺寸用像素个数来表示。原始图像分辨率越高图像就越清晰位深存储每位像素需要的二进制位数位深越大能够表示的颜色值就越多色彩越丰富真实跨距Stride图像存储时内存中每行像素所占用的空间。需要正确的设置否则会出现花屏帧率1秒中内图像的数量单位FPS码率视频在1s内的数据量的大小。一般码率越高视频清晰度越高存储时占用内存空间就越大传输时使用流量越多但还需要结合压缩算法和压缩速度综合考虑
二、图像颜色空间
颜色空间分类 RGB指图像的每一个像素都是分别存储R、G、B三个值且三个值依次排列存储。顺序不一定是R-B-GRGB三个颜色有相关性采集和渲染的时候是RBG YUV图像将亮度信息 Y 与色彩信息 U、V 分离开来。Y 表示亮度是图像的总体轮廓称之为 Y 分量。U、V 表示色度主要描绘图像的色彩等信息分别称为 U 分量和 V 分量YUV分类 YUV 4:4:4每一个 Y 对应一组 UV YUV 4:2:2每两个 Y 共用一组 UV YUV 4:2:0每四个 Y 共用一组 UVYUV存储方式 Planar先连续存储所有像素点的Y然后接着存储所有像素点的U/V之后再存储所有像素点的V/U Packed先存储完所有像素的Y然后U、V连续的交错存储 TipsU和V在一张图片中顺序固定不同图片U和V谁在前不一定YUV类型和存储类型关系 I444YUV顺序 YV24YVU顺序 NV16先存储完 Y之后 U、V 连续交错存储 NV61先存储完 Y之后 V、U 连续交错存储 YU16I422YUV顺序 YV16YVU顺序 NV12先存储完 Y之后 U、V 连续交错存储 NV21先存储完 Y之后 V、U 连续交错存储 YU12I420YUV顺序 YV12YVU顺序Color Range Full RangeR、G、B取值范围都是0255 Limited RangeR、G、B取值范围是16235RBG与YUV互转规范 BT709高清的标准 BT601标清的标准RBG与YUV转换公式
三、缩放算法
图像的缩放算法插值算法、AI 超分算法插值算法使用周围已有的像素值通过一定的加权运算得到“插值像素值”包括最近邻插值算法Nearest、双线性插值算法Bilinear、双三次插值算法BiCubic缩放的基本原理图像的缩放就是将原图像的已有像素经过加权运算得到目标图像的目标像素。主要包括两个部分一个是像素位置映射过程一个是映射位置像素的插值过程。像素位置映射过程假设原图像的分辨率是w0xh0我们需要缩放到w1xh1。那我们只需要将目标图像中的像素位置xy映射到原图像的xw0/w1yh0/h1再插值得到这个像素值就可以了这个插值得到的像素值就是目标图像像素点xy的像素值映射像素的插值过程
四、编码原理
宏块对于每一帧图像划分成一个个块来进行编码。例如16x16H264、VP832x32H265、VP964x64H265、VP9、AV1128x128AV1图像的数据冗余 空间冗余相邻的块很多时候都有比较明显的相似性 时间冗余前后两帧图像的变化是比较小的相似性很高 视觉冗余人的眼睛对于图像中高频信息的敏感度是小于低频信息的 信息熵冗余文件压缩编码原理 1帧内预测为了提高熵编码的压缩率先将当前编码块的相邻块像素经过帧内预测算法得到帧内预测块再用当前编码块减去帧内预测块得到残差块从而去掉空间冗余 2帧间预测类似于帧内预测在已经编码完成的帧中先通过运动搜索得到帧间预测块再与编码块相减得到残差块从而去除时间冗余 a参考帧预测块所在的已经编码的图像 b运动矢量预测块在参考帧中的坐标值(x0, y0)与编码块在编码帧中的坐标值(x1, y1)的差值(x0 - x1, y0 - y1) c运动搜索在参考帧中去寻找预测块的过程 3DCT 变换离散余弦变换和量化将残差块变换到频域分离高频和低频信息。由于高频信息数量多但大小相对较小又人眼对高频信息相对不敏感我们利用这个特点使用 QStep 对 DCT 系数进行量化将大部分高频信息量化为 0达到去除视觉冗余的目的 a量化步长QStepDCT变换块的系数都同时除以一个值QStep越大得到量化后的系数就会越小一般用量化参数QP和QStep有对应映射表 b编码时QStep 乘以量化后的系数得到变换系数有损编码 cQP 值越大损失就越大从而画面的清晰度就会越低0的概率越大压缩率越高 4熵编码以行程编码为例视频编码中真正实现“压缩”的步骤主要去除信息熵冗余。在出现连续多个 0 像素的时候压缩率会更高编码标准系列 H264-H265 VP8-VP9-AV1 技术选型 清晰度AV1H265H264 专利费AV1免费、H264收费、H265费用极高 压缩率AV1H265H264 耗时H264H265AV1 硬件支持H264H265AV1使用场景 屏幕编码使用AV1 AV1原生标准就支持屏幕编码的优化 浏览器VP9或AV1浏览器原生不支持H265 机器性能性能差机器使用H264、VP8中高等机器可以考虑H265 性价比较高H264
五、H264编码
帧类型 IDR帧立即刷新帧特殊的I帧。IDR 帧之后的帧不能再参考 IDR 帧之前的帧截断了编码错误的传递。大多数情况下还是直接使用 IDR 帧不适用普通的I帧 I的压缩率是7跟JPG差不多P是20B可以达到50GOP图像组包含一个 IDR 帧到下一个 IDR 帧的前一帧中的所有帧。关键帧间隔IDR帧之间的间隔越大压缩率越高但丢关键帧时可能导致花屏和卡顿一般 RTC 和直播场景可以稍微大一些而点播场景一般小一些Slice图像内的层次结构就是一帧图像可以划分成一个或多个 Slice而一个 Slice 包含多个宏块且一个宏块又可以划分成多个不同尺寸的子块 注帧都是以 Slice 的方式在码流中呈现H264 码流格式 1 Annexb 格式使用起始码“00 00 00 01”或“00 00 01”来表示一个编码数据的开始图像编码中和起始码撞车的数据会被替换成默认的字节串解码时需要逆转换。套娃 2MP4 格式在图像编码数据的开始使用了 4 个字节作为长度标识 H264参数集 1SPS基础图像信息主要包含图像的宽、高、YUV 格式和位深等基本信息 2PPS基础编码参数主要包含熵编码类型、基础 QP 和最大参考帧数量等基本编码信息H264码流主要是由 SPS、PPS、I Slice、P Slice和B Slice 组成且每一个都封装在NALU网络抽象层单元中 7、常见问题 1多Slice时如何判断哪几个Slice是同一帧的 在Slice Header开始的地方有一个first_mb_in_slice的字段表示当前Slice的第一个宏块MB在当前编码图像中的序号0表示新帧中的第一个slice 2如何从 SPS 中获取图像的宽高分辨率 在SPS中有几个字段用来表示分辨率的大小。我们可以解码出这几个字段并通过一定的规则计算得到分辨率的大小 3如何计算得到QP值 根据PPS初始基础QP、Slice QP偏移量、宏块QP偏移量
六、帧内预测空间冗余
帧内预测通过利用已经编码的相邻像素的值来预测待编码的像素值最后达到减少空间冗余的目的在H264标准里面块分为宏块和子块 1宏块大小是16x16其中亮度块为16x16色度块为8x8 2帧内预测中亮度块和色度块是分开独立进行预测的 316x16 的亮度块可以继续划分成16个4x4的子块4x4亮度块的帧内预测模式8种方向模式和一种DC模式方向模式指的是预测是有方向角度的 1Vertical 模式指当前编码亮度块的每一列的像素值都是复制上边已经编码块的最下面那一行的对应位置的像素值同一列像素值都一样 2Horizontal 模式指当前编码亮度块的每一行的像素值都是复制左边已经编码块的最右边那一列的对应位置的像素值同一行像素值都一样 3DC 模式指当前编码亮度块的每一个像素值是上边已经编码块的最下面那一行和左边已编码块右边最后一列的所有像素值的平均值块中每一个像素值都是一样的 4Diagonal Down-Left 模式上边块和右上块的像素通过插值得到。如果上边块和右上块不存在则该模式无效 5Diagonal Down-Right 模式需要通过上边块、左边块和左上角对角的像素通过插值得到。如果这三个有一个不存在则该模式无效 6Vertical-Right 模式需要通过上边块、左边块以及左上角对角的像素插值得到的。必须要这三个都有效才能使用否则该模式无效 7Horizontal-Down 模式需要通过上边块、左边块以及左上角对角的像素插值得到。必须要这三个都有效才能使用否则该模式无效 8Vertical-Left 模式通过上边块和右上块最下面一行的像素通过插值得到。如果这两种块不存在则该模式不可用 9Horizontal-Up 模式通过左边块的像素通过插值得到的。如果左边块不存在则该模式不可用 16x16亮度块的帧内预测模式 1Vertical模式同4x4 2Horizontal模式同4x4 3DC 模式同4x4 4Plane模式Plane预测块的每一个像素值都是将上边已编码块的最下面那一行和左边已编码块右边最后一列的像素值经过下面公式计算得到的 8x8色度块的帧内预测模式 1Vertical模式同16x16 2Horizontal模式同16x16 3DC 模式同16x16 4Plane模式同16x16预测模式的选择方法主要有计算残差块绝对值之和、将残差块做 Hadamard 变换之后再求和、率失真优化等几种方案来得到 cost然后我们取 cost 最小的模式作为帧内预测模式 率失真优化的思想我们一般会在失真和码流大小之间平衡通过调整QP值尽量找到在一定码率下失真最小的模式作为最优的预测模式
七、帧间预测时间冗余
帧间预测相比于帧内预测参考的已编码块在其他图像中有单参考和多参考即参考一个图像或者多个图像前向参考帧 P帧双向参考帧 B帧B帧先分别得到两个预测块加权平均得到最终的预测块帧间预测块大小亮度 16x16, 16x8, 8x16, 8x8又可分为8x4, 4x8, 4x4YUV 4:2:0 中色度块宽高是亮度块的一半1/4在已经编码的帧里面找到一个块来作为预测块这个已经编码的帧称之为参考帧 注通常P 帧中的所有块都参考同一个参考帧并且一般会选择当前编码帧的前一帧来作为参考帧运动矢量表示编码帧中编码块和参考帧中的预测块之间的位置的差值。把运动矢量编码到码流当中运动搜索在参考帧中找到与当前编码块差值最小即残差块的像素绝对值之和SAD 最小的预测块 1全搜索算法所有像素块全部遍历一遍一般不用 2钻石搜索算法又称为菱形搜索算法以一个菱形的模式去寻找最优预测块计算中心点和4个角的SAD如果中心点SAD最小则返回否则将中心点挪到SAD最小的角对应的点重复前面的过程。如果需要编码速度快一般选择钻石搜索 3六边形搜索算法以一个六边形的模式去寻找最优预测块计算中心点和6个角的SAD如果中心点SAD最小则取中心点、该中心点菱形的4个顶点和正方形4个顶点中SAD最小的点否则将中心点挪到SAD最小的角对应的点重复前面的过程。要求编码质量高同时对速度要求不高的时候可以选择六边形搜索 注 1钻石搜索算法和六边形搜索算法得到的预测块不一定是全局最优预测块 2搜索算法中每一个搜索的点都是搜索块的左上角像素点以最佳匹配点为左上角像素的块就是预测块并且预测块左上角像素在参考帧中的坐标(x1, y1)与编码块在当前编码帧中的坐标(x0, y0)的差值(x1 - x0, y1 - y0)就是运动矢量 3我们一般会通过相邻已经编码块的运动矢量来预测当前块的运动矢量。这个预测的运动矢量也经常用做搜索的起点亚像素插值用插值的方式将半像素和 1/4 像素算出来也当作一个像素。我们先通过整像素插值得到半像素然后再通过半像素和整像素插值得到 1/4 像素。插值得到的图像跟原始的图像的对应像素点的像素值并不是完全一样的亚像素运动搜索计算整像素运动矢量-半像素和1/4像素插值-以整像素最佳匹配点菱形搜索半像素SAD-以半像素最佳匹配点菱形搜索1/4像素SAD-计算运动矢量 用周围相邻块的运动矢量预测一个预测运动矢量称为 MVP将当前运动矢量与 MVP 的残差称之为 MVDMVD编码到码流中MVPMVD 就是运动矢量了SKIP模式运动矢量就是 MVP也就是说 MVD 为 (00)同时残差块经过变换量化后系数也都是等于 0。缩效率特别高图像中的静止部分或者是图像中的背景部分大多数时候都是 SKIP 模式帧间模式的选择其实就是参考帧的选择、运动矢量的确定以及块大小也就是块划分的方式的选择如果 SKIP 单独拿出来算的话就再加上一个判断是不是 SKIP 模式
八、变换量化视觉冗余
视频编码过程 变换空域-频域 1DCT变换将图像从空域转换到频域并将图像的高频和低频信息分离开来。虽然高频信息数据多但是幅值比较小。这样高频信息在量化的过程中能够比较容易被减少。这样可以比较有效地减少图像的视觉冗余从而达到压缩的目的。 注 DCT 变换本身是无损的同时也是可逆的通常情况下 DCT 变换是在 4x4 的子块上进行的 2Hadamard变换Hadamard变换可以代替DCT变换将残差块快速转换到频域以便用来估计一下当前块编码之后的大小。在H264的16x16帧内亮度块和8x8色度块中会被用到在率失真优化做模式选择的时候使用的更多。量化其实就是一个除法操作通过除法操作就可以将幅值变小而高频信息幅值比较小就比较容易被量化成 0这样就能够达到压缩的目的。H264为了减少这种浮点型运算漂移带来的误差将 DCT 变换改成了整数变换DCT 变换中的浮点运算和量化过程合并这样就只有一次浮点运算过程
九、其它
码控的原理码控主要是为每一帧图像确定QP值的过程。如果在图像画面确定的情况下并且QP值确定了的话那当前图像编码后的大小就大致确定了从而编码后的码率大小也基本确定了。常用算法有VBR动态码率、CQP恒定QP、CRF恒定码率因子、CBR恒定码率卡顿问题人眼在帧率达到10fps并且均匀播放时就不太能看出来卡顿了如果两帧之间的播放时间间隔超过了200ms人眼就可以明显看出卡顿了 1帧率不够提高帧率 2机器性能不够导致前处理或者编码耗时太长使用GPU做前处理软件编码设置为快速档 3编码器输出码率超过实际网络带宽对发送码率做严格的限制防止它超过预估带宽 4复杂帧编码后过大或者I帧比较大可以在编码打包之后、发送之前加一个平滑发送的模块来平滑地发送视频包削峰填谷花屏问题 1帧不完整在解码一帧数据之前一定要保证帧是完整的 2参考帧不完整 3渲染的时候YUV格式弄错了表现为图像的大体轮廓是对的但是颜色是有问题的 4解码后渲染前一定要处理好YUV的Stride问题音画同步指在音视频数据播放的时候播放的画面和声音是需要同步的是能对得上的 1PTS表示的是视频帧的显示时间DTS表示的是视频帧的解码时间对于B帧PTS和DTS可能不一样 2时间基时间的单位1/x 秒 3音视频同步的类型 a视频同步到音频指音频按照自己的节奏播放不需要调节。是最常用的音视频同步方式 b音频同步到视频指视频按照自己的节奏播放不需要调节。音频速度变化会导致音调改变需要做到变速不变调人耳敏感度高这种方式是不常用 c音频和视频都做调整同步调节视频和调节音频相互交替进行