前言
说明,本文是在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