RTMP协议以及提取RTMP视频流组成H264视频文件


首先我们获得h264的流,在监听里,我们通过参数可以获得RTMP IStreamPacket,调用getData()方法直接获得包数据 放入IOBuffer。以下是提取并修改数据存成h264文件的步骤

1. 添加监听 IStreamListener

2. 通过IOBuffer的put函数将每次获得的包数据放入新的IObuffer

3. 在流结束时将IOBuffer存成文件

4. 用工具,如UltraEdit打开文件,查看里面的数据并分析

5. 根据分析结果修改程序,提取h264视频文件所需的数据并存储

 

1.RTMP协议

RTMP协议封包由一个包头和一个包体组成,包头可以是4种长度的任意一种:12, 8, 4,  1 byte(s).完整的RTMP包头应该是12bytes,包含了时间戳,AMFSize,AMFType,StreamID信息, 8字节的包头只纪录了时间戳,AMFSize,AMFType,其他字节的包头纪录信息依次类推 。包体最大长度默认为128字节,通过chunkSize可改变包体最大长度,通常当一段AFM数据超过128字节后,超过128的部分就放到了其他的RTMP封包中,包头为一个字节.
完整的12字节RTMP包头每个字节的含义:

用途

大小(Byte)

含义

Head_Type

1

包头

TiMMER

3

时间戳

AMFSize

3

数据大小

AMFType

1

数据类型

StreamID

4

ID


1.1 Head_Type
第一个字节Head_Type的前两个Bit决定了包头的长度.它可以用掩码0xC0进行""计算
Head_Type
的前两个Bit和长度对应关系:

Bits

Header Length

00

12 bytes

01

8 bytes

10

4 bytes

11

1 byte


Head_Type 的后面 6 Bit StreamID 决定了 ChannelID   StreamID ChannelID 对应关系: StreamID=(ChannelID-4)/5+1  参考 red5

ChannelID

Use

02

Ping 和ByteRead通道

03

Invoke通道 我们的connect() publish()和自字写的NetConnection.Call() 数据都是在这个通道的

04

Audio和Vidio通道

05 06 07

服务器保留,经观察FMS2用这些Channel也用来发送音频或视频数据


例如在rtmp包里面经常看到的0xC2,就表示一字节的包头,channel=2.

1.2 TiMMER
TiMMER
3个字节纪录的是时间戳,音视频流的时间戳是统一排的。可分为绝对时间戳和相对时间戳。
fms
对于同一个流,发布的时间戳接受的时间戳是有区别的
publish
时间戳,采用相对时间戳,时间戳值等于当前媒体包的绝对时间戳与上个媒体包的绝对时间戳之间的差距,也就是说音视频时间戳在一个时间轴上面.单位毫秒。
play
时间戳,相对时间戳,时间戳值等于当前媒体包的绝对时间戳与上个同类型媒体包的绝对时间戳之间的差距,也就是说音视频时间戳分别为单独的时间轴,单位毫秒。
flv
格式文件时间戳,绝对时间戳,时间戳长度3个字节。超过0xFFFFFF后时间戳值等于TimeStamp &0xFFFFFF</

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值