live555 源码分析:简介

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/public/

其中 live555-latest.tar.gz 为最新版源码,live.2017.07.18.tar.gz 为最近一个正式的版本的源码。除了源码之外,live555 还提供了许多用于开发测试的音视频文件,如 264 目录下的是原始 H.264 码流测试文件, 265 目录下的是原始 H.265 码流测试文件等。

这里使用 live555 的最新版本源码,live555-latest.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 <os-platform>"
    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

使用 live555MediaServer 提供流媒体服务

live555 中的流媒体服务器应用程序 live555MediaServer 可以非常方便地用来提供流媒体服务。在存放流媒体文件的目录下执行 live555MediaServer

$ ./live555MediaServer

然后就可以通过如下格式的 URL 播放流媒体文件了:

rtsp://10.240.248.20:8554/<filename>

其中 <filename> 为执行 live555MediaServer 命令的目录下的流媒体文件,IP 地址为主机的 IP 地址。

live555MediaServer 程序运行起来之后,可以使用播放器软件,如 VLC Media Player 和 ffplay 播放流媒体内容。如:

$ ffplay rtsp://10.240.248.20:8000/raw_h264_stream.264

如果只是想玩一下 live555MediaServer 的话,还可以直接下载它的编译好的二进制文件,地址

live555 源码结构

接着来看 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 和 BasicUsageEnvironment

UsageEnvironment 中的 “UsageEnvironment” 和 “TaskScheduler” 类用于调度延迟的事件,为异步的读事件分配处理程序,以及输出错误/警告消息。UsageEnvironment 中的 “HashTable” 类还为范型哈希表定义了接口,由其余的代码使用。UsageEnvironment 中的都是抽象类;它们必须在实现中被继承。这些子类可以利用它运行的环境的特定属性,比如它的 GUI 和/或脚本环境。

BasicUsageEnvironment 库则定义了 UsageEnvironment 中的类的一个具体实现,用于简单的终端应用程序。读取事件和延迟操作使用一个 select() 循环处理。

groupsock

这个库中的类封装了网络接口和 sockets。特别是其中的 “Groupsock” 类封装了一个 socket,用于发送(和/或接收)组播数据报。

liveMedia

这个库是 live555 的核心所在。其中定义了一个类层次体系,以 “Medium” 为顶层基类,用于各种各样的流媒体类型和编解码。

mediaServer 和 proxyServer

mediaServer 目录下的是 “LIVE555 Media Server”,它是一个完整的 RTSP 服务器应用程序。它可以把几种媒体文件转为流,如前面看到的,这些文件必须位于当前工作目录。这些文件包括:

  • MPEG TS 文件(文件后缀名为 “.ts”)
  • Matroska 或 WebM 文件(文件后缀名为 “.mkv” 或 “.webm”)
  • Ogg 文件(文件后缀名为 “.ogg”,”ogv” 或 “.opus”)
  • MPEG-1 或 2 程序流文件(文件后缀名为 “.mpg”)
  • MPEG-4 Video Elementary Stream 文件(文件后缀名为 “.m4e”)
  • H.264 Video Elementary Stream 文件(文件后缀名为”.264”)
  • H.265 Video Elementary Stream 文件(文件后缀名为”.265”)
  • VOB 视频+音频文件(文件后缀名为”.vob”)
  • DV 视频文件(文件后缀名为”.dv”)
  • MPEG-1 或 2 (包括 layer III - 比如 ‘MP3’) 音频文件(文件后缀名为”.mp3”)
  • WAV (PCM) 音频文件(文件后缀名为”.wav”)
  • AMR 音频文件(文件后缀名为”.amr”)
  • AC-3 音频文件(文件后缀名为”.ac3”)
  • AAC (ADTS 格式) 音频文件(文件后缀名为”.aac”)

proxyServer 目录下的是 “LIVE555 Proxy Server”,它是一个单播 RTSP 服务器,它为一个或多个 “后端” 单播或多播 RTSP/RTP 流扮演 “ 代理”的角色。

WindowsAudioInputDevice

这是 “liveMedia” 库的 “AudioInputDevice” 抽象类的一个实现。它可以被 Windows 应用程序用于从输入设备读取 PCM 音频采样。

testProgs

这个目录实现了一些简单的程序,使用 “BasicUsageEnvironment” 来演示如何使用这些库开发应用程序。其中除了包括用于测试库的测试应用之外,还包括 “openRTSP” - 命令行的 RTSP 客户端,”playSIP” - 命令行的 SIP 会话记录器,”vobStreamer” - 网络 DVD 播放器等工具。

Done。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Live555是一款开源的多媒体流服务器,支持实时流媒体的传输。下面是部分Live555源代码的分析: 1. MediaSession类 MediaSession类是Live555中最核心的类之一,它表示了一个媒体会话,包括了媒体流的传输协议、媒体编码格式、传输方式等信息。MediaSession类中的成员变量包括: - fServerMediaSession:代表了一个媒体服务器会话,负责提供媒体流的传输。 - fSubsessions:代表了一个或多个媒体流的传输会话,可以是RTP/RTCP、HTTP/RTSP等协议。 - fSdpLines:代表了SDP协议中的信息,可以是媒体流的编码格式、传输方式等信息。 MediaSession类中的核心方法包括: - createNew:用于创建一个新的媒体会话。 - addSubsession:用于添加一个媒体流的传输会话。 - generateSdpDescription:用于生成SDP协议描述信息。 - startStream:用于开始媒体流的传输。 - pauseStream:用于暂停媒体流的传输。 - seekStream:用于跳转媒体流的传输。 2. MediaSubsession类 MediaSubsession类表示了一个媒体流的传输会话,包括了媒体流的传输协议、媒体编码格式、传输方式等信息。MediaSubsession类中的成员变量包括: - fParentSession:代表了父级MediaSession类的实例。 - fRTPSink:代表了RTP数据的发送器。 - fRTCPInstance:代表了RTCP数据的发送器。 - fTrackNumber:代表了媒体流的轨道编号。 - fCodecName:代表了媒体流的编码格式。 - fMediumName:代表了媒体流的传输方式。 MediaSubsession类中的核心方法包括: - initiate:用于初始化媒体流的传输。 - startStream:用于开始媒体流的传输。 - pauseStream:用于暂停媒体流的传输。 - seekStream:用于跳转媒体流的传输。 3. RTSPServer类 RTSPServer类是Live555中实现RTSP协议的服务器类。RTSPServer类中的成员变量包括: - fServerMediaSession:代表了一个媒体服务器会话,负责提供媒体流的传输。 - fHTTPServerPort:代表了HTTP服务器的端口号。 - fRTSPServerPort:代表了RTSP服务器的端口号。 RTSPServer类中的核心方法包括: - createNew:用于创建一个新的RTSP服务器。 - start:用于启动RTSP服务器。 - stop:用于停止RTSP服务器。 - incomingConnectionHandler:用于处理RTSP客户端的连接请求。 - handleCmd_DESCRIBE:用于处理DESCRIBE命令。 - handleCmd_SETUP:用于处理SETUP命令。 - handleCmd_PLAY:用于处理PLAY命令。 - handleCmd_PAUSE:用于处理PAUSE命令。 - handleCmd_TEARDOWN:用于处理TEARDOWN命令。 以上是Live555源代码的部分分析,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值