live555 源码分析(一:简介)

1.1 LIVE555简介

基于标准的RTP / RTCP / RTSP / SIP多媒体流的源代码库,适用于嵌入式和/或低成本流应用。也可以看看其他的:

  • openRTSP 命令行RTSP客户端
  • playSIP 命令行的SIP会话记录
  • wis-streamer Linux WIS GO7007编码器驱动程序的开源流服务器
  • RTSP/RTP streaming support 用于“ MPlayer”媒体播放器
  • vobStreamerTM 网络DVD播放器(通过LAN传输DVD内容)

帮助支持对“ LIVE555流媒体”软件的改进和扩展:LIVE555 Funded Projects。

该代码使用开放标准协议(RTP / RTCP,RTSP,SIP)形成了一组用于多媒体流的C ++库。这些库-可以针对Unix(包括Linux和Mac OS X),Windows和QNX(以及其他POSIX兼容系统)进行编译,可以用于构建流应用程序。这些库已经用于实现诸如“ LIVE555媒体服务器”和“ LIVE555代理服务器”(RTSP服务器应用程序)和“ vobStreamer”(用于使用RTP / RTCP / RTSP传输DVD内容)之类的应用程序。这些库还可以用于流式传输,接收和处理MPEG,H.265,H.264,H.263 +,DV或JPEG视频以及几种音频编解码器。它们可以轻松扩展以支持其他(音频和/或视频)编解码器,还可以用于构建基本的RTSP或SIP客户端和服务器,还可以用于向现有的媒体播放器应用程序添加流支持,例如“ VLC ”和“ MPlayer”。(有关如何使用这些库的一些特定示例,请参见下面的测试程序。)

1.2 源码下载

项目的源代码:http://live555.com/liveMedia/public/
live555 源码分析(一:简介)_第1张图片
其中live.2020.02.11.tar.gz是最近一个正式版本的源码,我这人比较喜欢稳定,就用正式版的吧。 live555-latest.tar.gz 为最新版源码,想玩最新的也可以下载玩玩,除了源码之外,live555 还提供了许多用于开发测试的音视频文件,如 264 目录下的是原始 H.264 码流测试文件, 265 目录下的是原始 H.265 码流测试文件等。

1.3 源码描述

该代码包含以下库,每个库都有自己的子目录:

1.3.1 UsageEnvironment

“UsageEnvironment”和“TaskScheduler”类用于调度延迟事件,为异步读取事件分配处理程序,以及输出错误/警告消息。另外,“HashTable”类定义了一个通用哈希表的接口,其余代码将使用这个接口。
UsageEnvironment继承关系:
live555 源码分析(一:简介)_第2张图片
UsageEnvironment协作图:
live555 源码分析(一:简介)_第3张图片
TaskScheduler继承关系:
live555 源码分析(一:简介)_第4张图片
hashTable继承关系:
live555 源码分析(一:简介)_第5张图片

1.3.2 groupsock

这个库中的类封装了网络接口和套接字。尤其,“Groupsock”类封装了一个用于发送(和/或接收)多播数据报的套接字。

groupsock继承关系:
live555 源码分析(一:简介)_第6张图片
groupsock协作图:
live555 源码分析(一:简介)_第7张图片

1.3.3 liveMedia

这个库为各种流媒体类型和编解码器定义了一个类层次结构(根类“Medium”类)。
Medium继承关系:
live555 源码分析(一:简介)_第8张图片
我也没看懂,不过可以按这个思想分析。

Medium协作图:
live555 源码分析(一:简介)_第9张图片

1.3.4 BasicUsageEnvironment

该库定义了“ UsageEnvironment”类的一个具体实现(子类),用于简单的控制台应用程序。读取事件和延迟的操作使用select()循环进行处理。
BasicUsageEnvironment继承关系:
live555 源码分析(一:简介)_第10张图片
BasicUsageEnvironment协作图:
live555 源码分析(一:简介)_第11张图片

1.3.5 testProgs

这个目录实现了一些简单的程序,这些程序使用“BasicUsageEnvironment”来演示如何使用这些库开发应用程序。

1.3.5.1 RTSP client

  • testRTSPClient是一个命令行程序,向您展示如何打开和接收由RTSP URL(即以rtsp://开头的URL)指定的媒体流。在这个演示程序中,对接收到的音视频数据没有做处理。但是,您可以在自己的应用程序中使用和修改此代码,以(例如)解码和播放接收到的数据。

  • openRTSP类似于“testRTSPClient”,但是有更多的特性。它是一个命令行程序,与“testRTSPClient”不同,它的目的是作为一个完整的、功能齐全的应用程序(而不是在其他应用程序中使用它的代码)使用。有关“openRTSP”的更多信息(包括它的许多命令行选项)有机会看看。

1.3.5.2 RTSP server

testOnDemandRTSPServer创建一个RTSP服务器,该服务器可以通过RTP单播从各种类型的媒体文件中按需流式传输。(支持的媒体类型包括:MPEG-1或2音频或视频(基本流),包括MP3音频; MPEG-4视频(基本流); H.264视频(基本流); H.265视频(基本流);MPEG节目或传输流,包括VOB文件; DV视频; AMR音频; WAV(PCM)音频。)服务器还可以从Matroska或WebM文件中流式传输(通过解复用和流式传输文件中的轨道)。MPEG传输流也可以在原始UDP上进行流式传输(如果有要求),例如,通过机顶盒。
该服务器应用程序还演示了如何通过RTSP传递以UDP(原始UDP或RTP / UDP)多播或单播流形式到达服务器的MPEG传输流。 特别是,默认情况下,它被设置为接受来自“ testMPEG2TransportStreamer”演示应用程序的输入。

1.3.5.3 SIP client

playSIP是一个命令行程序(类似于“openRTSP”),它调用SIP会话(使用SIP: URL),然后(可选地)将传入的媒体流记录到文件中。

1.3.5.4 MP3 audio test programs

  • testMP3Streamer重复读取MP3音频文件(名为“test.mp3”),并使用RTP将其流到多播组239.255.42.42,端口6666(使用RTCP的端口6667)。这个程序还有一个(可选的)内置的RTSP服务器。

  • testMP3Receiver执行相反的操作:它读取一个MP3/RTP流(来自相同的多播组/端口),并将重新构造的MP3流输出到“stdout”。它还发送RTCP接收报告。
    MP3/RTP流可以使用这些工具之一播放工具链接。

1.3.5.5 MPEG video test programs

  • testMPEG1or2VideoStreamer重复读取MPEG-1或2视频文件(名为“test.mpg”),并使用RTP将其流到多播组239.255.42.42,端口8888(使用RTCP的端口8889)。这个程序还有一个(可选的)内置的RTSP服务器。
    默认情况下,假定输入文件是MPEG Video 基本流。 但是,如果它是MPEG程序流,则还可以插入一个多路分解滤波器以提取视频基本流。 (有关详细信息,请参见“ testMPEG1or2VideoStreamer.cpp”。)不是很懂
    Apple的“ QuickTime Player”可用于接收和观看此流视频(前提是它是MPEG-1,而不是MPEG-2)。 要使用此功能,请QuickTime Player打开文件“ testMPEG1or2Video.sdp”。 (如果已启用“ testMPEG1or2VideoStreamer的” RTSP服务器,则QuickTime Player也可以使用“ rtsp://” URL播放流。)
    开源的“VLC”和“MPlayer”媒体播放器也可以使用。
    RealNetworks的“RealPlayer”也可用于播放流。(建议使用最新版本。)

  • testMPEG1or2VideoReceiver执行相反的操作:它读取一个MPEG视频/RTP流(来自相同的多播组/端口),并将重新构造的MPEG视频(基本)流输出到“stdout”。它还发送RTCP接收报告。

  • testMPEG4VideoStreamer重复读取MPEG-4基本流视频文件(名为“test.m4e”),并使用RTP多播对其进行流处理。这个程序还有一个内置的RTSP服务器。
    Apple的“ QuickTime Player”可用于接收和播放此音频流。 要使用此功能,请让播放器打开会话的“ rtsp://” URL(程序在开始流式传输时会打印出该URL)。
    开源的“VLC”和“MPlayer”媒体播放器也可以使用。

  • testH264VideoStreamer重复读取H.264基本流视频文件(名为“test.264”),并使用RTP多播对其进行流处理。这个程序还有一个内置的RTSP服务器。
    Apple的“ QuickTime Player”可用于接收和播放此音频流。 要使用此功能,请让播放器打开会话的“ rtsp://” URL(程序在开始流式传输时会打印出该URL)。
    开源的“VLC”和“MPlayer”媒体播放器也可以使用。

  • testH265VideoStreamer反复从H.265基本流视频文件(名为“ test.265”)中读取,并使用RTP多播对其进行流传输。 该程序还具有内置的RTSP服务器。

1.3.5.6 MPEG audio+video (Program Stream) test programs

  • testMPEG1or2AudioVideoStreamer读取一个MPEG-1或2程序流文件(名为“test.mpg”),从中提取一个音频和一个视频基元流,然后使用RTP将这些基元流传输到多播组239.255.42.42,端口6666/6667(用于音频流)和8888/8889(用于视频流)。这个程序还有一个(可选的)内置的RTSP服务器。

  • testMPEG1or2Splitter读取一个MPEG-1或2程序流文件(名为“in.mpg”),并从中提取音频和视频基本流。这两个基本流被写入名为“out_audio”和“out_video的文件中.

1.3.5.7 MPEG audio+video (Transport Stream) test programs

  • testMPEG2TransportStreamer读取一个MPEG传输流文件(名为“test.ts”),然后使用RTP将其流到多播组239.255.42.42,端口1234(使用RTCP的端口1235)。这个程序还有一个(可选的)内置的RTSP服务器。

  • testMPEG2TransportReceiver执行相反的操作:它读取一个MPEG传输/RTP流(来自相同的多播组/端口),并将重新构造的MPEG传输流流输出到“stdout”。它还发送RTCP接收报告。

  • testMPEG1or2ProgramToTransportStream读取一个MPEG-1或2程序流文件(名为“in.mpg”),并将其转换为一个等效的MPEG传输流文件,名为“out.ts”。

  • testH264VideoToTransportStream读取一个H.264视频基本流文件(名为“in.264”),并将其转换为一个等效的MPEG传输流文件(名为“out.ts”)。

  • testH265VideoToTransportStream读取一个H.265视频基本流文件(名为“in.265”),并将其转换为一个等效的MPEG传输流文件(名为“out.ts”)。

  • testMPEG2TransportStreamSplitter将传输流文件解复用为一组输出文件,每个输出文件对应一个组件跟踪。(请注意,此应用程序是从’stdin’读取的。)

1.3.5.8 PCM audio test program

testWAVAudioStreamer读取一个WAV格式的音频文件(名为“test.wav”),并使用一个内置的RTSP服务器通过IP多播来传输所包含的PCM音频流.
该程序支持8或16位PCM流,单声道或立体声,在任何采样频率。
Apple的“ QuickTime Player”可用于接收和播放此音频流。 要使用此功能,请让播放器打开会话的“ rtsp://” URL(程序在开始流式传输时会打印出该URL)。
可以选择在流传输之前将16位PCM流转换为8位u-law格式。 (有关如何执行此操作的说明,请参阅“ testWAVAudioStreamer.cpp”。)
也可以使用开源的“ VLC”和“ MPlayer”媒体播放器。

1.3.5.9 AMR audio test program

testAMRAudioStreamer从amr格式的音频文件(名为“test.amr”)(如RFC 3267, section 5中定义的那样)中读取数据,并使用内置的RTSP服务器通过IP多播传输封闭的音频流。

1.3.5.10 DV video test program

testDVVideoStreamer从一个DV视频文件(名为“test.dv”)中读取数据,然后使用一个内置的RTSP服务器通过IP多播将数据流传输出去。
目前,我们知道没有广泛可用的媒体播放器客户端可以播放这个流。

1.3.5.11 Matroska (or ‘Webm’) test programs

  • testMKVStreamer从“Matroska”(或“Webm”)文件(名为“test.mkv”)中读取数据,并使用内置的RTSP服务器通过IP多播传输数据流。

  • testMKVSplitter从“Matroska”(或“Webm”)文件中读取数据,并将其解复用为单独的输出文件—每个音轨对应一个输出文件。

1.3.5.12 VOB (DVD) streaming test program

vobStreamer读取一个或多个“ .vob”文件(例如,从DVD中读取),提取音频和视频流,然后使用RTP多播传输它们。

1.3.5.13 Support for server ‘trick play’ operations on MPEG Transport Stream files

The applications MPEG2TransportStreamIndexer and testMPEG2TransportStreamTrickPlay。

1.3.5.14 HLS (“HTTP Live Streaming”) test programs

testH264VideoToHLSSegments将名为“ in.264”的H.264(基本流)视频文件转换为一系列HLS(“ HTTP Live Streaming”)段,以及可通过Web浏览器访问的“ .m3u8”文件。

1.3.5.15 其他程序

  • testRelay反复从UDP多播套接字读取,然后将每个数据包的有效负载重新传输(“中继”)到新的(多播或单播)地址和端口。

  • testReplicator与testRelay类似,除了它复制输入流—使用“FrameReplicator”类—并在将另一个副本流写入文件时,将一个副本流重新传输到另一个地址和端口(多播或单播)。

  • sapWatch读取并打印在默认SDP / SAP目录(224.2.127.254/9875)上发布的SDP / SAP公告

  • registerRTSPStream将自定义RTSP“ REGISTER”命令发送到给定的RTSP客户端(或代理服务器),要求其从给定的“ rtsp://” URL流式传输。

  • mikeyParse解析Base64字符串(对二进制MIKEY(多媒体密钥管理)消息进行编码),并输出人类可读的MIKEY消息描述。 (例如,可以在RFC 4567定义的SDP“ a = key-mgmt:”属性中使用Base64字符串。)

1.3.6 WindowsAudioInputDevice

这是“liveMedia”库的“AudioInputDevice”抽象类的一个实现。Windows应用程序可以使用它从输入设备读取PCM音频样本。
(该项目建立了两个库:“ libWindowsAudioInputDevice_mixer.lib”(使用Windows的内置混音器)和“ libWindowsAudioInputDevice_noMixer.lib”(不使用)。

1.4 编译

1.4.1 linux下编译

下载源码,源码下载在1.2节讲过了,然后把源码拷贝到linux目标下,进行解压,

root@debian:~/live555# tar -zxf live.2020.01.28.tar.gz 
root@debian:~/live555# cd live/

运行:

./genMakefiles linux

因为我这个是32位linux,所以os-platform填linux,运行了这句话,执行是啥呢?我们可以来看看,genMakefiles是一个脚本,这个脚本内容:

#!/bin/sh

usage() {
    echo "Usage: $0 "
    exit 1
}

if [ $# -ne 1 ]
then
    usage $*
fi

platform=$1   #linux这个变量会传入到这个参数中
subdirs="liveMedia groupsock UsageEnvironment BasicUsageEnvironment testProgs mediaServer proxyServer"
    
for subdir in $subdirs    #遍历各个子目录,在各个子目录中生成makefile
do
    /bin/rm -f $subdir/Makefile   #删除以前的makefile
    cat $subdir/Makefile.head config.$platform $subdir/Makefile.tail > $subdir/Makefile    #利用 Makefile.head config.linux  Makefile.tail合并成一个新的makefile
    chmod a-w $subdir/Makefile   # 修改权限
done

/bin/rm -f Makefile   # 在根目录下,生成根makefile
cat Makefile.head config.$1 Makefile.tail > Makefile
chmod a-w Makefile

执行完成之后,查看makefile:
live555 源码分析(一:简介)_第12张图片
每个文件下都已经存在。

编译:

root@debian:~/live555/live# make

不幸的是没有一次编译成功,那就看看错误了,一个个解决错误。

  1. openssl/ssl.h 没有找到
    live555 源码分析(一:简介)_第13张图片
    解决办法就是缺失文件,百度一下就知道了,执行一下命令安装
apt-get install libssl-dev

然后再次make,这次就可以成功了。

1.4.2 windows下编译

wndows下编译就先不写了,以后用到了再补充。

1.5 Media Server

1.5.1 简介

“ LIVE555媒体服务器”是完整的RTSP服务器应用程序。 它可以流式传输几种媒体文件(必须存储在当前工作目录中,即从中启动应用程序的目录或子目录中):

  • MPEG传输流文件(文件名后缀为“.ts”)
  • Matroska或WebM文件(文件名后缀为“ .mkv”或“ .webm”)
  • Ogg文件(文件名后缀为“ .ogg”,“ ogv”或“ .opus”)
  • MPEG-1或2程序流文件(文件名后缀“ .mpg”)
  • MPEG-4视频基本流文件(文件名后缀为“.m4e”)
  • 一个H.264视频基本流文件(文件名后缀为“.264”)
  • 一个H.265视频基本流文件(文件名后缀为“.265”)
  • VOB视频+音频文件(文件名后缀为“.vob”)
  • 一个DV视频文件(文件名后缀为“.dv”)
  • MPEG-1或2(包括第III层,即“ MP3”)音频文件(文件名后缀“ .mp3”)
  • WAV(PCM)音频文件(文件名后缀“ .wav”)
  • AMR音频文件(文件名后缀“ .amr”)
  • AC-3音频文件(文件名后缀“ .ac3”)
  • AAC(ADTS格式)音频文件(文件名后缀“ .aac”)

这些视频流可由符合标准的RTSP/RTP媒体客户端接收/播放,包括:

  • VLC media player
  • QuickTime Player
  • Amino set-top boxes
  • 命令行RTSP客户机

1.5.2 运行

要进入mediaServer目录下,执行运行live555MediaServer,命令:

./live555MediaServer

运行之后,会显示一下信息:
live555 源码分析(一:简介)_第14张图片
意思就是让我们去查看Additional notes,大体意思我翻译一下:
要从Mac,iPhone或iPad查看此类流,请使用“ Safari”浏览器应用程序,并使用“ http://” URL,而不是“ rtsp://” URL。 具体来说,您输入表单的网址

http://<server-name-or-ip-address>:<http-port-number>/<filename>

其中是端口名称-“ HTTP Live Streaming”的端口号-“ live555MediaServer”应用程序启动后显示在其控制台输出的末尾。 (如果端口号是80(HTTP的默认端口号),则可以从URL中省略“:80”。)

我们这里的端口号是8000.

Additional notes:(重点来了)
这里提供了一个传输流文件及其索引文件的示例。here.您可以下载文件“ bipbop-gear1-all.ts”和“ bipbop-gear1-all.tsx”,将它们放置在与“ live555MediaServer”应用程序相同的目录中,然后在Mac上从“ Safari”播放它们 ,iPhone或iPad-使用网址.

http://<server-name-or-ip-address>:<http-port-number>/bipbop-gear1-all.ts

如果你想使用RTSP/RTP播放这些流,使用VLC,而不是“QuickTime播放器”。

live555 源码分析(一:简介)_第15张图片
这个就是资源文件,我之前偷懒下了tsx的,结果怎么都播不了。后来就下载了一个rango.ts的这次就可以播放了。
但是试了用http开头播放不了,不知道是不是我是用电脑播放的,但是用rtsp就可以播放,有明白的可以告诉我为什么?
live555 源码分析(一:简介)_第16张图片
播放效果
live555 源码分析(一:简介)_第17张图片

1.6 Proxy Server

1.6.1 简介

“ LIVE555代理服务器”是由“ LIVE555流媒体”软件构建的单播RTSP服务器,它充当一个或多个“后端”单播或多播RTSP / RTP流的“代理”(即,其他服务器)。

代理服务器的主要功能是,无论从代理服务器流式传输多少个单独的客户端,它仅读取一次每个“后端”流。 例如,这使代理服务器非常适合从支持RTSP的摄像机(一次可能无法处理多个连接)进行流式传输。
live555 源码分析(一:简介)_第18张图片

1.6.2 运行

“LIVE555代理服务器”是一个命令行(即,“控制台”)应用程序。运行它的最简单的方法是键入:

live555ProxyServer <url>

其中为RTSP url(即,以“rtsp://”开头,表示“后端”流(例如,来自摄像机的流)。启动后,服务器将为代理流显示其自己的“ rtsp://” URL。 然后,RTSP客户端可以使用此URL播放(即接收)代理流。服务器可以充当许多“后端”流的代理,而不仅仅是一个。 如果您在命令行上输入多个“ rtsp://” URL,即

live555ProxyServer <url1> <url2> ... <urlN>

然后,在启动之后,服务器将显示“rtsp://”url,用于代理每个url。(当然,只有当您有足够的网络带宽来接收所有流时,才应该代理多个流。)

要显示额外的输出,显示服务器的基本操作,在“rtsp://”url之前添加“-v”选项。要显示更多的输出—包括代理服务器和每个“后端”服务器之间的RTSP协议交换—使用“- v”(即,用大写字母“V”)代替。(如果您的代理服务器有问题,那么我们建议您使用“-V”选项来找出问题所在。)

1.6.3 基于TCP的后端流

默认情况下,代理服务器会要求通过UDP接收每个“后端”流(即,将RTP和RTCP数据包作为UDP数据报接收)。但是,有时,“后端”服务器可能位于阻止UDP数据包的防火墙后面。为了克服这个问题,您可以使用“ -t”选项来请求每个“后端” RTSP服务器通过其TCP连接流式传输RTP和RTCP数据包,而不是使用UDP包。(注意,不是所有的RTSP服务器都支持TCP流,而且TCP不能用来接收多播流。)仅当无法接收UDP数据包时才应使用此选项,因为通过TCP进行流传输可能会导致传入数据被过度延迟。

另外,您可以使用“ -T ”选项来请求使用指定的HTTP端口通过“ RTSP-over-HTTP隧道”通过TCP发送每个“后端”流(使用TCP) 。如果您使用的是http专用的防火墙,那么可以使用RTSP-over-HTTP隧道。(但请注意,并非所有的“后端”RTSP服务器都支持这一功能。)

注意:“-t”和“-t ”选项仅适用于“后端”流。它们不会影响从代理服务器到(可能有多个)RTSP客户端的“前端”流。这些流可以是UDP或TCP,这取决于每个客户端请求的内容。

1.6.4 代理访问控制的流

一些“后端”RTSP服务器需要用户身份验证(通过用户名和密码)才能访问它们的流。如果您将“-u ”选项添加到代理服务器,那么它将使用这个 对(如果需要)来访问每个“后端”流。(若要指定空密码,请为使用"")。

或者,您可以尝试在“ rtsp://” URL中包含用户名和密码,例如:“ rtsp:// <用户名>:<密码> @ <主机名>:<等。”。 (但是,不建议这样做,因为在这种情况下,密码将通过Internet以明文形式发送。而且,并非所有“后端”服务器都将接受这种类型的URL。)

请注意,也可以提供对代理服务器本身的访问控制,即从“前端” RTSP客户端提供访问控制。 (但是,这不是从命令行完成的;而是通过修改代理服务器的源代码来完成的。请注意,随附的代码

#ifdef ACCESS_CONTROL
#endif
in "live555ProxyServer.cpp".

1.6.5 指定RTSP服务器端口

默认情况下,此服务器应用程序尝试使用标准RTSP服务器端口号之一(554和8554)。 或者,您可以使用“ -p ”选项来指定服务器尝试将指定的端口号用于RTSP。 (如果无法使用此端口,则将照常尝试使用标准端口号之一。)

1.6.6 代理一个或多个“广告”后端流

该服务器应用程序还可以为使用“ REGISTER” RTSP命令发布的后端流设置代理。(此广告-指定后端流的“ rtsp://” URL-可以由后端服务器本身或某些第三方应用程序发送。)要为服务器应用程序提供此功能, 使用“ -R”命令行选项启动它。 (如果使用此选项,则可以省略在命令行上输入任何“ rtsp://” URL。)

然后,可以使用将在控制台上宣布的“ rtsp://” URL从代理服务器访问代理流。
这个不是很理解,到时候理解了再补充。

1.7 软件支持

这是遇到的问题的解决方法,有一些别人已经解决的了,所以我们遇到问题先看看这里有没有我们想要的答应,如果没有,到时可以通过发邮件。

这一篇文章只要是对live555官网的一个基本翻译,如果看开源代码,一下子看代码接收还是有点慢,还是先看文档,看看别人是怎么的代码是怎么组织起来,需要对整体有一个全面的认识,然后再深入,这也是我看源码的方式,希望对live555有研究的可以跟我多交流交流,毕竟我也是新手,准备接收源码的摧残。

你可能感兴趣的:(LIVE555)