音视频及H264/H256编码相关原理

一、音视频封装格式原理:

          我们播放的视频文件一般都是用一种封装格式封装起来的,封装格式的作用是什么呢?一般视频文件里不光有视频,还有音频,封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式,看有哪些视频流和哪些音频流,此时的音频流和视频流都还是压缩数据,不能直接用于显示的,这就需要解码。

        

        如FFmpeg 视频文件就是一个容器 (视频流(H264) 音频流(aac))。

      1、视频文件封装格式:

          封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者大家把它当成一个放视频轨和音频轨的文件夹也可以。

      2、音视频编码方式:

  • 视频编码方式:将视频像素数据(RGB,YUV 等)压缩成视频码流,从而降低视频的数据量。包含有HEVC(H265)、H264、MPEG4、MPEG2、VP9等;
  • 音频编码方式:将音频采样数据(PCM 等)压缩成音频码流,从而降低音频的数据量。包含有AAC、MP3、WMV、AC-3。

       3、编解码方式和封装格式的关系:

                「视频封装格式」= 视频 + 音频 +视频编解码方式 等信息的容器。

       4、RGB/YUV概念:

        通常我们采用RGB模型来表示颜色,RGB模型中,每种颜色需要3个数字分别表示R、G、B,每个数字占用1个bit字节,这样总共需要24bits

        YUV能更高效颜色模型用更少的bit来表示颜色,Y——表示亮度,也就是灰阶值,U和V表示色度分量。

  •  YCbCr颜色模型基本原理:

        假设我们定义一个 「亮度(Luminance)」 的概念来表示颜色的亮度,那它就可以用含 R、G、B 的表达式表示为:

    Y = kr*R + kg*G + kb*B

        Y 即「亮度」,kr、kg、kb 即 R、G、B 的权重值。

        可以定义一个 「色度(Chrominance)」 的概念来表示颜色的差异

    Cr = R – YCg = G – YCb = B – Y

        Cr、Cg、Cb 分别表示在 R、G、B 上的色度分量.。

  • YUV:关键是在于它的亮度信号 Y 和色度信号 U、V 是分离的,那就是说即使只有 Y 信号分量而没有 U、V 分量,我们仍然可以表示出图像,只不过图像是黑白灰度图像。在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量。
  • YCbCr 与 RGB 相互转换的公式:
    Y = 0.299R + 0.587G + 0.114BCb = 0.564(B - Y)Cr = 0.713(R - Y)R = Y + 1.402CrG = Y - 0.344Cb - 0.714CrB = Y + 1.772Cb

        

二、H264编码框架:

         视频编码方式就是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式的文件的方式。H.264和H265编码是目前视频格式中用得最广泛的编码方式,H.264创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/4、1/8)和新一代的环路滤波器,使得压缩性能大大提高,系统更加完善。H.265是ITUTVCEG继H.264之后所制定的新的视频编码标准。H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关技术加以改进。H.265旨在在有限的带宽下传输更高质量的网络视频,仅需要原先的一半带宽即可播放相同质量的视频。

        1、H264码流文件分层:

  • VCL(Video Coding Layer,视频编码层):负责高效的视频内容表示,VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。
  • NAL(Network AbstractionLayer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和传送,是传输层。不管是在本地播放还是在网络上播放,都要通过这一层来传输。

        2、H264编码原理:

  •  H.264/AVC并未明确表述一个编解码器如何实现,而是规定了一个编码的视频比特流的句法和该比特流的解码方法,因此在实现上有较大的灵活性。H264和以前的H261、H.263、MPEG-1、MPEG-4 等的编解码器功能模块的组成类似,不同的部分是其内部各功能模块的细节部分,H.264编解码器的功能组成如下:

        

  •  H.264/AVC 编解码器的工作原理。H.264编码器采用变换和预测混合编码方式。编码时,首先输入的帧或场Fn以宏块为单位被编码器处理。宏块有帧内和帧间两种模式。帧内模式使用当前帧内已编码的宏块进行预测。帧间模式使用以往一个或多个帧作为参考进行运动预测。然后,对预测值和原始值的差值进行变换、量化、重新排序和编码,对量化系统X进行逆量化、逆变换后,与预测系统相加,得到未经滤波的uF*帧,对uF*帧进行块间滤波,得到当前重构帧 Fn*。而解码过程相对比较简单,对于编码器的各部分进行逆向操作,结果经逆量化、逆变换后通过滤波器得到重构输出图像。H.264编解码器工作原理如图:

        

         3、H264码流分析:

        H264码流的结构中包含 :H264视频序列——图像——片组——片——NALU——宏块 ——像素。从大到小排序               

  • H264编码格式:在 VCL数据传输或存储之前,这些编码的VCL数据先被映射或封装进NAL单元中。每个NAL单元包括一个原始字节序列负载(RBSP,RawByteSequencePayload)和一组对应于视频编码的 NAL 头信息。RBSP的基本结构:在原始编码数据的后面添加了结尾标记,一个比特“1”和若干比特“0”,以便字节对齐。H.264码流NAL单元序列如图        
  •  NAL Header:NAL头由一个字节组成,禁止位(1位)、重要性指示位(2位)、NALU类型(5位)。         

        

  •  RBSP:包括一系列的NAL单元,每个NAL单元包含一个RBSP。典型的RBSP单元序列。每个单元都按独立的NAL单元传送。NAL单元的信息头(1字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。        

     

  • SODB ,String Of Data Bits 原始数据比特流:因为它是流的形式,所以长度不一定是8倍数,它是由 VLC 层产生的。由于我们计算机是以8倍数去处理数据所以计算机在处理H264时,就需要 RBSP。
  • RBSP,SODB + tailing bits (原始字节序列载荷):由于它是一个压缩流,SODB 不知道是在何处结束,所以算法在SODB最后一位补一个1,没有按字节对齐的则补 0。
  • EBSP (扩展字节序列载荷):在生成压缩流之后,在每一帧的开头加一个起始位,这个起始位一般是 00 00 00 01 或者是 00 00 01。所以在h264码流中规定每有两个连续的00 00,就增加一个0x03。
  • EBSP 和 RBSP的区别:NALU的组成部分为(NALU = NALU Header + RBSP),严格来说NALU的组成部分为(NALU = NALU Header + EBSP);
  •  NALU单元中的参数集:SPS(序列参数集)作用于一系列连续的编码图像;PSS(图像参数集)作用于编码视频序列中一个或多个独立的图像。参数集是一个独立的数据单位,不依赖于参数集外的其他句法元素。一个参数集不对应某个特定的图像或序列,同一序列参数集可以被一个或者多个图像参数集引用。同理,同一个图像参数集也可以被一个或者多个图像引用只在编码器认为需要更新参数集的内容时,才会发出新的参数集。         
  •  NALU中的视频帧:生成的H264视频帧是由多个切片组成的。一个H264的帧至少由一个切片组成,不能没有切片,可以是一个到多个不能没有。在网络传输的时候一个H264帧可能需要切开去传,一个一次传不完,这就按照切片来切。每一个切片组成一个NAL Unit。
  • 切片与宏块的关系:在切片数据中,包含若干个宏块。在一个宏块中,又包含了宏块类型、宏块预测、残差数据。

        4、H264码流结构图:        

         5、H264码流NAL单元解码流程:

        首先从NAL单元中提取出RBSP语法结构,然后按照下图所示的流程处理RBSP语法结构。输入的是NAL单元,输出结果是经过解码的当前图像的样值点。 NAL单元中分别包含了序列参数集和图像参数集。图像参数集和序列参数集在其他NAL单元传输过程中作为参考使用,在这些数据NAL单元的片头中,通过语法元素pic_parameter_set_id设置它们所使用的图像参数集编号;而相应的每个图像参数集中,通过语法元素seq_paramter_set_id设置他们使用的序列参数集编号。        

         6、H264解码详解:

         H264是新一代的编码标准,以高压缩高质量和支持多种网络的流媒体传输著称,在编码方面,我理解的他的理论依据是:参照一段时间内图像的统计结果表明,在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内。所以对于一段变化不大图像画面,我们可以先编码出一个完整的图像帧A,随后的B帧就不编码全部图像,只写入与A帧的差别,这样B帧的大小就只有完整帧的1/10或更小!B帧之后的C帧如果变化不大,我们可以继续以参考B的方式编码C帧,这样循环下去。这段图像我们称为一个序列(序列就是有相同特点的一段数据),当某个图像与之前的图像变化很大,无法参考前面的帧来生成,那我们就结束上一个序列,开始下一段序列,也就是对这个图像生成一个完整帧A1,随后的图像就参考A1生成,只写入与A1的差别内容。

  • GOP:在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以I帧开始,到下一个I帧结束。 

  • GOP序列说明:在 H.264协议里定义了3种帧,完整编码的帧叫I帧,参考之前的I帧生成的只对差异部分进行编码的帧叫P帧,还有一种参考前后的帧进行编码的帧叫B帧。在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流,以帧开始,到下一个I帧结束,中间部分也被称为一个GOP。一个序列的第一个图像叫作IDR图像(立即刷新图像),IDR图像都是I帧图像。H.264引入IDR图像是为了解码的重新同步,当解码器解码到IDR图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找下一个参数集,开始解码一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以是一个Ⅰ帧,然后一直是P帧、B帧。当运动变化多时,一个序列可能会比较短,比如只包含一个I和几个P、B帧。
  •  I帧:指帧内编码帧,I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)。特点如下:
    1. 它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
    2. 解码时仅用I帧的数据就可以重构完整图像;
    3. I帧描述了图像背景和运动主体的详情;
    4. I帧不需要参考其他画面生成;
    5. I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各的质量);
    6. I帧是帧组GOP的基础帧(第1帧),在一组中只有一个I帧;
    7. I帧不需要考虑运动矢量;
    8. I帧所占数据的信息量比较大。
  • P帧的预测与重构:P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。 P帧特点如下::
    1. P帧是I帧后面相隔1~2帧的编码帧;
    2. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差);
    3. 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像;
    4. P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
    5. P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧;
    6. 由于P帧是参考帧,它可能造成解码错误的扩散; 7.由于是差值传送,P帧的压缩比较高。
  • B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌上架,个人号比企业号好上?“14+20”封测如何解决,你知道了吗

在Google Play上架应用,对开发者而言,既是挑战也是机遇。随着谷歌政策的不断更新,特别是要求2023年11月13日后注册的个人开发者账号在发布正式版应用前,必须经过20人连续14天的封闭测试。 这一政策的改变使得许多开发者开始考虑使…

什么是物联网通信网关?-天拓四方

在信息化、智能化的时代,物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备,将现实世界与数字世界紧密相连,从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分,物联网通信…

【数据结构】堆(Heep)

✨✨✨专栏:数据结构 🧑‍🎓个人主页:SWsunlight 目录 一、堆: 定义: 性质: 大、小根堆: 二、实现堆(完全二叉树): 前言: …

四、Filter

Filter简介 Filter 的基本功能是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理的前后实现一些特殊的功能.在Servlet API 中定义了三个接口类来供开发人员编写Filter 程序:Filter,FilterChain,FilterConfigFilter 程序是一个实现了…

Spring:Spring事务失效的各种场景以及解决方法

一、前言 Spring事务是指Spring框架中提供的事务管理功能,它可以帮助开发者简化事务管理的复杂性,提高代码的可维护性和可扩展性。本文将总结并分析Spring事务失效的各种场景,帮助你全面了解事务失效的原因和解决方案。 二、Spring事务失效的…

51汇编--数码管显示

;将内部RAM30H~32H单元中存储的6位十进制数显示在6个数码管上。 ;要求编写将一个内存单元中的压缩BCD码转换为两个七段显示码的子程序和 ;延时子程序。不允许在程序中给30H、31H和32H单元赋值,要通过存 ;储器窗口赋值。尝试改变点亮数码管的时间&#xf…

Linux软硬链接及动静态库

软硬链接与动静态库 软连接 创建链接的方法: ln -s test1.txt test2.txt 其中ln 是link(链接),-s 是soft(软),后者链接前者。 此时打开test2.txt,发现其中内容与test.txt一致。那么软连接到底建立了什么联系?…

轻松购物,尽在购物网

在忙碌的生活中,想要找到心仪的商品,却总是苦于没有时间和精力去实体店挑选?别担心,购物网为您提供一站式的购物体验。无论是时尚服饰、家居用品,还是美食特产,这里都能满足您的需求。只需轻轻一点&#xf…

监听element-ui表格滚动事件

当element-ui表格高度写死之后,表格内容超出高度就会在右侧显示滚动条,监听滚动事件 首先给表格加ref,ref"refTable" 然后在mounted生命周期里写监听事件 mounted() {this.$refs.refTable.$el.onwheel (e) > {console.log(滚…

深入解析线程上下文切换的原理与优化策略

深入解析线程上下文切换的原理与优化策略 定义触发条件线程上下文切换的过程线程上下文切换的开销减少上下文切换的方法示例代码总结 线程上下文切换(Thread Context Switch)是操作系统调度机制的重要组成部分。它涉及保存当前线程的状态并恢复新线程的状…

vue中使用ant的rangePicker设置禁选时间和时间格式

<a-range-pickerstyle"width: 100%":disabled-date"disabledDate"v-model:value"time"valueFormat"YYYY-MM-DD" />valueFormat设置时间格式YYYY-MM-DD 通过dayjs获取时间&#xff0c;return过滤后的时间 const disabledDate (…

安装apex时遇到的问题

Apex是混合精度库&#xff0c;安装过程中常常出现各种问题&#xff0c;在此记录一下 首先&#xff0c;不能使用pip install apex,这是两个完全不同的库&#xff0c;需要去官网下载 其次&#xff0c;参考官网安装时可能会报错&#xff1a;could not build wheels for apex, whic…

C/C++运行时库和UCRT系统通用运行时库总结及问题实例分享

目录 1、概述 2、不同版本的Visual Studio对应的运行时库说明 3、在Windbg10.0安装目录中获取UCRT通用运行时库 4、微软官网对UCRT通用运行时库的相关说明 5、使用Visual Studio 2017开发软件初期遇到的UCRT通用运行时库问题 6、如何查看软件依赖了哪些C/C运行时库&#…

后端雪花算法主键ID传到前端变了

Mybatis Plus 的主键策略&#xff1a; /*** id*/TableId(type IdType.ASSIGN_ID)private Long id; 这个主键策略会用雪花算法生成一个 19位的ID&#xff0c;比如 1791006670084734978 现象 后端生成的 id 是正常的&#xff0c;通过 swagger 文档此时获取到的 id 也和数据库中…

leetcode-盛水最多的容器-109

题目要求 思路 1.正常用双循环外循环i从0开始&#xff0c;内循环从height.size()-1开始去计算每一个值是可以的&#xff0c;但是因为数据量太大&#xff0c;会超时。 2.考虑到超时&#xff0c;需要优化一些&#xff0c;比如第一个选下标1&#xff0c;第二个选下标3和第一个选下…

Java 面试题日常练习

### 基础知识 1. **什么是 JVM&#xff1f;解释其架构。** - JVM&#xff08;Java Virtual Machine&#xff09;是 Java 程序的运行时环境。其架构包括类加载器子系统、运行时数据区&#xff08;堆、栈、本地方法栈、PC 寄存器、方法区&#xff09;、执行引擎和本地方法接口…

心识宇宙 x TapData:如何加速落地实时数仓,助力 AI 企业智慧决策

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量代替 OGG、DSG 等同步工具&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业将真正具有业务价值的数据作用到实处&#xff0c…

基于springboot实现华府便利店信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现华府便利店信息管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本华府便利店信息管理系统就是在这样的大环境下诞生&#xff…

电影《朝云暮雨》观后感

上周看了电影《朝云暮雨》&#xff0c;看完之后&#xff0c;感觉自己整个人都不太好了&#xff0c;也不是说电影太差&#xff0c;只是觉得电影没有传达正能量&#xff0c;让人很不舒服。 &#xff08;1&#xff09;演技在线 对于著名的演员“范伟”&#xff0c;或者说&#x…

Payload SDK dji

开发硬件 感谢您的耐心等待&#xff0c;建议您可以考虑下树莓派4B或Jetson Nano开发板&#xff0c;看您需求选择&#xff0c;OSDK即将停止服务&#xff0c;我们建议您使用PSDK来进行开发&#xff0c;PSDK包含了OSDK的功能。Payload SDK 感谢您对大疆产品的支持&#xff01;祝…