• rtp传输h264


    ---恢复内容开始---

    基本概念的理解

    H.264的主要目标:
    1.高的视频压缩比
    2.良好的网络亲和性

    解决方案:
    VCL video coding layer 视频编码层
    NAL network abstraction layer 网络提取层

    VCL:核心算法引擎,块,宏块及片的语法级别的定义
    NAL:片级以上的语法级别(如序列参数集和图像参数集),同时支持以下功能:独立片解码,起始码唯一保证,SEI以及流格式编码数据传送

    VCL设计目标:尽可能地独立于网络的情况下进行高效的编解码
    NAL设计目标:根据不同的网络把数据打包成相应的格式,将VCL产生的比特字符串适配到各种各样的网络和多元环境中。

    NALU头结构:NALU类型(5bit)、重要性指示位(2bit)、禁止位(1bit)。
    NALU类型:1~12由H.264使用,24~31由H.264以外的应用使用。
    重要性指示:标志该NAL单元用于重建时的重要性,值越大,越重要。
    禁止位:网络发现NAL单元有比特错误时可设置该比特为1,以便接收方丢掉该单元。

    2.NAL语法语义

    NAL层句法:
    在编码器输出的码流中,数据的基本单元是句法元素。
    句法表征句法元素的组织结构。
    语义阐述句法元素的具体含义。

    分组都有头部,解码器可以很方便的检测出NAL的分界,依次取出NAL进行解码。
    但为了节省码流,H.264没有另外在NAL的头部设立表示起始位置的句法元素。

    如果编码数据是存储在介质上的,由于NAL是依次紧密相连的,解码器就无法在数据流中分辨出每个NAL的起始位置和终止位置。

    解决方案:在每个NAL前添加起始码:0X000001
    在某些类型的介质上,为了寻址的方便,要求数据流在长度上对齐,或某个常数的整数倍。所以在起始码前添加若干字节的0来填充。

    检测NAL的开始:

    0X000001和0X00000001
    我们必须考虑当NAL内部出现了0X000001和0X000000
    解决方案:

    H.264提出了“防止竞争”机制:
    0X000000——0X00000300
    0X000001——0X00000301
    0X000002——0X00000302
    0X000003——0X00000303

    为此,我们可以知道:
    在NAL单元中,下面的三字节序列不应在任何字节对齐的位置出现
    0X000000
    0X000001
    0X000002

    3.H.264的NAL层处理
    NAL以NALU(NAL unit)为单元来支持编码数据在基于分组交换技术网络中传输。
    它定义了符合传输层或存储介质要求的数据格式,同时给出头信息,从而提供了视频编码和外部世界的接口。

    NALU:定义了可用于基于分组和基于比特流系统的基本格式。

    参考:

    https://blog.csdn.net/justmeloo/article/details/42065895

    帧格式

    H264帧由NALU头和NALU主体组成。
    NALU头由一个字节组成,它的语法如下:

          +---------------+
          |0|1|2|3|4|5|6|7|
          +-+-+-+-+-+-+-+-+
          |F|NRI|  Type   |
          +---------------+

    F: 1个比特.
      forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.

    NRI: 2个比特.
      nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放,0~3,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。

    Type: 5个比特.
      nal_unit_type. 这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用,简述如下:

      0     没有定义
      1-23  NAL单元  单个 NAL 单元包
      1     不分区,非IDR图像的片
      2     片分区A
      3     片分区B
      4     片分区C
      5     IDR图像中的片
      6     补充增强信息单元(SEI)
      7     SPS
      8     PPS
      9     序列结束
      10    序列结束
      11    码流借宿
      12    填充
      13-23 保留

      24    STAP-A   单一时间的组合包
      25    STAP-B   单一时间的组合包
      26    MTAP16   多个时间的组合包
      27    MTAP24   多个时间的组合包
      28    FU-A     分片的单元
      29    FU-B     分片的单元
      30-31 没有定义

    参考:

    https://www.cnblogs.com/yjg2014/p/6144977.html

    rtp 协议

    下面的文章很好的介绍了 rtp协议和使用。

    https://blog.51cto.com/ticktick/350142

    https://blog.51cto.com/ticktick/462746

    https://blog.csdn.net/bripengandre/article/details/2238818

    应用与实现

    rtp传输h264代码:  https://github.com/tong123/rtp_stream/blob/master/dateoritheard.cpp 

    https://github.com/MrsZ/RtpSend

    两者可以对比看。 

  • 相关阅读:
    android中使用百度定位sdk实时的计算移动距离
    Android NDK开发常见错误
    cocos2dx中使用iconv转码(win32,iOS,Android)
    史上最全的CSS hack方式一览
    谈谈SQL 语句的优化技术
    PIVOT 和 UPIVOT 的使用(行转列)
    JQuery的Ajax跨域请求的解决方案
    64位windows2003 未在本地计算机上注册 microsoft.jet.oledb.4.0 提供程序
    httpModules 与 httpHandlers
    删除事件查看器中多余的日志分类
  • 原文地址:https://www.cnblogs.com/swing07/p/10875983.html
Copyright © 2020-2023  润新知