Win7(Windows 7)下用VS2012(Visual Studio 2012)编译librtmp
url:https://blog.csdn.net/caoshangpa/article/details/52872756
一.准备工作
1.下载librtmp源码trmpdump-2.3.tgz
下载链接:http://rtmpdump.mplayerhq.hu/download/
2.下载并编译librtmp的依赖库zlib和openSSL
本文主要想说明如何编译librtmp,zlib和openSSL的编译过程略,只提供两者已经编译好的头文件和静态库。
二.开始编译
1.新建VS2012的Win32控制台应用程序,如下图所示。
选择“静态库”,并取消“预编译头”,如下图所示。
2.解压trmpdump-2.3.tgz并将其中的librtmp文件夹拷贝到E:\librtmpWindows\librtmpWindows,然后将librtmp中的.h和.c文件添加到项目中。
3.在E:\librtmpWindows\librtmpWindows中新建include和lib文件夹,然后分别拷入zlib和openSSL的头文件和静态库文件,如下图所示。
将头文件和库文件目录添加到项目中,最好使用相对路径,这样的话项目换到其他目录也不影响编译。需要注意的是,相对路径是相对于项目文件.vcxproj的。如下图所示。
4.编译,此时会出现error C4996的错误,提示一些函数已经被摒弃,如下图所示。修改方法参考:编译时出现error C4996 解决方法
修改后,还剩下一个错误,如下图所示。
双击该错误,定位到出错位置。将strdup改为_strdup,如下图所示。
再次编译,错误消失,在E:\librtmpWindows\Release(先将工程设置为release)目录下可以看到生成的静态库librtmpWindows.lib。
编译虽然无错了,但是新建测试工程testLibrtmp(Win32控制台应用程序),调用librtmpWindows.lib库时却会再次出现错误,错误提示如下图所示。
第一条错误与librtmpWindows库无关,需在测试工程testLibrtmp中加入winmm.lib库。
其余三条错误需返回librtmpWindows工程,打开trmp_sys.h文件,做如下修改。
将
#ifdef _XBOX
#include <xtl.h>
#include <winsockx.h>
#define snprintf _snprintf
#define strcasecmp stricmp
#define strncasecmp strnicmp
#define vsnprintf _vsnprintf
#else /* !_XBOX */
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
修改为
#include <winsock2.h>
#include <ws2tcpip.h>
#define snprintf _snprintf
#define strcasecmp _stricmp
#define strncasecmp _strnicmp
#define vsnprintf _vsnprintf
改完后如下图所示。
重新编译librtmpWindows工程。
重新编译testLibrtmp工程,错误消失。
testLibrtmp工程代码如下所示。
librtmp的使用方法详见:libRTMP使用说明
// testLibrtmp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include<rtmp_sys.h>
#include<log.h>
#include<amf.h>
int InitSockets()
{
#ifdef WIN32
WORD version;
WSADATA wsaData;
version = MAKEWORD(1, 1);
return (WSAStartup(version, &wsaData) == 0);
#else
return TRUE;
#endif
}
void CleanupSockets()
{
#ifdef WIN32
WSACleanup();
#endif
}
int _tmain(int argc, _TCHAR* argv[])
{
RTMP *rtmp;
int setupFlag,connectFlag,streamFlag;
char uri[]="rtmp://192.168.2.189/live/test";
//初始化socket
if (!InitSockets())
{
return -1;
}
//创建一个RTMP会话句柄
rtmp = RTMP_Alloc();
if(rtmp == NULL)
{
printf("alloc failed...\n");
}
else
{
printf("alloc success...\n");
}
//初始化句柄
RTMP_Init(rtmp);
//设置会话参数
setupFlag = RTMP_SetupURL(rtmp, (char*)uri);
if(setupFlag < 0)
{
printf("setup url failed...\n");
}
else
{
printf("setup url success...\n");
}
//运行写数据,需在RTMP_Connect之前调用
RTMP_EnableWrite(rtmp);
//建立RTMP链接中的网络连接
connectFlag=RTMP_Connect(rtmp, NULL);
if(connectFlag < 0)
{
printf("connnect failed...\n");
}
else
{
printf("connect success...\n");
}
//建立RTMP链接中的网络流
streamFlag=RTMP_ConnectStream(rtmp,0);
if(streamFlag < 0)
{
printf("connect stream failed...\n");
}
else
{
printf("connect stream success...\n");
}
CleanupSockets();
system("pause");
return 0;
}
5.最后需要注意的是如果此时将librtmpWindows工程设置为debug,编译不会出错,但是用测试工程testLibrtmp调用时,会出现如下图所示错误。
这两条错误需返回librtmpWindows工程,打开rtmp.c文件,将如下三个地方注释掉。
#ifdef _DEBUG
fwrite(buf, 1, len, netstackdump);
#endif
#ifdef _DEBUG
extern FILE *netstackdump;
extern FILE *netstackdump_read;
#endif
#ifdef _DEBUG
fwrite(ptr, 1, nBytes, netstackdump_read);
#endif
重新编译librtmpWindows工程。
重新编译testLibrtmp工程,错误消失。
参考链接:http://blog.csdn.net/zqf_office/article/details/10112435
librtmpWindows工程和ltestLibrtmp工程源码链接:
见http://blog.csdn.NET/caoshangpa/article/details/52872756的评论
---------------------
作者:灿哥哥
来源:CSDN
原文:https://blog.csdn.net/caoshangpa/article/details/52872756
版权声明:本文为博主原创文章,转载请附上博文链接!