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;}