windows下编译live555

然后开始下载编译,其中包含,Windows、Linux和交叉编译三种形式。

首先来讲Windows下编译

参看:Live555研究之一 源代码编译

一、下载源码

下载:Index of /liveMedia/public

 

参看:LIVE555 Streaming Media

 

选择下载 live555-latest.tar.gz

windows下编译live555

二、文件介绍

我的开发环境为 win 10 64位+VS2017

将上面下载的 live555-latest.tar.gz 解压

windows下编译live555

包括上述四个库和mediaServer服务器程序,以及其他的测试代码。

这几个文件在官网是有介绍的:

参看:live555 Description

三、创建工程

这个我已经不陌生了,在讲 FFmpeg 的时候就创建过好几次了。

参看:FFmpeg再学习 -- Windows下安装说明

新建控制台工程

打开 VS;

文件->新建->项目->Win32控制台应用程序,点击确认。

注意,选择的位置最好不要有空格或者汉字。

(1)BasicUsageEnvironment

项目名称为 BasicUsageEnvironment,解决方案名称为 live555

windows下编译live555

windows下编译live555

 

应用程序类型为静态库,附加选项不勾选预编译头

windows下编译live555

(2)UsageEnvironment

添加新建项目,选择win32控制台项目,项目名称为 UsageEnvironment

windows下编译live555

windows下编译live555

 

应用程序类型为静态库,附加选项不勾选预编译头

windows下编译live555

(3)groupsock 

添加新建项目,选择win32控制台项目,项目名称为 groupsock 

windows下编译live555

windows下编译live555

 

应用程序类型为静态库,附加选项不勾选预编译头

windows下编译live555

(4)liveMedia 

添加新建项目,选择win32控制台项目,项目名称为 liveMedia 

windows下编译live555

windows下编译live555

 

应用程序类型为静态库,附加选项不勾选预编译头

windows下编译live555

(5)mediaServer

添加新建项目,选择win32控制台项目,项目名称为 mediaServer

windows下编译live555

windows下编译live555

 

应用程序类型为控制台应用程序,附加选项为勾选空项目

windows下编译live555

(6)最终创建的 5 个项目

windows下编译live555

对比一下和源码的那些库文件名,它们是一一对应的

windows下编译live555

 

四、将源文件加入工程

(1)打开源码目录,将BasicUsageEnvironment、UsageEnvironment、groupsock、mediaServer、liveMedia目录下的include目录、cpp文件、c文件、.hh和.h文件拷贝到上述创建的对应的工程目录下。

注意:尤其是 liveMedia 和 Groupsock 中有几个 .c 文件,千万不要忘记添加了。

后面会讲到,忘记这事,遇到个问题查了一个多小时才搞定。

 

点击右键,选择在资源管理器中打开文件夹,进入项目目录。

(注意,如果手动进入注意文件夹位置,我就是没找好位置,试了半天最后才发现,将上面的这些文件拷贝到错误的文件夹下了)

windows下编译live555

 

举个例子,拷贝完后此时的 BasicUsageEnvironment 项目目录下文件为:

windows下编译live555

同样的方法拷贝完其他四个项目。

 

(2)接着就是将这些文件添加进对应项目,将每个工程下的 include下的头文件则添加到头文件筛选器下,再将 .cpp、.c、.hh 和 .h 添加到源文件筛选器下。

windows下编译live555

 

windows下编译live555

 

来一个效果图

windows下编译live555

 

(3)添加依赖头文件。在属性->C/C++->常规->附加包含目录填写需要包含的头文件路径

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

 

BasicUsageEnvironment添加后效果如下图,其他4个工程项目重复操作即可。

windows下编译live555

五、编译生成

先编译 BasicUsageEnvironment、groupsock、liveMedia、UsageEnvironment 这四个项目

注意 mediaServer 是最后再编译的。

右击属性,点击生成。

windows下编译live555

windows下编译live555

 

然后可以看到 live555/Debug 文件夹下有生成的四个 lib 文件

windows下编译live555

然后在 mediaServer 目录下新建一个 lib 文件夹,将这四个 lib 文件拷贝到该文件夹下。

windows下编译live555

配置 mediaServer 的属性->链接器->常规->附加库目录,输入“ lib” (刚才拷贝库文件的目录)

windows下编译live555

 

配置属性->链接器->输入->附加依赖项,输入 

BasicUsageEnvironment.lib;groupsock.lib;liveMedia.lib;UsageEnvironment.lib;Ws2_32.lib

windows下编译live555

windows下编译live555

 

此刻再编译 mediaServer,OK 编译成功,生成 mediaServer.exe。

windows下编译live555

 

问题分析:

这里遇到一个问题,检查了一个小时。最后发现是 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 &)" ([email protected]@[email protected]@@@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 *)" ([email protected]@[email protected]@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 &)" ([email protected]@[email protected]@@Z) 中被引用
1>groupsock.lib(GroupsockHelper.obj) : error LNK2019: 无法解析的外部符号 _our_random,该符号在函数 "unsigned int __cdecl chooseRandomIPv4SSMAddress(class UsageEnvironment &)" ([email protected]@[email protected]@@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)" ([email protected]@@[email protected]@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)" ([email protected]@@AAEXXZ) 中被引用
1>liveMedia.lib(RTCP.obj) : error LNK2019: 无法解析的外部符号 _OnReceive,该符号在函数 "private: void __thiscall RTCPInstance::onReceive(int,int,unsigned int)" ([email protected]@@[email protected]) 中被引用
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 

windows下编译live555

 

然后找一个视频文件,放在和 mediaServer.exe 同一目录。注意视频格式,要是上面所支持的。

然后打开 VLC,媒体->打开网络串流,输入网络URL。 rtsp://电脑IP地址/<filename>