rtmpdump代码简单分析

第一步——握手(Hand Shake)
代码在 handshake.h文件中,
该文件中 HandShake 函数是处理握手的。

第二 步-----建立连接NetConnection  在文件rtmp.cpp 中

RTMP_Connect():

其内部调用了 

RTMP_Connect0() 和  RTMP_Connect1()。

RTMP_Connect0() 主要是建立Socket连接

RTMP_Connect1() 建立RTMP连接.

第三步-----建立流 NetStream  代码也在rtmp.cpp中

RTMP_ConnectStream

在这个函数中调用了

RTMP_ReadPacket()

RTMP_ClientPacket()

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

RTMP_ReadPacket 接收下来的是Chunk

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

switch (packet->m_packetType)  
 {  
case 0x01:
break;
case 0x02:
break;
case 0x14:  
       
      if (HandleInvoke(r, packet->m_body, packet->m_nBodySize) == 1)  
    bHasMediaPacket = 2;  
      break;  
......
}

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

依次调用

AMF_Decode(&obj, body, nBodySize, FALSE);  
 
  AMFProp_GetString(AMF_GetProp(&obj, NULL, 0), &method);  
  
(AVMATCH(&method, &av__result))  

三个命令,

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

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

AVMATCH(&methodInvoked, &av_connect)
AVMATCH(&methodInvoked, &av_createStream)
AVMATCH(&methodInvoked, &av_play)
AVMATCH(&methodInvoked, &av_publish)
AVMATCH(&method, &av_onBWDone)
等等。
第四步------发送消息
消息是如何发送的?

  • 发送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信息
  typedef struct RTMPPacket
  {
    uint8_t m_headerType;//ChunkMsgHeader的类型(4种)
    uint8_t m_packetType;//Message type ID(1-7协议控制;8,9音视频;10以后为AMF编码消息)
    uint8_t m_hasAbsTimestamp;    /* Timestamp 是绝对值还是相对值? */
    int m_nChannel;            //块流ID
    uint32_t m_nTimeStamp;    // Timestamp
    int32_t m_nInfoField2;    /* last 4 bytes in a long header,消息流ID */
    uint32_t m_nBodySize;    //消息长度
    uint32_t m_nBytesRead;
    RTMPChunk *m_chunk;
    char *m_body;
  } RTMPPacket;

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

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


在这个函数里根据协议不同,调用相应的函数
  1. if (r->Link.protocol & RTMP_FEATURE_HTTP)  
  2.         nBytes = HTTP_Post(r, RTMPT_SEND, ptr, n);  
  3.       else  
  4.         nBytes = RTMPSockBuf_Send(&r->m_sb, ptr, n);  

其中  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
传输视频


0x0f--11
传输AMF3编码


0x12--14
传输AMF0编码












  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: rtmpdump是一个开源的命令行工具,用于从流媒体服务器上下载或录制RTMP流(Real-Time Messaging Protocol)。vc工程是指使用VC++编写的工程项目。将两者结合起来,意味着在VC++环境下使用rtmpdump工具进行流媒体下载或录制。 要在VC++中使用rtmpdump工具,首先需要下载并安装rtmpdump代码。然后在VC++项目中添加rtmpdump的相关文件,并在代码中引用相关的头文件。接下来,就可以使用rtmpdump提供的函数来实现对RTMP流的下载或录制。 具体而言,可以使用rtmpdumprtmpdump()函数指定要下载或录制的RTMP流的URL,并设置保存的文件路径。通过调用该函数,rtmpdump将连接到流媒体服务器并获取流媒体数据,并将其写入指定的文件中。在下载或录制过程中,还可以使用rtmpdump的其他函数来处理数据流,例如解密、分段等操作。 在VC++中使用rtmpdump工程可以为流媒体下载或录制提供更灵活和定制化的功能。通过使用VC++的编程特性,可以进行更高级的数据处理和界面设计,实现更复杂的功能需求。同时,rtmpdump的开源性质也使得用户能够根据自己的需求对其进行修改和扩展。 总之,通过在VC++中使用rtmpdump工程,可以方便地实现对RTMP流的下载或录制,并根据需要进行定制化的功能扩展。这为开发者提供了更大的灵活性和自由度,以满足不同的流媒体处理需求。 ### 回答2: rtmpdump是一款用于从RTMP流媒体服务器下载或录制音频/视频内容的开源工具。vc工程是指使用Visual C++编程语言和开发环境创建的软件项目。 要创建一个rtmpdump的vc工程,首先需要下载rtmpdump的源代码,然后使用Visual C++打开相应的工程文件。接下来需要配置工程的编译环境,确保所需的头文件和库文件路径正确。 在工程中,会有一些源代码文件,这些文件负责实现rtmpdump的各种功能,例如建立与RTMP服务器的连接、发送请求、接收数据、数据解析等等。这些文件会被编译成可执行的二进制文件。 在编译期间可能会遇到一些依赖项问题,例如需要额外链接一些库文件以支持某些功能。开发人员需要根据编译过程中的错误信息,对工程进行适当的配置和调整,以确保成功编译。 一旦vc工程成功编译完成,就可以生成一个可执行文件,该文件可以在命令行中运行。通过指定RTMP服务器的URL和相关参数,可以让rtmpdump工具连接到服务器并下载或录制所需的音频/视频内容。 总的来说,创建一个rtmpdump的vc工程需要下载源代码、配置编译环境、解决依赖项问题,并根据需要添加自定义功能。通过编译和运行工程生成的可执行文件,就能实现从RTMP流媒体服务器下载或录制音频/视频内容的操作。 ### 回答3: rtmpdump是一个用于下载和保存RTMP流的工具。它提供了用于处理RTMP协议的源代码,可以自定义编译和构建,获得一个可以在不同平台上运行的RTMP下载工具。 RTMP是一种用于流媒体传输的协议,它是Adobe公司开发的一种实时通信协议,常用于视频直播、在线游戏和音频通信等领域。rtmpdump工具可以连接到RTMP服务器,读取和接收RTMP流,并将其保存为本地文件。 vc工程是指使用Visual C++编译器创建的工程。通过将rtmpdump的源代码加入到Visual C++工程中,我们可以使用VC++的功能和特性来构建和调试rtmpdump工具。这样,我们就可以根据自己的需求进行修改和定制,使其能够更好地满足我们的需求。 在vc工程中,我们可以使用rtmpdump的源代码来构建一个命令行界面的工具,以便用户可以通过命令行输入相关参数来下载RTMP流。我们可以利用Visual C++的调试功能来排查和修复可能存在的问题,提高工具的稳定性和性能。 除了在vc工程中进行开发和调试,rtmpdump还可以在不同的平台上进行编译和构建,如Linux、Mac和Android等。这使得rtmpdump工具具有更广泛的适用性和可移植性。 总结来说,rtmpdump vc工程是指使用Visual C++编译器创建的工程,并集成了rtmpdump的源代码,使其能够在Windows平台上运行和定制化,从而实现对RTMP流进行下载和保存的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值