【流媒体】如何解析RTMP的Chunk Basic Header

本文介绍了如何解析basicheader的内容,重点关注fmt和csid字段。fmt决定MessageHeader的格式,csid标识媒体流通道。解析过程中,针对csid的0、1、2三种情况,分别对应不同长度的BasicHeader。csid为0或1时,会占用额外的字节来表示真实值,而csid为2则预留作底层控制协议。通过解析过程,可以更好地理解协议的实现细节。
摘要由CSDN通过智能技术生成

这里只讨论如何实践,不涉及为什么这么设计

basic由两部分组成,分别是:fmt和csid,其中:

  1. fmt决定了后面MessageHeader的格式,
  2. csid表示一个媒体流通道,( notice:不是一个流,对相同流的推拉一般而言是不同的csid)

下面的代码很好的展示了如何解析basic header的内容,结合代码和rfc,可以更好的理解解析过程。

public class BasicHeader {

    @Getter
    private int fmt;

    @Getter
    private int csid;

    @Getter
    private int byteLength;

    public BasicHeader(byte[] buffer) {
        byteLength = decode(buffer);
    }

    private int decode(byte[] buffer) {
        int headerLength = 1;

        fmt = (buffer[0] & 0xff) >> 6;
        csid = (buffer[0] & 0x3f);

        if (csid == 0) {
            // 2 byte form
            csid = buffer[1] & 0xff + 64;
            headerLength += 1;
        } else if (csid == 1) {
            // 3 byte form
            this.csid = (buffer[2] & 0xff) << 8 + (buffer[1] & 0xff) + 64;
            headerLength += 2;
        }

        return headerLength;
    }
}

不同长度的basic header

解析之前需要先做一个假设,假设Basic Header是一个字节的长度,如图:
在这里插入图片描述
这里csid理论取值是从0-63,但是rfc规定,0,1,2是保留项。

  • 如果我们解析出来是3-63,那么这个就是真实的csid,并且这也是basic header的全部内容。

  • 如果我们解析出来csid = 0,那么实际的Basic Header其实是这个样子的。
    在这里插入图片描述
    占两个字节的长度,这里第二个字节就是真实的csid。为什么标准文档上要减掉64呢?这是因为图中的csid表示的是6 + 8字节的内容,减去64相当于向右平移6个bit,正好就是第二个字节的内容。

  • 如果我们解析出来的csid = 1,那么实际上的Basic Header其实是这个样子的。
    在这里插入图片描述
    占三个字节长度,这里的第二第三个字节就是真实的csid。这里减去64和csid=0的情况是一样的。

  • 最后如果我们解析出来的csid=2,按照rfc的解释:Chunk Stream ID with value 2 is reserved for low-level protocol control messages and commands.
    这个是一个预留给底层控制协议的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值