librtmp 源码结构分析

匿名 (未验证) 提交于 2019-12-03 00:22:01

原文地址:http://blog.csdn.net/gengxt2003/article/details/51610546

感谢原作者的贡献

代码在 handshake.h文件中,

该文件中HandShake 函数是处理握手的。

RTMP_Connect():

RTMP_Connect1()。

RTMP_Connect0() 主要是建立Socket连接

建立RTMP连接.

RTMP_ConnectStream

在这个函数中调用了

RTMP_ReadPacket()

RTMP_ClientPacket()

第一个函数的作用是读取通过Socket接收下来的消息(Message)包,但是不做任何处理。第二个函数则是处理消息(Message),并做出响应。这两个函数结合,就可以完成接收消息然后响应消息的步骤。

RTMP_ReadPacket 接收下来的是Chunk

RTMP_ClientPacket() 是用来处理消息,根据不同的消息,做不同的调用。



case 0x01:
break;
case 0x02:
break;
……
}

消息类型为0x14的消息,即消息类型ID为20的消息,是AMF0编码的命令消息,

依次调用

三个命令,

针对不同的method,处理不同的命令。

这些命令有以下这些(不完整)

等等。
消息是如何发送的?

  • 发送connect命令使用函数SendConnectPacket()
  • 发送createstream命令使用RTMP_SendCreateStream()
  • 发送realeaseStream命令使用SendReleaseStream()
  • 发送publish命令使用SendPublish()
  • 发送deleteStream的命令使用SendDeleteStream()
  • 发送pause命令使用RTMP_SendPause()

函数命名有两种规律:RTMP_Send***()或者Send***(),其中*号代表命令的名称


发送消息比较类似:
总体的思路是声明一个RTMPPacket类型的结构体,然后设置各种属性值,最后交给RTMP_SendPacket()进行发送。

RTMPPacket类型的结构体定义如下,一个RTMPPacket对应RTMP协议规范里面的一个块(Chunk)。


//Chunk信息

RTMP_SendPacket()
各种的RTMPPacket(即各种Chunk)都需要用这个函数进行发送。
按照RTMP规范将数据编码成符合规范的块(Chunk),

在这里需要注意一个函数:WriteN()。该函数完成了将数据发送出去的功能。


在这个函数里根据协议不同,调用相应的函数

RTMPSockBuf_Send()完成了数据发送的功能
在这个RTMPSockBuf_Send()函数中调用了系统Socket的send()函数完成了数据的发送功能

到此,发送消息能够通过socket发送出去。


RTMPdump中完成视音频数据的接收的函数是:RTMP_Read()。

RTMP_Read()中实际读取数据的函数是Read_1_Packet(),它的功能是从网络上读取一个RTMPPacket的数据,

Read_1_Packet()里面实现从网络中读取视音频数据的函数是RTMP_GetNextMediaPacket()。

RTMP_GetNextMediaPacket 里会调用两个函数:RTMP_ReadPacket()以及RTMP_ClientPacket()。这两个函数中,前一个函数负责从网络上读取数据,后一个负责处理数据。

在RTMP_ReadPacket()函数里完成从Socket中读取数据的函数是ReadN(),

ReadN()中实现从Socket中接收数据的函数是RTMPSockBuf_Fill(),
RTMPSockBuf_Fill()函数中调用了系统Socket的recv()函数接收RTMP连接传输过来的数据。

RTMPdump 的函数 RTMP_ClientPacket(), 主要完成了各种消息的处理。



消息ID
功能
调用函数

0x01
设置块(Chunk)大小
HandleChangeChunkSize()

0x03
致谢
无函数

0x04
用户控制
HandleCtrl

0x05
窗口致谢大小(Window Acknowledgement Size
HandleServerBW()

0x06
设置对等端带宽(Set Peer Bandwidth)
HandleClientBW()

0x08
传输音频


0x09
传输视频


传输AMF3编码


传输AMF0编码












原文地址:http://blog.csdn.net/gengxt2003/article/details/51610546

感谢原作者的贡献

代码在 handshake.h文件中,

该文件中HandShake 函数是处理握手的。

RTMP_Connect():

RTMP_Connect1()。

RTMP_Connect0() 主要是建立Socket连接

建立RTMP连接.

RTMP_ConnectStream

在这个函数中调用了

RTMP_ReadPacket()

RTMP_ClientPacket()

第一个函数的作用是读取通过Socket接收下来的消息(Message)包,但是不做任何处理。第二个函数则是处理消息(Message),并做出响应。这两个函数结合,就可以完成接收消息然后响应消息的步骤。

RTMP_ReadPacket 接收下来的是Chunk

RTMP_ClientPacket() 是用来处理消息,根据不同的消息,做不同的调用。



case 0x01:
break;
case 0x02:
break;
……
}

消息类型为0x14的消息,即消息类型ID为20的消息,是AMF0编码的命令消息,

依次调用

三个命令,

针对不同的method,处理不同的命令。

这些命令有以下这些(不完整)

等等。
消息是如何发送的?

  • 发送connect命令使用函数SendConnectPacket()
  • 发送createstream命令使用RTMP_SendCreateStream()
  • 发送realeaseStream命令使用SendReleaseStream()
  • 发送publish命令使用SendPublish()
  • 发送deleteStream的命令使用SendDeleteStream()
  • 发送pause命令使用RTMP_SendPause()

函数命名有两种规律:RTMP_Send***()或者Send***(),其中*号代表命令的名称


发送消息比较类似:
总体的思路是声明一个RTMPPacket类型的结构体,然后设置各种属性值,最后交给RTMP_SendPacket()进行发送。

RTMPPacket类型的结构体定义如下,一个RTMPPacket对应RTMP协议规范里面的一个块(Chunk)。


//Chunk信息

RTMP_SendPacket()
各种的RTMPPacket(即各种Chunk)都需要用这个函数进行发送。
按照RTMP规范将数据编码成符合规范的块(Chunk),

在这里需要注意一个函数:WriteN()。该函数完成了将数据发送出去的功能。


在这个函数里根据协议不同,调用相应的函数

RTMPSockBuf_Send()完成了数据发送的功能
在这个RTMPSockBuf_Send()函数中调用了系统Socket的send()函数完成了数据的发送功能

到此,发送消息能够通过socket发送出去。


RTMPdump中完成视音频数据的接收的函数是:RTMP_Read()。

RTMP_Read()中实际读取数据的函数是Read_1_Packet(),它的功能是从网络上读取一个RTMPPacket的数据,

Read_1_Packet()里面实现从网络中读取视音频数据的函数是RTMP_GetNextMediaPacket()。

RTMP_GetNextMediaPacket 里会调用两个函数:RTMP_ReadPacket()以及RTMP_ClientPacket()。这两个函数中,前一个函数负责从网络上读取数据,后一个负责处理数据。

在RTMP_ReadPacket()函数里完成从Socket中读取数据的函数是ReadN(),

ReadN()中实现从Socket中接收数据的函数是RTMPSockBuf_Fill(),
RTMPSockBuf_Fill()函数中调用了系统Socket的recv()函数接收RTMP连接传输过来的数据。

RTMPdump 的函数 RTMP_ClientPacket(), 主要完成了各种消息的处理。



消息ID
功能
调用函数

0x01
设置块(Chunk)大小
HandleChangeChunkSize()

0x03
致谢
无函数

0x04
用户控制
HandleCtrl

0x05
窗口致谢大小(Window Acknowledgement Size
HandleServerBW()

0x06
设置对等端带宽(Set Peer Bandwidth)
HandleClientBW()

0x08
传输音频


0x09
传输视频


传输AMF3编码


传输AMF0编码












易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!