Win7下使用VS2013编译live555
一.live555简介
live555是一个为流媒体提供解决方案的跨平台C++开源项目,它实现了对标准流媒体传输协议如RTP/RTCP、RTSP、SIP等的支持。live555能在Linux,Mac OS X,Windows和QNX等多个平台编译和运行。目前,它被用于流化、接收和处理MPEG、H.264、H.265、H.263+、DV等视频,以及MPEG(MP3的编码)、AAC、PCM等音频。由于良好的扩展性,live555可轻松支持其他的音视频编码格式,相关功能已经被添加到多款流行的播放器中,比如说VLC和MPlayer。
更多介绍详见官网:LIVE555.COM
二.下载
下载链接:Index of /liveMedia/public
已经更新到了2016.11.06
三.编译
这里config-windows有编译步骤。
1.解压到E:\live555
2.修改E:\live555\win32config文件,将文件中的TOOLS32= c:\Program Files\DevStudio\Vc改为你的VS2013路径,我改成了TOOLS32= C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC
3.cd到E:\live555,执行genWindowsMakefiles,会在E:\live555的每个子文件夹中生成后缀为.mak的MakeFiles文件,该文件能被VS打开
4.用VS2013打开各个子文件夹中的*.mak文件,此时会发现VS2013根本就不能打开*.mak文件,google后发现只有VC6.0才能直接打开*.mak文件,此后版本的VS只能用命令行来编译。So,没必要继续看下去了。
现在直接新建VS2013工程,将源文件添加进去,然后再进行编译。这种方法虽然繁琐,但是便于调试。
在E:\live555中共有8个子文件夹,如下所示:
其中其中BasicUsageEnvironment、groupsock、liveMedia、UsageEnvironment、WindowsAudioInputDevice是基础类库,以静态库的形式存在,testProgs则主要存放一些测试代码,mediaServer则是服务器的主程序,以一个可执行文件形式存在。
UsageEnvironment:UsageEnvironment和TaskScheduler类用于调度延迟事件、给异步读事件分配句柄、输出错误或警告消息。HashTable类定义了通用哈希表接口,该接口被源码的其他部分使用。这些类是抽象类,需要去继承并实现。
groupsock:这个库的类封装了网络接口和套接字,需要注意的是,Groupsock封装了发送或接收组播报文的操作。
liveMedia:这个库定义了以Medium类为根的树状层级类,封装了大量流媒体类型和编码。
BasicUsageEnvironment:这个类是UsageEnvironment的一个实现类。
testProgs:一些测试程序。
WindowsAudioInputDevice:这个库是liveMedia中抽象类AudioInputDevice的实现,能在Windows上从输入设备读取PCM音频采样。
mediaServer:服务器主程序。
proxyServer:代理服务器,以一个可执行文件形式存在。
1.新建一个空白解决方案
像该解决方案中添加7个Win32控制台项目(不包括例子),其中5个静态库如下设置,选择静态库,并且不勾选预编译头。
两个可执行程序如下设置,选择控制台应用程序,并且勾选空项目。
添加完成后,解决方案如下图所示:
然后就是向各个项目中添加源代码,注意源代码一定别遗漏,否则静态库虽然编译可能通过,但是调用时会出现链接错误。此时直接编译肯定是编不过的,相关的头文件和库文件没有添加。
这里以编译BasicUsageEnvironment和mediaServer为例,其他的操作类似。
2.BasicUsageEnvironment编译
为了防止类似error C4996: '_snprintf': This function or variable may be unsafe的错误,7个项目中都要在预处理定义中加入_CRT_SECURE_NO_DEPRECATE和_WINSOCK_DEPRECATED_NO_WARNINGS
3.mediaServer编译
等5个静态库编译成功后(WindowsAudioInputDevice暂时没用到,可以先不用编译),就可以编译mediaServer了。
这里以Debug配置来演示,Release步骤一样。5个静态库默认被编译到E:\live555\live555project\Debug,像上图设置可以加入库目录。
注意别忘了添加Ws2_32.lib,不然的话,会出现一大堆Socket相关的链接错误。编译成功的mediaServer也在E:\live555\live555project\Debug中。
4.mediaServer运行
控制台中打印出客户端访问时使用的URL地址格式和live555支持的文件类型。
四.测试
这里需要特别注意一点,当通过IDE运行mediaServer时,live555推送的是项目工作目录中的视频或音频。工作目录也就是和*.vcxproj同级的目录,即E:\live555\live555project\mediaServer,此时视频应该放在这个目录下。当双击mediaServer.exe运行时,视频理所当然的和mediaServer.exe放在一个目录,即E:\live555\live555project\Debug。
测试视频:480320.264
客户端:vlc-2.2.4-win32
操作步骤:
如果URL地址不对(视频名字错了或其他原因),会出现如下提示:
需要说明的是mediaServer只实现读取本地文件推送到客户端的点播功能,实际应用中往往需要实时采集影视频数据,并打包成RTSP流推送出去,即直播。此时,可以继承live555的相关类,实现从内存中读取数据并推送。详见下篇:
通过live555实现H264 RTSP直播(Windows版)
参考链接:live555 --- vs2010编译_maplele20的博客-CSDN博客
------------------------------------------------------分割线---------------------------------------------------------------
Win10下用VS2017编译live555
当前live555已经更新到了2022.04.26
源码目录结构和六年前相比没有变化,用VS2017编译的方法也和VS2013一样,其实用Qt Creator来编译也很方便,文末是pro文件
这里突然更新一下,是因为去年做了个基于libVLC的视频播放器,现在想看看live555的源码,要看当然看最新的源码啦,顺便更新下这篇博文
live555\BasicUsageEnvironment\BasicUsageEnvironment.pro
TARGET = BasicUsageEnvironment
TEMPLATE = lib
CONFIG += staticlib
contains(QT_ARCH, i386) {
DESTDIR = ../out/win32
} else {
DESTDIR = ../out/x64
}
DEFINES += _CRT_SECURE_NO_DEPRECATE \
_WINSOCK_DEPRECATED_NO_WARNINGS
INCLUDEPATH += $$PWD/include \
$$PWD/../groupsock/include \
$$PWD/../liveMedia/include \
$$PWD/../UsageEnvironment/include
HEADERS += $$PWD/include/*.hh
SOURCES += $$PWD/*.cpp
live555\groupsock\groupsock.pro
TARGET = groupsock
TEMPLATE = lib
CONFIG += staticlib
contains(QT_ARCH, i386) {
DESTDIR = ../out/win32
} else {
DESTDIR = ../out/x64
}
DEFINES += _CRT_SECURE_NO_DEPRECATE \
_WINSOCK_DEPRECATED_NO_WARNINGS \
NO_GETIFADDRS
INCLUDEPATH += $$PWD/include \
$$PWD/../BasicUsageEnvironment/include \
$$PWD/../liveMedia/include \
$$PWD/../UsageEnvironment/include
HEADERS += $$PWD/include/*.hh
SOURCES += $$PWD/*.cpp \
$$PWD/*.c
live555\liveMedia\liveMedia.pro
TARGET = liveMedia
TEMPLATE = lib
CONFIG += staticlib
contains(QT_ARCH, i386) {
DESTDIR = ../out/win32
} else {
DESTDIR = ../out/x64
}
DEFINES += _CRT_SECURE_NO_DEPRECATE \
_WINSOCK_DEPRECATED_NO_WARNINGS \
NO_OPENSSL
macx {
DEFINES += LOCALE_NOT_USED
}
INCLUDEPATH += $$PWD/include \
$$PWD/../BasicUsageEnvironment/include \
$$PWD/../groupsock/include \
$$PWD/../UsageEnvironment/include
HEADERS += $$PWD/include/*.hh \
$$PWD/*.hh
SOURCES += $$PWD/*.cpp \
$$PWD/*.c
live555\UsageEnvironment\UsageEnvironment.pro
TARGET = UsageEnvironment
TEMPLATE = lib
CONFIG += staticlib
contains(QT_ARCH, i386) {
DESTDIR = ../out/win32
} else {
DESTDIR = ../out/x64
}
DEFINES += _CRT_SECURE_NO_DEPRECATE \
_WINSOCK_DEPRECATED_NO_WARNINGS
INCLUDEPATH += $$PWD/include \
$$PWD/../BasicUsageEnvironment/include \
$$PWD/../groupsock/include \
$$PWD/../liveMedia/include
HEADERS += $$PWD/include/*.hh
SOURCES += $$PWD/*.cpp
live555\live555.pro
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
$$PWD/BasicUsageEnvironment \
$$PWD/groupsock \
$$PWD/liveMedia \
$$PWD/UsageEnvironment
直接打开live555.pro就可以编译生成静态库,最后贴下mediaServer的pro文件
live555\mediaServer.pro
QT -= gui
TARGET = mediaServer
TEMPLATE = app
CONFIG += c++11 console
CONFIG -= app_bundle
DEFINES += _CRT_SECURE_NO_DEPRECATE \
_WINSOCK_DEPRECATED_NO_WARNINGS \
NO_OPENSSL
INCLUDEPATH += $$PWD/BasicUsageEnvironment/include \
$$PWD/groupsock/include \
$$PWD/liveMedia/include \
$$PWD/UsageEnvironment/include
HEADERS += $$PWD/mediaServer/*.hh \
SOURCES += $$PWD/mediaServer/*.cpp \
LIBS += Ws2_32.lib
contains(QT_ARCH, i386) {
DESTDIR = out/win32
LIBS += $$PWD/out/win32/BasicUsageEnvironment.lib \
$$PWD/out/win32/groupsock.lib \
$$PWD/out/win32/liveMedia.lib \
$$PWD/out/win32/UsageEnvironment.lib
} else {
DESTDIR = out/x64
LIBS += $$PWD/out/x64/BasicUsageEnvironment.lib \
$$PWD/out/x64/groupsock.lib \
$$PWD/out/x64/liveMedia.lib \
$$PWD/out/x64/UsageEnvironment.lib
}
原文链接:https://blog.csdn.net/caoshangpa/article/details/53169297