rtmp 协议和实现

Flv 格式分析参见:https://blog.****.net/fdsafwagdagadg6576/article/details/109471979

目录
0 rtmp 基础
1 rtmp 消息格式 
2 消息流程
3  实例分析:项目使用librtmp接口
4  QA
5 实现

正文

0 rtmp 基础

h264=nalu1+nalu2+...; 
nalu加上变成了flv tag header变成flv tag. flv = flv tag1+flv tag2+....
flv tag放入chunk data中. rtmp消息=rtmp header + chunk data.

rtmp作用:rtmp是传输flv的流媒体协议.即将音视频包封装成flv tag发送.
Rtmp本质是chunk,数据放入chunk中传输. rtmp基于tcp协议. port is 1935.
librtmp/rtmpdump 是一个用来处理 RTMP 流媒体的工具包.
rtmp使用:https://blog.****.net/fireroll/article/details/18899285

1  rtmp协议:消息格式+流程
1.1  rtmp 消息格式:

rtmp 协议和实现

rtmp 协议和实现

basic header,chunk msg header在1.2节介绍.
timestamp是绝对时间。timestamp delta是增量时间. extend timestamp 略.
chunk data 默认是128 字节.可以通过set chunk size 设置,比如:1M or 2M.

图2 有个错误,
VideoTagHeader 实际h264 header,是video的具体编码类型.

Notes: flv heade固定9个字节.

GeneralTagHeader固定11个字节.它是区分audio和video的. 它实际是videoTagHeader(type is 09) or audioTagHeader(type is 08). stream id 总是0.

videoTagHeader is 固定5个字节,0x17 0x01 0x00 0x00 0x00. audioTagheader is 固定2个字节 , 0xAF 0x01.

1.2 chunk msg header

1) basic header and chunk msg header长度
basic header和chunk msg header都是变长的. basic header 1-3个字节. chunk msg header 0,3,7,11字节.
basic header的前两个2bit决定了,chunk msg header的字节长度是11 bytes,7 bytes,3 bytes还是0 bytes.
basic header的chunk stream id的大小,决定basic header是1 bytes,2 bytes or 3 bytes。如何区分参见:https://blog.****.net/xwjazjx1314/article/details/54863428.
2) chunk msg header
下面的消息图以basic header 1 bytes 为例。basic header 与 4种chunk msg header 的关系.
其中第一个字节是basic header,其他字节是chunk msg header.
chunk msg header作用:它 决定了一个msg 放入一个chunk data ,还是放入多个chunk data.
rtmp 协议和实现

rtmp 协议和实现

rtmp 协议和实现

rtmp 协议和实现

上述图片参见:https://www.jianshu.com/p/3c5b3a48ec88 里面还有抓包分析

1.3  4种chunk msg 应用场景
上面的4副图表示msg0-3 4中消息类型. 
msg0 带有绝对时间,用于发送metadata, 发送第一次 video,audio.
msg3 只有basic header,没有chunk msg header,直接加上chunk data。
用于一个msg被分成多个chunk,第一个chunk 是msg0,后面的chunk 采用msg3的格式。

1.4 basic header和 chunk msg header 关系导图

rtmp 协议和实现

参见:https://blog.****.net/xwjazjx1314/article/details/54863428

1.5 rtmp 包结构

rtmp 协议和实现

 

图1 AVCDecorderConfigurationRecord 是sps/pps.

rtmp 协议和实现

图2 flv video tag is flv video tag header, it is 09 ...... 。h264 is video tag data  前5个字节固定0x17 01 00 00 00.
从协议就能看出来,rtmp发送的是flv的每个tag.不是仅仅发送h264.

2 rtmp 消息流程

协议流程:RTMP流媒体播放过程:握手(handshake),建立连接,建立流,播放.
RTMP_SetupURL--RTMP_EnableWrite--RTMP_Connect--RTMP_ConnectStream

rtmp 协议和实现

相关源码参考:https://www.shangmayuan.com/a/3642fa6d63a54e2ca7dc8e66.html.
上述源码分析通常用不到,仅仅适合调试备用.

3  实例分析:项目使用librtmp接口
rtmp封装h264流程:nalu 第一层添加video tag data header,第二层添加video。
Tag header,第三层添加rtmp header.
然后将msg分包成多个chunk. 参见RTMP_SendPacket

4  主要Rtmp函数分析

RTMP_ReadPacket 源码看是实现组合chunk为一个msg。
https://blog.****.net/lucytheslayer/article/details/79788561
RTMP_ClientPacket 是case 不同消息类型,0x12 metadata,0x09 video,0x08 audio
https://blog.****.net/xwjazjx1314/article/details/54880391
librtmp协议分析---RTMP_SendPacket函数:将一个msg分成多个chunk data发送
https://blog.****.net/xwjazjx1314/article/details/54863428

5  QA: Rtmp 和flv什么关系?

Rtmp是流媒体传输协议,可以传输h264和flv格式的数据.
Flv的Metadata 是怎么通过rtmp传输的呢?Metadata属于script tag,是按照script tag的方式传输的,即header tag is 0x12.
Flv和h264什么关系?
Flv是文件格式,其中的video数据,通常用h264格式(也可以是h265,v8等).
Flv 的本质是flv tag,将每帧封装到一个tag中,而且每个tag都有时间戳,这样也支持点播了.