1. librtmp概述
实时流协议(Real-TimeMessaging Protocol,RTMP)是用于互联网上传输视音频数据的网络协议。本API提供了支持RTMP, RTMPT,RTMPE,RTMPS及以上几种协议的变种(RTMPTE, RTMPTS)协议所需的大部分客户端功能以及少量的服务器功能。尽管Adobe公司已经公布了RTMP协议规范(RTMP specification),但是本工程并不是通过Adobe的协议规范而是通过逆向工程的方式完成的。因此,它的运行方式可能和公布的协议规范有所偏离,但是一般情况下它和Adobe的客户端的运行方式是一模一样的。
本博客将对libRTMP的函数进行简要说明。 这些函数可以在 -lrtmp 库中找到。其他还有很多函数,但是还没有为这些函数写文档。
基本的操作如下文所述:
RTMP_Alloc() :用于创建一个RTMP的结构体。
RTMP_Init():初始化RTMP结构体。
RTMP_SetupURL():设置推拉流的URL。
RTMP_EnableWrite(): 是否推流。
RTMP_Connect():建立RTMP链接中的网络连接(NetConnection)。
RTMP_ConnectStream():建立RTMP链接中的网络流(NetStream)。
RTMP_Read():读取RTMP流的内容。
RTMP_Pause():流播放的时候可以用于暂停和继续。
RTMP_Seek():改变流播放的位置。
当RTMP_Read()返回0 字节的时候,代表流已经读取完毕,而后可以调用RTMP_Close()。
RTMP_Free():用于释放RTMP结构体。
所有的数据都使用 FLV 格式进行传输。一个基本的会话需要一个RTMP URL。RTMP URL 格式如下所示:
rtmp[t][e|s]://hostname[:port][/app[/playpath]]
2. librtmp流程图
本流程主要为推流示意图,拉流与此大同小异。
3. 源码剖析
源码剖析的建议:
a. 先了解RTMP协议内容或者结合代码一块理解,详情可查阅: http://www.cnblogs.com/Kingfans/p/7083100.html;
b. 先了解AMF编码机制,详情课查阅:http://www.cnblogs.com/Kingfans/p/7069542.html;
c. 发包过程中请配合wireshark抓包工具一块理解。
3.1 RTMP_Alloc
RTMP_Alloc()用于创建一个RTMP的结构体。
/************************************************************************************************************ * @brief 申请RTMP内存 * ************************************************************************************************************/ RTMP* RTMP_Alloc() { return calloc(1, sizeof(RTMP)); }
3.2 RTMP_Init
RTMP_Init():初始化RTMP结构体。
/************************************************************************************************************ * @brief 初始化RTMP * ************************************************************************************************************/ void RTMP_Init(RTMP *r) { #ifdef CRYPTO if (!RTMP_TLS_ctx) RTMP_TLS_Init(); #endif memset(r, 0, sizeof(RTMP)); r->m_sb.sb_socket = -1; r->m_inChunkSize = RTMP_DEFAULT_CHUNKSIZE; r->m_outChunkSize = RTMP_DEFAULT_CHUNKSIZE; r->m_bSendChunkSizeInfo = 1; r->m_nBufferMS = 30000; r->m_nClientBW = 2500000; r->m_nClientBW2 = 2; r->m_nServerBW = 2500000; r->m_fAudioCodecs = 3191.0; r->m_fVideoCodecs = 252.0; r->Link.timeout = 30; r->Link.swfAge = 30; }
3.3 RTMP_SetupURL
RTMP_SetupURL():设置推拉流的URL。内部调用了RTMP_ParseURL主要用于解析url,详见3.3.1。
/************************************************************************************************************ * @brief 设置推流: 地址url; * ************************************************************************************************************/ int RTMP_SetupURL(RTMP *r, char *url) { AVal opt, arg; char *p1, *p2, *ptr = strchr(url, ' '); int ret, len; unsigned int port = 0; if (ptr) { *ptr = '