然后开始下载编译,其中包含,Windows、Linux和交叉编译三种形式。
首先来讲Windows下编译
参看:Live555研究之一 源代码编译
一、下载源码
选择下载 live555-latest.tar.gz
二、文件介绍
我的开发环境为 win 10 64位+VS2017
将上面下载的 live555-latest.tar.gz 解压
包括上述四个库和mediaServer服务器程序,以及其他的测试代码。
这几个文件在官网是有介绍的:
三、创建工程
这个我已经不陌生了,在讲 FFmpeg 的时候就创建过好几次了。
参看:FFmpeg再学习 -- Windows下安装说明
新建控制台工程
打开 VS;
文件->新建->项目->Win32控制台应用程序,点击确认。
注意,选择的位置最好不要有空格或者汉字。
(1)BasicUsageEnvironment
项目名称为 BasicUsageEnvironment,解决方案名称为 live555
应用程序类型为静态库,附加选项不勾选预编译头
(2)UsageEnvironment
添加新建项目,选择win32控制台项目,项目名称为 UsageEnvironment
应用程序类型为静态库,附加选项不勾选预编译头
(3)groupsock
添加新建项目,选择win32控制台项目,项目名称为 groupsock
应用程序类型为静态库,附加选项不勾选预编译头
(4)liveMedia
添加新建项目,选择win32控制台项目,项目名称为 liveMedia
应用程序类型为静态库,附加选项不勾选预编译头
(5)mediaServer
添加新建项目,选择win32控制台项目,项目名称为 mediaServer
应用程序类型为控制台应用程序,附加选项为勾选空项目
(6)最终创建的 5 个项目
对比一下和源码的那些库文件名,它们是一一对应的
四、将源文件加入工程
(1)打开源码目录,将BasicUsageEnvironment、UsageEnvironment、groupsock、mediaServer、liveMedia目录下的include目录、cpp文件、c文件、.hh和.h文件拷贝到上述创建的对应的工程目录下。
注意:尤其是 liveMedia 和 Groupsock 中有几个 .c 文件,千万不要忘记添加了。
后面会讲到,忘记这事,遇到个问题查了一个多小时才搞定。
点击右键,选择在资源管理器中打开文件夹,进入项目目录。
(注意,如果手动进入注意文件夹位置,我就是没找好位置,试了半天最后才发现,将上面的这些文件拷贝到错误的文件夹下了)
举个例子,拷贝完后此时的 BasicUsageEnvironment 项目目录下文件为:
同样的方法拷贝完其他四个项目。
(2)接着就是将这些文件添加进对应项目,将每个工程下的 include下的头文件则添加到头文件筛选器下,再将 .cpp、.c、.hh 和 .h 添加到源文件筛选器下。
来一个效果图
(3)添加依赖头文件。在属性->C/C++->常规->附加包含目录填写需要包含的头文件路径
..\BasicUsageEnvironment\include;..\groupsock\include;..\liveMedia\include;..\UsageEnvironment\include
BasicUsageEnvironment添加后效果如下图,其他4个工程项目重复操作即可。
五、编译生成
先编译 BasicUsageEnvironment、groupsock、liveMedia、UsageEnvironment 这四个项目
注意 mediaServer 是最后再编译的。
右击属性,点击生成。
然后可以看到 live555/Debug 文件夹下有生成的四个 lib 文件
然后在 mediaServer 目录下新建一个 lib 文件夹,将这四个 lib 文件拷贝到该文件夹下。
配置 mediaServer 的属性->链接器->常规->附加库目录,输入“ lib” (刚才拷贝库文件的目录)
配置属性->链接器->输入->附加依赖项,输入
BasicUsageEnvironment.lib;groupsock.lib;liveMedia.lib;UsageEnvironment.lib;Ws2_32.lib
此刻再编译 mediaServer,OK 编译成功,生成 mediaServer.exe。
问题分析:
这里遇到一个问题,检查了一个小时。最后发现是 liveMedia 和 Groupsock 中有几个 .c 文件未拷贝到项目中。
1>------ 已启动全部重新生成: 项目: mediaServer, 配置: Debug Win32 ------
1>live555MediaServer.cpp
1>DynamicRTSPServer.cpp
1>d:\zslfchenjuke\work2017\live555\live555\mediaserver\dynamicrtspserver.cpp(50): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>c:\program files (x86)\windows kits\10\include\10.0.15063.0\ucrt\stdio.h(207): note: 参见“fopen”的声明
1>d:\zslfchenjuke\work2017\live555\live555\mediaserver\dynamicrtspserver.cpp(188): warning 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.
1>c:\program files (x86)\windows kits\10\include\10.0.15063.0\ucrt\stdio.h(1772): note: 参见“sprintf”的声明
1>正在生成代码...
1>BasicUsageEnvironment.lib(BasicUsageEnvironment.obj) : error LNK2019: 无法解析的外部符号 _initializeWinsockIfNecessary,该符号在函数 "protected: __thiscall BasicUsageEnvironment::BasicUsageEnvironment(class TaskScheduler &)" (??0BasicUsageEnvironment@@IAE@AAVTaskScheduler@@@Z) 中被引用
1>groupsock.lib(GroupsockHelper.obj) : error LNK2001: 无法解析的外部符号 _initializeWinsockIfNecessary
1>groupsock.lib(NetAddress.obj) : error LNK2019: 无法解析的外部符号 _our_inet_addr,该符号在函数 "public: __thiscall NetAddressList::NetAddressList(char const *)" (??0NetAddressList@@QAE@PBD@Z) 中被引用
1>groupsock.lib(GroupsockHelper.obj) : error LNK2001: 无法解析的外部符号 _our_inet_addr
1>groupsock.lib(GroupsockHelper.obj) : error LNK2019: 无法解析的外部符号 _our_srandom,该符号在函数 "unsigned int __cdecl ourIPAddress(class UsageEnvironment &)" (?ourIPAddress@@YAIAAVUsageEnvironment@@@Z) 中被引用
1>groupsock.lib(GroupsockHelper.obj) : error LNK2019: 无法解析的外部符号 _our_random,该符号在函数 "unsigned int __cdecl chooseRandomIPv4SSMAddress(class UsageEnvironment &)" (?chooseRandomIPv4SSMAddress@@YAIAAVUsageEnvironment@@@Z) 中被引用
1>liveMedia.lib(ProxyServerMediaSession.obj) : error LNK2001: 无法解析的外部符号 _our_random
1>liveMedia.lib(RTCP.obj) : error LNK2001: 无法解析的外部符号 _our_random
1>liveMedia.lib(RTPSink.obj) : error LNK2001: 无法解析的外部符号 _our_random
1>liveMedia.lib(GenericMediaServer.obj) : error LNK2019: 无法解析的外部符号 _our_random32,该符号在函数 "protected: class GenericMediaServer::ClientSession * __thiscall GenericMediaServer::createNewClientSessionWithId(void)" (?createNewClientSessionWithId@GenericMediaServer@@IAEPAVClientSession@1@XZ) 中被引用
1>liveMedia.lib(RTPSink.obj) : error LNK2001: 无法解析的外部符号 _our_random32
1>liveMedia.lib(RTPSource.obj) : error LNK2001: 无法解析的外部符号 _our_random32
1>liveMedia.lib(RTCP.obj) : error LNK2019: 无法解析的外部符号 _OnExpire,该符号在函数 "private: void __thiscall RTCPInstance::onExpire1(void)" (?onExpire1@RTCPInstance@@AAEXXZ) 中被引用
1>liveMedia.lib(RTCP.obj) : error LNK2019: 无法解析的外部符号 _OnReceive,该符号在函数 "private: void __thiscall RTCPInstance::onReceive(int,int,unsigned int)" (?onReceive@RTCPInstance@@AAEXHHI@Z) 中被引用
1>D:\zslfchenjuke\work2017\LIVE555\live555\Debug\mediaServer.exe : fatal error LNK1120: 7 个无法解析的外部命令
1>已完成生成项目“mediaServer.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========
再有可能遇到下面的问题(我是没有遇到)
error C4996: ‘_snprintf’:This function or variable may be unsafe. Consider using _snprintf_s instead. Todisable deprecation, use _CRT_SECURE_NO_WARNINGS.
参看:Live555源代码下载编译与测试
六、测试
双击 mediaServer.exe
然后找一个视频文件,放在和 mediaServer.exe 同一目录。注意视频格式,要是上面所支持的。
然后打开 VLC,媒体->打开网络串流,输入网络URL。 rtsp://电脑IP地址/<filename>