多媒体领域 H.264 编解码的过程 H.264 码流的结构
预测编码,帧内预测,帧间预测,运动补偿,运动估计,运动矢量,变换编码,离散余弦变换,量化参数,熵编码,哈夫曼编码、算数编码。
预测编码旨在消除视频的数据冗余,经过编码压缩后,传输的不是图像中每个像素点的实际取样值,而是预测值与实际值之差。
预测编码分为帧内预测和帧间预测,分别用来消除帧内冗余和帧间冗余。
帧内预测就是用邻近像素块预测该像素块,帧间预测则会先在邻近帧寻找该像素块的相似块,得到两者空间位置偏移量,再进行预测。
寻找偏移量(即相似块)的过程叫做运动估计,偏移量叫做运动矢量,我们把这种描述邻近帧差别的方式叫做运动补偿。
把图像从时空域变换到频域,更利于压缩。这个变换的过程,就叫变换编码,变换方法最常用的是离散余弦变换(Discrete Cosine Transform, DCT)。
变换编码之后再把变换系数映射为较小的数值,这个过程叫做量化。
利用信源的统计特性进行码率压缩的编码就称为熵编码,也叫统计编码。
视频编码常用的熵编码有可变长编码(Variable Length Coding, VLC,也叫哈夫曼编码)和算术编码(Binary Arithmetic Coding, BAC)。
I 帧,P 帧,B 帧,SP 帧,SI 帧
https://blog.youkuaiyun.com/Byeweiyang/article/details/78134674
宏块就是,把视频的每一帧(相当于一张图片)划分成16*16的小块,一块一块的依次压缩,而不是对整张图片一起压缩。这样降低了计算的复杂度,比较节省时间。
一个宏块又可以分成16*16,16*8,8*16,8*8,8*4,4*8,4*4,等大小不等的块。具体怎么划分块大小,要看画面有多复杂。一般来说,运动多,细节多的部分,划分成小块来编码;大片的平坦的无变化的,划分成16*16的大块。
https://www.zhihu.com/question/20237091
视频图像有着非常大的时间和空间的冗余度。
时间冗余度指的是两帧相邻的图像他们相同位置的像素值比较类似,具有很大的相关性。
空间相关性指的是同一帧图像,相邻的两个像素也具备一定的相关性。
去除空间相关性是通过DCT变换来实现的,把时域上的数据映射到频域上,然后对DCT系数进行量化处理,基本上,所有的有损压缩,都会有量化,它提高压缩率最明显。
主要的视频压缩算法包括:M-JPEG、Mpeg、H.264、Wavelet(小波压缩)、JPEG 2000、AVS。
显示设备主要有电视、监视器和显示器,他们的信号接口是不一样的,电视、监视器是模拟的电信号,显示器的输入应该是数字信号。
https://my.oschina.net/cmffire/blog/11290
视频压缩,根据编码数据能否完全可逆,可以分为有损压缩和无损压缩。
传统的视频编码技术有熵编码、变换编码、预测编码等,这些技术仍然在不断改进中,并且至今它们还处于视频压缩领域中的主流地位。
https://zhuanlan.zhihu.com/p/36009596
x264和x265
x264和x265编码技术的区别
编码架构:
H.264/AVC和H.265/HEVC
比起H.264/AVC,H.265/HEVC提供了更多不同的工具来降低码率 HEVC main 10(H.265)
https://blog.youkuaiyun.com/nh5431313/article/details/64120361
H.264是ITU(International Telecommunication Unite 国际通信联盟)和MPEG(Motion Picture Experts Group 运动图像专家组)联合制定的视频编码标准。
x264是一个采用GPL(General Public License)授权的视频编码开源软件。
https://blog.youkuaiyun.com/liudewen3/article/details/17251875
H.265与H.264相比,同等画质体积仅为一半、带宽占用省一半、画质更细腻等诸多优势。
H.265是新的编码协议,也即是H.264的升级版。
一、压缩率对比:H.265压缩率更高、流量省一半
H.265最主要的用途就是要进一步降低影片所需的流量,以降低储存与传输的成本。
二、更低的传输码率
同等图像质量下,数据量只有MPEG2的1/16,MPEG4的1/6,h.264的1/2。
三、画质对比:H.265比 H.264人物皮肤更细腻
H.265引入了一个Deblocking filter功能,deblocking filter在运作时会侦测临近巨区块的数据,重新建立巨区块间之数据依赖性,尽量将边缘区域平滑化,提高整体图像质量。
https://blog.youkuaiyun.com/mazhitong1020/article/details/78685202
运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,它是减少帧序列冗余信息的有效方法。
https://www.cnblogs.com/AndyJee/p/3724917.html
视频编解码---x264用于编码,ffmpeg用于解码
整个过程分为三个部分:采集、编码、解码。
https://blog.youkuaiyun.com/qq_26093511/article/details/78785218
H.264压缩算法的基本思想:因为视频图像视频的第一帧与第二帧在画面的差异比较小,而H.264只传输图像中有变化的帧,可以大大进行压缩. 故需要找到上一帧与下一帧的区别。
sensor采集的是原始的一帧一帧的图片,图片可能是很原始的图片,需要对图片编码成H.264压缩格式的数据,其中编码一般通过芯片(hadrware)解决。
当客户端通过RTSP,RTMP接收到H.264的祼流(数据)后,需要对H.264进行还原(解码)成一帧一帧的图像,然后在手机上每秒钟绘制24-30张图片(播放)。比如,iOS,Android都有内置的硬件解码(硬解),但是没有开放,所以我们需要(软解)用一个第三方的库来解码,比如:用FFmpeg进行解码。
http://www.voidcn.com/article/p-aercpojj-vn.html
软编码:使用CPU进行编码。
硬编码:不使用CPU进行编码,使用显卡GPU,专用的DSP、FPGA、ASIC芯片等硬件进行编码。
H.264编码原理:
先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。
在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧。
H264采用的核心算法是帧内压缩和帧间压缩,帧内压缩是生成I帧的算法,帧间压缩是生成B帧和P帧的算法。
https://maxwellqi.github.io/ios-h264-summ/
elecard 红色是I帧 蓝色是P帧 绿色是B帧