一 简介
上接《FFMPEG 之 RTMP 一》,讲解关于RTMP 协议相关的知识。 本文讲解在FFMPEG 中是如何对RTMP 协议进行封装的,相关代码位于rtmproto.c 中,在rtmproto.c 中,它封装了RTMP 协议,相比与librtmp.c 要复杂很多, 前者是对TCP 协议的封装, 后者乃是直接对librtmp.so 的封装。
如下函数乃是开给使用者的API, 我们将以此为切入点,对rtmproto.c 进行分析。
const URLProtocol ff_##flavor##_protocol = { \
.name = #flavor, \
.url_open2 = rtmp_open, \
.url_read = rtmp_read, \
.url_read_seek = rtmp_seek, \
.url_read_pause = rtmp_pause, \
.url_write = rtmp_write, \
.url_close = rtmp_close, \
.priv_data_size = sizeof(RTMPContext), \
.flags = URL_PROTOCOL_FLAG_NETWORK, \
.priv_data_class= &flavor##_class, \
};
二 rtmp_open()
此函数完成五项工作:1 解析输入的Url, 2 封装出送给TCP 的URL, 3 open tcp 流, 4 进行RTMP 握手, 5 发送connet packet,确定客户端信息。具体如下图所示:

1)rtmp_handshake()
当执行rtmp_open() 函数,对应如下图所示的四个网络包。前三个网络包是握手包,也就是rtmp_handshake() 执行完后发送的包。

根据如下函数, 我们可知,RTMP 握手流程如下:1 客户端给服务端 发 C0, C1 包, 2 服务端给客户端:回S0 , S1 包, 3 服务端给客户端回 S2 包,4 客户端给服务端发C2 包,握手结束。
static int rtmp_handshake(URLContext *s, RTMPContext *rt)
{
AVLFG rnd;
uint8_t tosend [RTMP_HANDSHAKE_PACKET_SIZE+1] = {
3,

最低0.47元/天 解锁文章
1700

被折叠的 条评论
为什么被折叠?



