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
版权声明:本文为博主原创文章,转载请附上博文链接!

posted on 2019-03-18 16:14  杜鹃醉鱼鱼  阅读(257)  评论(0编辑  收藏  举报

导航