无限缅怀雷神,R.I.P
https://blog.csdn.net/leixiaohua1020/article/details/15814587
为了能更好的使用librtmp,特将librtmp源码的个人分析记录下来,方便日后查看回顾。
rtmp是基于tcp的,无论协议写的如何天花乱坠,本质还是发包和收包,最本质的是二进制数据的交换,所以先查看下发送、接受阵营的两位苦工,ReadN,WriteN函数
略去对http方式、加密相关代码的分析(其实是看不懂),只看最基础最重要的tcp收发流程。
ReadN
ReadN函数顾名思义,就是从socket中读取N个字节出来,如果不足N个字节,那么我就阻塞等,如果超过N个字节,我也只取前N个字节。
static int
ReadN(RTMP *r, char *buffer, int n)
{
int nOriginalSize = n;
int avail;
char *ptr;
r->m_sb.sb_timedout = FALSE;
#ifdef _DEBUG
memset(buffer, 0, n);
#endif
ptr = buffer;
while (n > 0)
{
int nBytes = 0, nRead;
if (r->Link.protocol & RTMP_FEATURE_HTTP)
{
while (!r->m_resplen)
{
if (r->m_sb.sb_size < 144)
{
if (!r->m_unackd)