Win10中用VS2019编译live555

前言

说明,本文是在Win10中用VS2019编译live555的过程中,对遇到的问题进行说明。编译过程主要参考的是下面一篇文章,在此表示感谢:

https://blog.csdn.net/m0_37360684/article/details/90109110

由于每个人的电脑上已安装软件、下载的软件源码版本、安装步骤选择等会有所差异,所以遇到的问题也有所不同,本文重点要说明的是本人在编译live555过程中的差异部分。

一、下载live555源码

live555下载地址:http://www.live555.com/liveMedia/public/

下载最新的即可,此处我下载的是 live555-latest-20220120.tar.gz。另外,也应该下载几个用于测试的视频流,如h264,mp3,mpg文件等。

本来还想直接下载一个windows下的可执行文件,在官网上却没有找到,页面如下(只有类unix下的):

http://www.live555.com/mediaServer/

 对于windows下的,那就只好自己编译了。当然,网上也能找到别人已经编译好的windows下的可执行文件,一则可以先体验一下,二则可以对比自己编译出来的结果。本文的重点是编译,不多说了。

二、在VS2019中创建项目

我们要创建 BasicUsageEnvironment、UsageEnvironment、groupsock、liveMedia4个项目,分布生成对应的lib库文件;创建mediaServer项目,调用前面的4个库,生成可执行文件,即rtsp服务器的运行程序。

2.1 首先创建BasicUsageEnvironment

步骤如下:

打开VS2019,选择【创建新项目】,在 语言处选择 C++,选择【Windows 桌面向导】,单击【下一步】,输入项目名称 BasicUsageEnvironment,解决方案填写live555(也可以填写其他名称,易于理解即可)。点击【创建】,在弹出的Windows桌面项目窗口中的 应用程序类型中 选择 【静态库(.lib)】,其他选项 中 勾选【空项目】,点击【确定】。

2.2 类似的过程,创建UsageEnvironment、groupsock、liveMedia4

2.3创建 mediaServer项目

基本是相同的步骤,只是在应用程序类型 选择 【控制台应用程序(.exe)】。

三、将源文件加入工程:

也是逐个项目处理,就是将解压的live555的源码文件(只需要c文件与h文件),对应拷贝到VS的项目目录中。

然后将每个工程下的 include下的头文件 添加到 头文件筛选器下,再将 .cpp、.c、.hh 和 .h  文件 添加到 源文件筛选器下。

四、为每个项目添加依赖头文件

(下面的步骤,只是其中的一种实现方法):

1,以BasicUsageEnvironment项目为例:

1.1,在vs2019中的BasicUsageEnvironment项目处单击鼠标右键,选择【属性】;

在BasicUsageEnvironment属性页的 【配置属性】--【常规】--【输出目录】中填写

$(SolutionDir)$(Platform)\$(Configuration)\lib\

$(SolutionDir)是指解决方案的路径,如:D:\workSpace\VS2019\live555\

这个 $(Platform) 是指cpu平台,例如x86或x64:

$(Configuration)是指Debug或Release

(注意)这里的lib文件夹会在后来Debug过程中在Debug文件夹下自动生成,这样填写完全是为了最后mediaServer的属性页的【链接器】--【常规】--【附加库目录】中方便。

最后生成的路径类似如下:D:\workSpace\VS2019\live555\x64\Debug\lib\

1.2,通过点击【输出目录】右侧对应的 倒三角按钮选择<编辑...>,可以看到对应的输出目录;

1.3,在BasicUsageEnvironment属性页的【C/C++】--【常规】--【附加库目录】中输入:

..\BasicUsageEnvironment\include;..\groupsock\include;..\liveMedia\include;..\UsageEnvironment\include

(将这4个全部包含只是为了方便,相互之间的依赖关系可以不用考虑了)

1.4,点击【附加包含目录】那行 最右侧的 倒三角型按钮,选择<编辑...>:

1.5,在弹出的 附加包含目录面板中  勾选 从父级或项目默认设置继承,连续点击【确定】返回即可 。

2,采用同样的方法将剩余的UsageEnvironment、groupsock和liveMedia这3个项目进行设置。

3,设置mediaServer项目中的属性

3.1,mediaServer项目中的属性页的 【配置属性】--【常规】--【输出目录】不用改写,默认即可;

3.2 mediaServer项目中的属性页的 【C/C++】--【常规】--【附加包含目录】中同样输入:

..\BasicUsageEnvironment\include;..\groupsock\include;..\liveMedia\include;..\UsageEnvironment\include

3.3 别忘记 勾选 从父级或项目默认设置继承:

3.4 从mediaServer属性页的【链接器】--【常规】--【附加库目录】填入

$(SolutionDir)$(Platform)\$(Configuration)\lib\

这个目录就是前面4个工程设置的【配置属性】 --【常规】--【输出目录】,同样别忘记 勾选 从父级或项目默认设置继承:

3.5 从mediaServer属性页的【链接器】--【常规】--【输入】填入

UsageEnvironment.lib

liveMedia.lib

groupsock.lib

BasicUsageEnvironment.lib

Ws2_32.lib

一定要有Ws2_32.lib,否则编译生成时会报错,依次点击【确定】 返回即可。

五、编译

先编译 BasicUsageEnvironment、groupsock、liveMedia、UsageEnvironment 这四个工程,最后再编译 mediaServer 这个工程,注意是 mediaServer是最后再编译的。

在vs2019中对应的项目处单击鼠标右键,选择【生成】

编译过程遇到错误说明:

错误1:

error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.See online help for details.

解决方法:

在项目处单击鼠标右键,选择【属性】,【C/C++】-->【预处理器】-->【预处理器定义】中增加:

_CRT_SECURE_NO_WARNINGS

一点理解:在VS中调用 scanf、sprintf、strcpy、strcat 等函数时常常会提示 _CRT_SECURE_NO_WARNINGS 警告,原因是Visual studio C++不是真正的C++,而是经过Microsoft公司优化的。也许是微软公司的那些开发工程师们认为这些C函数功能内部没有对内存做边界检查,极有可能造成内存越界等问题,在早期的VS版本中设置了不安全警告,在VS2019版本中,这些警告就变为错误了。

错误2:

error C4996: 'gethostbyname': Use getaddrinfo() or GetAddrInfoW() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings

解决方法:

在项目处单击鼠标右键,选择【属性】,【C/C++】-->【预处理器】-->【预处理器定义】中增加:

_WINSOCK_DEPRECATED_NO_WARNINGS

说明:其实'gethostbyname' getaddrinfo的关系就像是strcpy与strcoy_s的关系.微软推荐别人使用新函数。这里我们尽量不修改原代码,所以选择去掉此警告。

错误3:

live555\groupsock\GroupsockHelper.cpp(46,10): fatal error C1083: 无法打开包括文件: “ifaddrs.h”: No such file or directory

解决方法:

右键项目名称 --》  配置属性 --》 C/C++ --》预处理器 --》预处理器定义

添加  NO_GETIFADDRS

错误4:

编译 liveMedia 时报错:

错误(活动)     E1696     无法打开 源 文件 "openssl/ssl.h"     liveMedia       D:\ workSpace\VS2019\live555\liveMedia\include\TLSState.hh     34   

解决方法:

上网查了,说是确实电脑上没有安装openssl,需要安装。还有一种方案是去掉openssl的依赖,即添加一个预编译宏:NO_OPENSSL。

此处我由于考虑尽量不改变原live555工程的功能,采用的是编译安装openssl的方式(虽然后来都有些后悔,实在是挺麻烦的):

第一步,下载工具与源码:

ActivePerl工具,官网下载链接:Download & Install Perl - ActiveState

此处我下载的是V5.32版本的。

openssl源码,下载链接:https://www.openssl.org/source/

此处我下载的是openssl-3.0.1.tar.gz

第二步,安装

1.安装ActivePerl;

2.解压openssl源码到指定目录;

3.进入VS2019自带的命令行界面,注意区分版本

本文进入的是x64 Native Tools Command Prompt for VS2019

 注意,需要以管理员的权限打开。

4.在VS2019自带的命令行界面中,进入openssl解压目录,D:\workSpace\VS2019\openssl-3.0.1,运行:

perl Configure VC-WIN64A no-asm –prefix=E:\mylib\openssl

进行相关的配置

注意:prefix指定安装目录,VC-WIN64A安装平台

执行编译,安装:

$ nmake

       编译过程很慢,大概花了20分钟。

    $ nmake test

    $ nmake install

第三步,拷贝安装路径下的文件至live555目录下,路径如下:

D:\workSpace\VS2019\live555\openssl

里面有lib与include目录。

第四步,配置live555工程项目的属性:

把openssl的头文件添加到对应路径

右键项目名称 --》  配置属性 --》 C/C++ --》常规 --》附加包含目录

..\openssl\include

工程中添加对应的lib库

1.先添加lib库所在路径

右键项目名称 --》  配置属性 --》 链接器 --》常规 --》附加库目录

$(SolutionDir)openssl\lib\

2.添加lib名称

右键项目名称 --》  配置属性 --》 链接器 --》输入 --》附加依赖项

添加如下两项即可:

libcrypto.lib

libssl.lib

继续编译,继续报错:

错误5:

严重性    代码       说明       项目       文件       行    禁止显示状态

错误       C4996     'fileno': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _fileno. See online help for details.  liveMedia       D:\workSpace\VS2019\live555\liveMedia\MP3FileSource.cpp        63    _CRT_NONSTDC_NO_DEPRECATE

错误原因:fileno函数是符合POSIX标准的函数,在VS2019下这个标准已经过时,被ISO C++取代。在ISO C++标准下,该函数的名称为_fileno。

解决方法有两个:

方法一:把fileno更改为_fileno。如:#define fileno _fileno

方法二:定义宏 _CRT_NONSTDC_NO_WARNINGS 或_CRT_NONSTDC_NO_DEPRECATE。

错误6:

严重性    代码       说明       项目       文件       行    禁止显示状态

错误       C2131     表达式的计算结果不是常数       liveMedia       D:\ workSpace\VS2019\live555\liveMedia\MultiFramedRTPSink.cpp    377 

查看错误代码:

u_int8_t packet[fOutBuf->curPacketSize() + SRTP_MKI_LENGTH + SRTP_AUTH_TAG_LENGTH];

分析原因:C2131: 表达式的计算结果不是常数。原因是定义数组时尺寸是不能用变量的。

修改为:

u_int8_t *packet = new u_int8_t[fOutBuf->curPacketSize() + SRTP_MKI_LENGTH + SRTP_AUTH_TAG_LENGTH];

错误7:

编译通过后,最后链接库的时候,遇到链接错误:

严重性    代码       说明       项目       文件       行    禁止显示状态

错误       LNK1112 模块计算机类型“x86”与目标计算机类型“x64”冲突   mediaServer       D:\workSpace\VS2019\live555\mediaServer\liveMedia.lib(MediaSink.obj)    1    

解决方法:

一个可能原因是工程依赖的lib文件是win32下编译的,而工程时x64的,此时,需要把lib换成64位系统编译的。比如openssl,之前是在win32下编译的,则需要重新编译为64位的。

当然,按我上面的流程走下来,openssl就是选择为x64下编译的。

实际我在操作过程中,是使用了64位的openssl库,而live555工程选择了x86,导致了不匹配。将每个工程项目都修改为x64,全部重新编译,ok。

六,运行

第一次运行,还缺库:libcrypto-3-x64.dll

进入openssl-3.0.1路径,将 libcrypto-3-x64.dll 与 libssl-3-x64.dll 一起拷贝到与 mediaServer.exe 同级路径下,能运行了:

还遇到一个问题:rtsp服务器IP的选择,不是我希望的那一个,怎么修改?

       把其他几个网卡都禁用掉,就获取到正确的ip了。我遇到的问题,其实是VMWare的虚拟网卡影响的,关闭就好了。

七、验证

打开VLC播放器,选择【媒体】--【打开网络串流】,在【网络】下面的请输入网络URL中输入上面步骤mediaServer.exe命令行窗口中的第4行 的格式 ,rtsp://192.168.3.4/<filename>,在这里输入 rtsp://192.168.3.4:8000/test.264

rtsp://192.168.3.4:8000/test.264的意思:前面表示rtsp协议,中间的是ip地址与端口号,后面的是文件名称。

如下图,则表示成功了:

参考文章:

https://blog.csdn.net/m0_37360684/article/details/90109110

Windows10+VS2017下安装和 编译openssl库_tianse12的专栏-CSDN博客_vs2017编译openssl

https://blog.csdn.net/Hanford/article/details/53582189

https://blog.csdn.net/tfy1028/article/details/8660823

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值