librtmp在windows下的编译和使用

一、librtmp的编译

1.下载librtmp的源代码,我下的是rtmpdump-2.3
http://rtmpdump.mplayerhq.hu/


2.下载zlib的源代码


3.建立一个名叫librtmp的vs2008的静态库工程,把下载的rtmpdump-2.3\librtmp下的代码和zlib代码载入,设置好头文件的路径


4.在c/c++预处理器加上NO_CRYPTO,不编ssl部分,不需要加密


5.在rtmp_sys.h中
#ifdef _XBOX

#include

#include

#define snprintf _snprintf

#define strcasecmp stricmp

#define strncasecmp strnicmp

#define vsnprintf _vsnprintf
#else

#include

#include

#endif


修改为


#ifdef _XBOX

#include

#include

#define snprintf _snprintf
#define strcasecmp stricmp

#define strncasecmp strnicmp

#define vsnprintf _vsnprintf
#else

#include
#include
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#endif


6.在rtmp.c中
注释掉以下几个
//#ifdef _DEBUG

//extern FILE *netstackdump;

//extern FILE *netstackdump_read;

//#endif

//#ifdef _DEBUG
// fwrite(ptr, 1, nBytes, netstackdump_read);

//#endif

//#ifdef _DEBUG
// fwrite(buf, 1, len, netstackdump);

//#endif


7.编译通过,生成librtmp.lib


二、librtmp.lib的使用

1.建立一个testlibrtmp控制台工程,将rtmp.h 、amf.h、librtmp.lib载入


2.记得加上
#include
#pragma comment(lib,"ws2_32.lib")


3.以下代码是接受一个rtmp服务流,然后保存为一个flv本地文件
#include <winsock.h>
#pragma comment(lib,"ws2_32.lib")

#include "rtmp.h"
#pragma comment(lib,"librtmp.lib")

int InitSockets()
{
WORD version;
WSADATA wsaData;
version = MAKEWORD(1, 1);
return (WSAStartup(version, &wsaData) == 0);
}

void CleanupSockets()
{
WSACleanup();
}

int _tmain(int argc, _TCHAR* argv[])
{
InitSockets();
RTMP rtmp={0};
RTMP_Init(&rtmp);
rtmp.Link.timeout=25;//超时设置
//由于crtmpserver是每个一段时间(默认8s)发送数据包,需大于发送间隔才行
bool bLiveStream=true;//是否直播
if (bLiveStream)
{
RTMP_SetupURL(&rtmp,"rtmp://203.146.170.102:1935/live/livestream6");
//设置直播标志
rtmp.Link.lFlags|=RTMP_LF_LIVE;
}else
{
RTMP_SetupURL(&rtmp,"rtmp://127.0.0.1:1935/vod/test.flv");
}
RTMP_SetBufferMS(&rtmp, 3600*1000);//1hour
if(!RTMP_Connect(&rtmp,NULL))
{
printf("Connect Server Err\n");
WSACleanup();
return -1;
}
if(!RTMP_ConnectStream(&rtmp,0))
{
printf("Connect stream Err\n");
RTMP_Close(&rtmp);
WSACleanup();
return -1;
}
int buffsize=1024*1024*10;
char*buff=(char*)malloc(buffsize);
double duration=-1;
int nRead;
FILE*fp=fopen("aaa.flv","wb");
long countbuffsize=0;
//它直接输出的就是FLV文件,包括FLV头,可对流按照flv格式解析就可提前音频,视频数据
while(nRead=RTMP_Read(&rtmp,buff,buffsize))
{
fwrite(buff,1,nRead,fp);
if (!bLiveStream&&duration<0)
{
duration = RTMP_GetDuration(&rtmp);
printf("duration:%f\n",duration);
}
countbuffsize+=nRead;
printf("\rdownland...:%0.2fkB",countbuffsize*1.0/1024);
}
fclose(fp);
free(buff);
buff=NULL;
RTMP_Close(&rtmp);
WSACleanup();
return 0;
}

原文链接:,转发请注明来源!