Giter Club home page Giter Club logo

blog's People

Contributors

liceim avatar

Watchers

 avatar

blog's Issues

H264: From NAL to RTP

最近调试一个WebRTC H264解码的问题,熟悉了H264码率结构及RTP打包协议。这里梳理、总结一下,供以后参考。

H264 NAL(Network Abstraction Layer)

一个H264视频序列就是NALU(NAL Unit)序列组成,如下图:
image
每个NALU包含NALU header和RBSP(Raw Byte Sequence Payload),如下图:
image
F必须为0,NRI表征NALU优先级,NALU Type则如下所示,其中24~31将在下面的RTP打包方法中定义:
image

一.H.264基本流结构

H.264 的基本流(elementary stream,ES)的结构分为两层,包括视频编码层(VCL)和网络适配层(NAL)。视频编码层负责高效的视频内容表示,而网络适配层负责以网络所要求的恰当的方式对数据进行打包和传送。引入NAL并使之与VCL分离带来的好处包括两方面:1、使信号处理和网络传输分离,VCL 和NAL 可以在不同的处理平台上实现;2、VCL 和NAL 分离设计,使得在不同的网络环境内,网关不需要因为网络环境不同而对VCL比特流进行重构和重编码。

☆VCL(Video Coding Layer):VCL是对核心算法引擎,块,宏块及片的语法级别的定义,他最终输出编码完的数据 SODB

☆NAL(Net Abstraction Layer):NAL将SODB打包成RBSP然后加上NAL头,组成一个NALU(NAL单元)

一个典型的NALU如下图所示:
image

SODB(String Of Data Bits):原始数据比特流, 长度不一定是8的倍数,故需要补齐

☆RBSP(Raw Byte Sequence Payload):原始数据字节流,SODB+RBSP trailing bits=RBSP,添加加trailing bits是为了使一个RBSP为整字节数

H.264 的基本流由一系列NALU (Network Abstraction Layer Unit )组成,不同的NALU数据量各不相同。H.264 草案指出,当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001或0x00000001,用来指示一个NALU 的起始和终止位置。在这样的机制下,在码流中检测起始码,作为一个NALU得起始标识,当检测到下一个起始码时,当前NALU结束。

H.264 码流中每个帧的开头的3~4个字节是H.264 的start_code(起始码),0x00000001或0x000001。3字节的0x000001只有一种场合下使用,就是一个完整的帧被编为多个slice(片)的时候,从第二个slice开始,包含这些slice的NALU 使用3字节起始码。也就是说,如果NALU对应的slice为一帧的开始就用0x00000001,否则就用0x000001。

从NALU到RTP

  • 解决的问题:H264码流如何用RTP打包发送接收,即NALU如何与RTP对接。

  • 考虑的因素:
    1. 在MTU的限制内,尽量提高传输效率
    2. 方便generic FEC做丢包补偿

  • RFC6184的方案
    - 打包方法

Single NAL Unit Packet
一个NALU严格对应一个RTP包。
RTP Payload第一个Byte即该slice的NALU header。
如果一个NALU大于MTU,那么OS会把RTP拆成多个UDP发送。
Aggregation Packets
为了提高传输效率,多个NALU组成一个RTP包,如size较小的SPS、PPS。
STAP-A:只能把相同时间的NALU聚合在一个RTP包里
image


https://cloud.tencent.com/developer/article/1055551

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.