live555 是一个 C++ 开发的流媒体项目,它主要由几个用于多媒体流的库组成,其官方网站地址为 http://www.live555.com/。live555 使用开放的标准协议 (RTP/RTCP,RTSP,SIP),方便与其它标准的流媒体组件互操作。这些库可以为 Unix-like(包括 Linux 和 Mac OS X),Windows,和 QNX (及其它 POSIX 兼容系统)等系统进行编译,它们可以被用于构建流媒体应用。除了库之外,live555 还包含了两个流媒体应用程序 "LIVE555 Media Server" 和 "LIVE555 Proxy Server",它们都是 RTSP 服务器应用程序。
live555 的库可以被用于处理 MPEG,H.265,H.264,H.263+,DV 或 JPEG 视频,及多种音频格式。它们还可以非常简单地进行扩展,以支持其它的音频或视频编解码格式,并可以被用于构建基本的 RTSP 或 SIP 客户端和服务器。
live555 的源代码是开放的,可以方便地供所有音视频开发研究爱好者学习研究,或者针对自己实际的项目进行扩展。其源码下载地址为 http://www.live555.com/liveMedia/live.2019.03.06.tar.gz 使用的操作系统为 64 位的 Ubuntu 16.04 版。下载源码,然后通过如下命令解压缩:
hanpfei0306@ThundeRobot:/media/data/osprojects$ tar xf live555-latest.tar.gz
hanpfei0306@ThundeRobot:/media/data/osprojects$ cd live
可以通过如下命令编译 live555:
hanpfei0306@ThundeRobot:/media/data/osprojects/live$ ./genMakefiles linux-64bit
hanpfei0306@ThundeRobot:/media/data/osprojects/live$ make
cd liveMedia ; make
make[1]: Entering directory '/media/data/osprojects/live/liveMedia'
c++ -c -Iinclude -I../UsageEnvironment/include -I../groupsock/include -m64 -fPIC -I. -O2 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -Wall -DBSD=1 Media.cpp
c++ -c -Iinclude -I../UsageEnvironment/include -I../groupsock/include -m64 -fPIC -I. -O2 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -Wall -DBSD=1 MediaSource.cpp
c++ -c -Iinclude -I../UsageEnvironment/include -I../groupsock/include -m64 -fPIC -I. -O2 -DSOCKLEN_T=socklen_t -D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64 -Wall -DBSD=1 FramedSource.cpp
. . . . . .
其中 genMakefiles
脚本用于产生 Makefile 文件,它需要一个操作系统版本的版本号作为参数,该脚本文件的内容如下:
#!/bin/sh
usage() {
echo "Usage: $0 "
exit 1
}
if [ $# -ne 1 ]
then
usage $*
fi
platform=$1
subdirs="liveMedia groupsock UsageEnvironment BasicUsageEnvironment testProgs mediaServer proxyServer"
for subdir in $subdirs
do
/bin/rm -f $subdir/Makefile
cat $subdir/Makefile.head config.$platform $subdir/Makefile.tail > $subdir/Makefile
chmod a-w $subdir/Makefile
done
/bin/rm -f Makefile
cat Makefile.head config.$1 Makefile.tail > Makefile
chmod a-w Makefile
这个脚本就是把各个目录下的多个文件预先定义的 Makefile 内容文件合并起来,产生最终的 Makefile 文件。每个文件夹下面都预定义了平台相关的配置文件,如,在项目根目录下:
hanpfei0306@ThundeRobot:/media/data/osprojects/live$ ls | grep config
config.aix
config.alpha
config.armeb-uclibc
config.armlinux
config.avr32-linux
config.bfin-linux-uclibc
config.bfin-uclinux
config.bsplinux
config.cris-axis-linux-gnu
config.cygwin
config.cygwin-for-vlc
config.freebsd
config.iphoneos
config.iphone-simulator
config.irix
config.linux
config.linux-64bit
config.linux-gdb
config.linux-with-shared-libraries
config.macosx
config.macosx-32bit
config.macosx-before-version-10.4
config.mingw
config.openbsd
config.qnx4
config.solaris-32bit
config.solaris-64bit
config.sunos
config.uClinux
提供给 genMakefiles
脚本的操作系统版本的版本号参数,需要与这些配置文件中,要编译的目标操作系统对应的那个配置文件的后缀名匹配。编译完成后,由各个库产生 .a
文件,各个库及各个应用程序的目标文件都位于它们自己的目录中。
媒体服务应用程序的可执行文件位于 live/mediaServer/live555MediaServer
。
live555 中的流媒体服务器应用程序 live555MediaServer
可以非常方便地用来提供流媒体服务。在存放流媒体文件的目录下执行 live555MediaServer
:
$ ./live555MediaServer
然后就可以通过如下格式的 URL 播放流媒体文件了:
rtsp://10.240.248.20:8554/
其中
为执行 live555MediaServer
命令的目录下的流媒体文件,IP 地址为主机的 IP 地址。
live555MediaServer
程序运行起来之后,可以使用播放器软件,如 VLC Media Player 和 ffplay 播放流媒体内容。如:
$ ffplay rtsp://10.240.248.20:8000/raw_h264_stream.264
如果只是想玩一下 live555MediaServer
的话,还可以直接下载它的编译好的二进制文件,地址。
接着来看 live555 的源码结构。首先为 live555 创建一个 Eclipse 的 C++ Project,方法为选择菜单栏的 File -> New -> C++ Project,弹出如下对话框:
Project Name:
一栏输入工程名字,这里用 live555
;反选 Use default location
,然后在 Location:
一栏中输入 live555 源码的路径;在 Project type:
下选择 Makefile project
-> Empty Project
;在 Toolchains:
下选择 Linux GCC
。
然后点击右下角的 Finish
按钮,创建工程。live555 源码结构如下:
live555 源码主要由八个部分组成:UsageEnvironment,BasicUsageEnvironment,groupsock,liveMedia,mediaServer,proxyServer,testProgs,WindowsAudioInputDevice。
各个部分的代码量如下表所示:
子模块 | 文件个数 | 代码量(行) |
---|---|---|
UsageEnvironment | 3 | 162 |
BasicUsageEnvironment | 6 | 1187 |
groupsock | 8 | 2672 |
liveMedia | 168 | 49552 |
mediaServer | 2 | 332 |
proxyServer | 1 | 251 |
WindowsAudioInputDevice | 4 | 1037 |
testProgs | 32 | 6510 |
总共 | 224 | 61703 |
各个部分的简要说明如下。
UsageEnvironment 中的 "UsageEnvironment" 和 "TaskScheduler" 类用于调度延迟的事件,为异步的读事件分配处理程序,以及输出错误/警告消息。UsageEnvironment 中的 "HashTable" 类还为范型哈希表定义了接口,由其余的代码使用。UsageEnvironment 中的都是抽象类;它们必须在实现中被继承。这些子类可以利用它运行的环境的特定属性,比如它的 GUI 和/或脚本环境。
BasicUsageEnvironment 库则定义了 UsageEnvironment 中的类的一个具体实现,用于简单的终端应用程序。读取事件和延迟操作使用一个 select()
循环处理。
这个库中的类封装了网络接口和 sockets。特别是其中的 "Groupsock" 类封装了一个 socket,用于发送(和/或接收)组播数据报。
这个库是 live555 的核心所在。其中定义了一个类层次体系,以 "Medium" 为顶层基类,用于各种各样的流媒体类型和编解码。
mediaServer 目录下的是 "LIVE555 Media Server",它是一个完整的 RTSP 服务器应用程序。它可以把几种媒体文件转为流,如前面看到的,这些文件必须位于当前工作目录。这些文件包括:
proxyServer 目录下的是 "LIVE555 Proxy Server",它是一个单播 RTSP 服务器,它为一个或多个 “后端” 单播或多播 RTSP/RTP 流扮演 “ 代理”的角色。
这是 "liveMedia" 库的 "AudioInputDevice" 抽象类的一个实现。它可以被 Windows 应用程序用于从输入设备读取 PCM 音频采样。
这个目录实现了一些简单的程序,使用 "BasicUsageEnvironment" 来演示如何使用这些库开发应用程序。其中除了包括用于测试库的测试应用之外,还包括 "openRTSP" - 命令行的 RTSP 客户端,"playSIP" - 命令行的 SIP 会话记录器,"vobStreamer" - 网络 DVD 播放器等工具。
live555 源码分析:简介
live555 源码分析:基础设施
live555 源码分析:MediaSever
Wireshark 抓包分析 RTSP/RTP/RTCP 基本工作过程
live555 源码分析:RTSPServer
live555 源码分析: DESCRIBE 的处理
live555 源码分析: SETUP 的处理
live555 源码分析: PLAY 的处理
live555 源码分析:RTSPServer 组件结构
live555 源码分析:ServerMediaSession
live555 源码分析:子会话 SDP 行生成
live555 源码分析:子会话 SETUP
live555 源码分析:播放启动