RTMPdump 源代码分析 1: main()函数

RTMPdump (libRTMP) 源代码分析4: 连接第一步——握手 (HandShake)

RTMPdump (libRTMP) 源代码分析7: 建立一个流媒体连接  (NetStream部分 2)

RTMPdump (libRTMP) 源代码分析10: 处理各种消息 (Message)

函数调用结构图

 

详细分析

RTMP流媒体播放过程

在这里就不详细叙述了,其实主要是这两个函数:

RTMP_Connect()

RTMP_Connect0()

再来看看RTMP_Connect1(),这是真正建立RTMP连接的函数:

[cpp]  view plain  copy
 
  1. //第1次连接,从握手开始  
  2. int  
  3. RTMP_Connect1(RTMP *r, RTMPPacket *cp)  
  4. {  
  5.   if (r->Link.protocol & RTMP_FEATURE_SSL)  
  6.     {  
  7. #if defined(CRYPTO) && !defined(NO_SSL)  
  8.       TLS_client(RTMP_TLS_ctx, r->m_sb.sb_ssl);  
  9.       TLS_setfd((SSL *)r->m_sb.sb_ssl, r->m_sb.sb_socket);  
  10.       if (TLS_connect((SSL *)r->m_sb.sb_ssl) < 0)  
  11.     {  
  12.       RTMP_Log(RTMP_LOGERROR, "%s, TLS_Connect failed", __FUNCTION__);  
  13.       RTMP_Close(r);  
  14.       return FALSE;  
  15.     }  
  16. #else  
  17.       RTMP_Log(RTMP_LOGERROR, "%s, no SSL/TLS support", __FUNCTION__);  
  18.       RTMP_Close(r);  
  19.       return FALSE;  
  20.   
  21. #endif  
  22.     }  
  23.   //使用HTTP  
  24.   if (r->Link.protocol & RTMP_FEATURE_HTTP)  
  25.     {  
  26.       r->m_msgCounter = 1;  
  27.       r->m_clientID.av_val = NULL;  
  28.       r->m_clientID.av_len = 0;  
  29.       HTTP_Post(r, RTMPT_OPEN, "", 1);  
  30.       HTTP_read(r, 1);  
  31.       r->m_msgCounter = 0;  
  32.     }  
  33.   RTMP_Log(RTMP_LOGDEBUG, "%s, ... connected, handshaking", __FUNCTION__);  
  34.   //握手----------------  
  35.   r->dlg->AppendCInfo("建立连接:第1次连接。开始握手(HandShake)");  
  36.   //-----------------------------  
  37.   RTMP_LogPrintf("开始握手(HandShake)!\n");  
  38.   if (!HandShake(r, TRUE))  
  39.     {  
  40.         //----------------  
  41.         r->dlg->AppendCInfo("建立连接:第1次连接。握手(HandShake)失败!");  
  42.         //-----------------------------  
  43.       RTMP_Log(RTMP_LOGERROR, "%s, handshake failed.", __FUNCTION__);  
  44.       RTMP_Close(r);  
  45.       return FALSE;  
  46.     }  
  47.   //----------------  
  48.   r->dlg->AppendCInfo("建立连接:第1次连接。握手(HandShake)成功");  
  49.   //-----------------------------  
  50.   RTMP_LogPrintf("握手(HandShake)完毕!\n");  
  51.   RTMP_Log(RTMP_LOGDEBUG, "%s, handshaked", __FUNCTION__);  
  52.   //发送“connect”命令--------------  
  53.   //----------------  
  54.   r->dlg->AppendCInfo("建立连接:第1次连接。开始建立网络连接(NetConnection)");  
  55.   //-----------------------------  
  56.   RTMP_LogPrintf("开始建立网络连接(NetConnection)!\n");  
  57.   //----------------  
  58.   r->dlg->AppendCInfo("发送数据。消息 命令 (typeID=20) (Connect)。");  
  59.   //-----------------------------  
  60.   if (!SendConnectPacket(r, cp))  
  61.     {  
  62.         //----------------  
  63.         r->dlg->AppendCInfo("建立连接:第1次连接。建立网络连接(NetConnection)失败!");  
  64.         //-----------------------------  
  65.       RTMP_Log(RTMP_LOGERROR, "%s, RTMP connect failed.", __FUNCTION__);  
  66.       RTMP_Close(r);  
  67.       return FALSE;  
  68.     }  
  69.   //----------------  
  70.   r->dlg->AppendCInfo("建立连接:第1次连接。建立网络连接(NetConnection)成功");  
  71.   //-----------------------------  
  72.   RTMP_LogPrintf("命令消息“Connect”发送完毕!\n");  
  73.   return TRUE;  
  74. }  

 

至此RTMP_Connect()分析完毕。