我们在一些视频播放器、安卓手机上经常看到视频的编码和解码,有硬件解码,也有软件解码,有.H264也有H.265,今天就扒一扒,和大家一起学习下视频编码技术。
硬解码和软解码
视频编码(手机相机视频录制):
视频解码(达芬奇16):
所谓视频编码就是通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。视频编码就是压缩视频,一个视频所包含的信息量实在是太大,尤其是在现在4k甚至8k视频都开始流行的情况下,视频编码显得更为重要。特别是现在直播,短视频的火热,没有一个好的编解码过程,是负担不起这么大额度的带宽和流量传输的。
视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频。由于连续的帧之间相似性极高,为便于储存传输,我们需要对原始的视频进行编码压缩,以去除空间、时间维度的冗余。
简而言之:视频编码是压缩视频和减少传输带宽和存储空间需求所必需的。
视频流传输中最为重要的编解码标准有国际电联的H.261、H.263、H.264,运动静止图像专家组的M-JPEG和国际标准化组织运动图像专家组的MPEG系列标准,此外在互联网上被广泛应用的还有Real-Networks的RealVideo、微软公司的WMV以及Apple公司的QuickTime等。 2022年7月,中国AVS3音视频信源编码标准,被正式纳入国际数字视频广播组织(DVB)核心规范。 [4]
H264是一个基于块的视频编码技术。什么是块呢,先从宏块说起,宏块是一部分像素阵列和对应信息的组合体,H264的核心就是将每一帧的图片划分成大小不等的宏块组合,再从中以块细分,然后再对每个宏块进行编码。
宏块:
宏块的大小都是16x16,但是为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。
宏块中的子块:
H.264将每个视频图片划分为小块(最多16x16像素),然后将这些块与上一张和下一张图片进行比较,以找到保存它们的最佳方法。播放视频时,使用相同的比较将块放回一起,这使视频看起来流畅清晰。
H.264的主要优点是其优越的数据压缩率,H.264不仅提供了高压缩比,还提供了高质量、平滑的图像。在相同的图像质量条件下,H.264提供的压缩比是MPEG-2的两倍多,是MPEG-4的1.5到2倍。
例如,如果原始文件的大小为 100GB,则使用MPEG-2标准进行压缩会将其减少到4GB,压缩比为25:1。然而,使用H.264压缩标准将其压缩到 980MB,实现了102:1的惊人压缩比,从 100GB降低到 980MB。
H.264的高压缩比在低比特率应用中起着至关重要的作用,即使在低速下也能使视频看起来有很好的观看体验。与MPEG-2和MPEG-4等压缩技术相比,H.264显著节省了用户的下载时间和数据使用费,这就是为什么用H.264压缩的视频数据在网络传输过程中需要更少的带宽,使其更经济。它适用于在线播放视频或将其保存在DVD或蓝光等磁盘上,H.264它也被称为AVC或MPEG-4。
由于苹果公司做出了大胆的决定,放弃了Adobe的VP6编码,选择了H.264,这一标准与数亿台iPad和iPhone一起进入了数百万家庭。它已经成为视频编码领域的绝对领导者,市场份额超过80%。
H.265是一种使视频文件更小、更好的新方法,它也被称为HEVC或MPEG-H第2部分。与旧的H.264相比,H.265可以用更少的空间保留更多的细节和颜色,可以制作高质量、高达8K、亮度和对比度更高的视频。
H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进,使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。(提高压缩效率、提高鲁棒性和错误恢复能力、减少实时的时延、减少信道获取时间和随机接入时延、降低复杂度等)
H.264宏块只有16x16,但H.265最大可达到64x64。
很多研究都展示出更大的树编码块可以提供更高的压缩效率(同样也需要更高的编码速度)。每个树编码块可以被递归分割,利用四叉树结构,分割为32×32、16×16、8×8的子区域,下图就是一个64×64树编码块的分区示例:
H.265不使用固定块来保存视频图片,它使用可以改变大小和形状的灵活单元,这使它更加智能和准确。
H.264可以以低于1Mbps的速度实现标清(分辨率在1280P720以下)数字图像传送;H.265则可以实现利用1~2Mbps的传输速度传送720P(分辨率1280720)普通高清音视频传送。
H.265允许以有限的带宽进行更高质量的网络视频传输,只需要一半的带宽就可以播放相同质量的视频。这意味着我们的移动设备,如智能手机和平板电脑,将能够直接在线流式传输全高清1080p视频。
H.264是很多人使用和喜欢的一种老方法,它的硬件兼容性更好,适用于大多数视频和设备,适用于Netflix和YouTube等流媒体服务。
H.265是一种比H.264更好的新方法,它可以使视频文件的大小只有H.264的一半,并且具有相同的视频质量,它还可以处理具有更多细节和清晰度的高质量视频。
但是,H.265并不像H.264那样容易相处。它需要更多的电源和时间才能工作。它不像H.264那样流行,可能与某些设备不兼容。(当然,这种对设备性能依赖的不兼容会随着时代的进步设设备的迭代而抹除 )
从上表可以看出,在大多数方面,H.265都优于H.264,尤其是仅考虑性能时,H.265的性能明显的优于H.264,与H.264(AVC)相比,H.265(HEVC)提供了更广泛的用于降低比特率的工具,根据许多质量测试,与H.264相比,H.265可以将视频流大小缩小39-44%。
介绍到这里,对于视H.264和H.265的简单介绍和区别就讲完了,接下来是些很底层的原理知识了,到这里我已经看不到了,哈哈~不做视频编码研究和开发的同学就不建议往下阅读了
前面介绍H.264和H.265差异的时候介绍了块,我们可以更进一步沿着块区了解视频编码的知识——帧
每一帧的图片就是由无数的块组成,在大家知道块的概念后,就可以由此引出视频编码的各种原理了,首先我们可以将帧分为三种:I帧,P帧还有B帧。
还有一个概念,叫做GOP。GOP是一组图像序列(GOP的划分思路在下面帧间压缩里会提及),在这一组序列中,上面所说的三个帧都存在。
「帧内压缩技术」是在关键帧中执行的压缩方案,有点类似于图片压缩,一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测,找出与原图最接近的一种预测模式。
假设现在是按顺序来编码,第一行已经完全编完,⑤也编完了,正要压缩⑥这一块。可以看出,它周围的①②③④⑤,跟⑥简直一模一样啊,如果能用①②③④⑤来推测⑥是什么图像,显然比只压缩⑥要节省空间,这就是帧内预测。
然后将「原始图像与帧内预测后的图像相减得残差值」与我们之前得到的「预测模式信息」一起保存起来,这样我们就可以在解码时恢复原图了。
大家看电影的时候应该都有感受过,有的时候镜头在一个场景下变化缓慢,每一帧图片之间几乎没有变化,这个时候再储存每一张图片,即使是压缩过后的图片,也是得不偿失。
结合基于块的编码的概念,我们可以得到一种叫做「块匹配」的东西,就是找找看前面已经编码的几帧里面,和我当前这个块最类似的一个块,这样我就不用编码当前块的内容了,只需要编码当前块和我找到的那个块的差(称为残差)就可以了。
找最像的块的过程叫「运动估计」
用残差和原来的块就能推算出当前块是什么样儿的,这个过程叫「运动补偿」
基于块的运动估计可以用来比较两个帧之间的相似度,从而可以提炼出一个场景,在这个场景中帧间变化并不大,一般「有差别的像素只有10%以内,亮度差值变化不超过2%,而色度差值的变化只有1%以内」,我们认为这样的场景,也就是图的集合可以分到一组,这就是上面所说的GOP的划分标准,这样也就是运动估计的过程了。
在确定了GOP后,如同上面所说,I帧进行了帧内预测后,每个P帧会根据之前的I、P帧来进行预测,这种预测就是运动补偿:
几十帧的数据都可以用同一幅画面描绘出来,再根据运动补偿信息,计算出剩下的画面。
(从这里开始,已经有点看不懂了 )
经过帧内与帧间的压缩后,虽然数据有大幅减少,但还有优化的空间。可以将残差数据做整数离散余弦变换(DCT),去掉数据的相关性,进一步压缩数据。
所谓的DCT,就是一种基于傅里叶变换的变换,目的就是为了将离散的残差数据聚集集中,关键信息变得少。
比如将一些离散的数据都聚集到一定的频率上,从而减少数据的相关性,提升压缩质量
H264中的变换基本与DCT相似,这种方法的优点在于:在编码器与解码器中允许精度相同的变换和反变换
CABAC是在Main和High profile中可获得的一种可选的熵编码模式。CABAC通过下面的方式可以获得较高的压缩性能。
简而言之,CABAC也是给高频数据短码,给低频数据长码。同时还会根据上下文相关性进行压缩。具体实现涉及到一些数学过程,这里不做过多介绍
基本上这就是h264大致的编码原理了,对此非常感兴趣的同学,建议去查看知乎原文。
发现有 266 了
感谢分享
赞一个
学到啦
咱们一般感兴趣的就了解一句话就行了:H264的兼容性更好,对硬件要求不高。H265性能更强,需要的存储成本更低,但是对设备要求更高。
Popular Events
我们在一些视频播放器、安卓手机上经常看到视频的编码和解码,有硬件解码,也有软件解码,有.H264也有H.265,今天就扒一扒,和大家一起学习下视频编码技术。
硬解码和软解码
视频编码(手机相机视频录制):
视频解码(达芬奇16):
一、什么是视频编码
所谓视频编码就是通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。视频编码就是压缩视频,一个视频所包含的信息量实在是太大,尤其是在现在4k甚至8k视频都开始流行的情况下,视频编码显得更为重要。特别是现在直播,短视频的火热,没有一个好的编解码过程,是负担不起这么大额度的带宽和流量传输的。
简而言之:视频编码是压缩视频和减少传输带宽和存储空间需求所必需的。
二、什么是H.264(AVC)
H264是一个基于块的视频编码技术。什么是块呢,先从宏块说起,宏块是一部分像素阵列和对应信息的组合体,H264的核心就是将每一帧的图片划分成大小不等的宏块组合,再从中以块细分,然后再对每个宏块进行编码。
宏块:
宏块的大小都是16x16,但是为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。
宏块中的子块:
H.264将每个视频图片划分为小块(最多16x16像素),然后将这些块与上一张和下一张图片进行比较,以找到保存它们的最佳方法。播放视频时,使用相同的比较将块放回一起,这使视频看起来流畅清晰。
H.264的主要优点是其优越的数据压缩率,H.264不仅提供了高压缩比,还提供了高质量、平滑的图像。在相同的图像质量条件下,H.264提供的压缩比是MPEG-2的两倍多,是MPEG-4的1.5到2倍。
例如,如果原始文件的大小为 100GB,则使用MPEG-2标准进行压缩会将其减少到4GB,压缩比为25:1。然而,使用H.264压缩标准将其压缩到 980MB,实现了102:1的惊人压缩比,从 100GB降低到 980MB。
H.264的高压缩比在低比特率应用中起着至关重要的作用,即使在低速下也能使视频看起来有很好的观看体验。与MPEG-2和MPEG-4等压缩技术相比,H.264显著节省了用户的下载时间和数据使用费,这就是为什么用H.264压缩的视频数据在网络传输过程中需要更少的带宽,使其更经济。它适用于在线播放视频或将其保存在DVD或蓝光等磁盘上,H.264它也被称为AVC或MPEG-4。
由于苹果公司做出了大胆的决定,放弃了Adobe的VP6编码,选择了H.264,这一标准与数亿台iPad和iPhone一起进入了数百万家庭。它已经成为视频编码领域的绝对领导者,市场份额超过80%。
三、什么是H.265(HEVC)
H.265是一种使视频文件更小、更好的新方法,它也被称为HEVC或MPEG-H第2部分。与旧的H.264相比,H.265可以用更少的空间保留更多的细节和颜色,可以制作高质量、高达8K、亮度和对比度更高的视频。
H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进,使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。(提高压缩效率、提高鲁棒性和错误恢复能力、减少实时的时延、减少信道获取时间和随机接入时延、降低复杂度等)
H.264宏块只有16x16,但H.265最大可达到64x64。
很多研究都展示出更大的树编码块可以提供更高的压缩效率(同样也需要更高的编码速度)。每个树编码块可以被递归分割,利用四叉树结构,分割为32×32、16×16、8×8的子区域,下图就是一个64×64树编码块的分区示例:
H.265不使用固定块来保存视频图片,它使用可以改变大小和形状的灵活单元,这使它更加智能和准确。
H.264可以以低于1Mbps的速度实现标清(分辨率在1280P720以下)数字图像传送;H.265则可以实现利用1~2Mbps的传输速度传送720P(分辨率1280720)普通高清音视频传送。
H.265允许以有限的带宽进行更高质量的网络视频传输,只需要一半的带宽就可以播放相同质量的视频。这意味着我们的移动设备,如智能手机和平板电脑,将能够直接在线流式传输全高清1080p视频。
四、总结:H.264余H.265对比
H.264是很多人使用和喜欢的一种老方法,它的硬件兼容性更好,适用于大多数视频和设备,适用于Netflix和YouTube等流媒体服务。
H.265是一种比H.264更好的新方法,它可以使视频文件的大小只有H.264的一半,并且具有相同的视频质量,它还可以处理具有更多细节和清晰度的高质量视频。
但是,H.265并不像H.264那样容易相处。它需要更多的电源和时间才能工作。它不像H.264那样流行,可能与某些设备不兼容。(当然,这种对设备性能依赖的不兼容会随着时代的进步设设备的迭代而抹除 )
从上表可以看出,在大多数方面,H.265都优于H.264,尤其是仅考虑性能时,H.265的性能明显的优于H.264,与H.264(AVC)相比,H.265(HEVC)提供了更广泛的用于降低比特率的工具,根据许多质量测试,与H.264相比,H.265可以将视频流大小缩小39-44%。
介绍到这里,对于视H.264和H.265的简单介绍和区别就讲完了,接下来是些很底层的原理知识了,到这里我已经看不到了,哈哈~不做视频编码研究和开发的同学就不建议往下阅读了
视频编码的原理(基于H.264)
前面介绍H.264和H.265差异的时候介绍了块,我们可以更进一步沿着块区了解视频编码的知识——帧
视频帧
每一帧的图片就是由无数的块组成,在大家知道块的概念后,就可以由此引出视频编码的各种原理了,首先我们可以将帧分为三种:I帧,P帧还有B帧。
还有一个概念,叫做GOP。GOP是一组图像序列(GOP的划分思路在下面帧间压缩里会提及),在这一组序列中,上面所说的三个帧都存在。
帧内压缩技术
「帧内压缩技术」是在关键帧中执行的压缩方案,有点类似于图片压缩,一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测,找出与原图最接近的一种预测模式。
假设现在是按顺序来编码,第一行已经完全编完,⑤也编完了,正要压缩⑥这一块。可以看出,它周围的①②③④⑤,跟⑥简直一模一样啊,如果能用①②③④⑤来推测⑥是什么图像,显然比只压缩⑥要节省空间,这就是帧内预测。
然后将「原始图像与帧内预测后的图像相减得残差值」与我们之前得到的「预测模式信息」一起保存起来,这样我们就可以在解码时恢复原图了。
帧间压缩技术
大家看电影的时候应该都有感受过,有的时候镜头在一个场景下变化缓慢,每一帧图片之间几乎没有变化,这个时候再储存每一张图片,即使是压缩过后的图片,也是得不偿失。
结合基于块的编码的概念,我们可以得到一种叫做「块匹配」的东西,就是找找看前面已经编码的几帧里面,和我当前这个块最类似的一个块,这样我就不用编码当前块的内容了,只需要编码当前块和我找到的那个块的差(称为残差)就可以了。
找最像的块的过程叫「运动估计」
用残差和原来的块就能推算出当前块是什么样儿的,这个过程叫「运动补偿」
基于块的运动估计可以用来比较两个帧之间的相似度,从而可以提炼出一个场景,在这个场景中帧间变化并不大,一般「有差别的像素只有10%以内,亮度差值变化不超过2%,而色度差值的变化只有1%以内」,我们认为这样的场景,也就是图的集合可以分到一组,这就是上面所说的GOP的划分标准,这样也就是运动估计的过程了。
在确定了GOP后,如同上面所说,I帧进行了帧内预测后,每个P帧会根据之前的I、P帧来进行预测,这种预测就是运动补偿:
几十帧的数据都可以用同一幅画面描绘出来,再根据运动补偿信息,计算出剩下的画面。
从压缩产生的残差讲讲DCT和CABAC
(从这里开始,已经有点看不懂了 )
经过帧内与帧间的压缩后,虽然数据有大幅减少,但还有优化的空间。可以将残差数据做整数离散余弦变换(DCT),去掉数据的相关性,进一步压缩数据。
所谓的DCT,就是一种基于傅里叶变换的变换,目的就是为了将离散的残差数据聚集集中,关键信息变得少。
比如将一些离散的数据都聚集到一定的频率上,从而减少数据的相关性,提升压缩质量
H264中的变换基本与DCT相似,这种方法的优点在于:在编码器与解码器中允许精度相同的变换和反变换
CABAC是在Main和High profile中可获得的一种可选的熵编码模式。CABAC通过下面的方式可以获得较高的压缩性能。
简而言之,CABAC也是给高频数据短码,给低频数据长码。同时还会根据上下文相关性进行压缩。具体实现涉及到一些数学过程,这里不做过多介绍
基本上这就是h264大致的编码原理了,对此非常感兴趣的同学,建议去查看知乎原文。