基于标准的RTP / RTCP / RTSP / SIP多媒体流的源代码库,适用于嵌入式和/或低成本流应用。也可以看看其他的:
帮助支持对“ 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”。(有关如何使用这些库的一些特定示例,请参见下面的测试程序。)
项目的源代码:http://live555.com/liveMedia/public/
其中live.2020.02.11.tar.gz是最近一个正式版本的源码,我这人比较喜欢稳定,就用正式版的吧。 live555-latest.tar.gz 为最新版源码,想玩最新的也可以下载玩玩,除了源码之外,live555 还提供了许多用于开发测试的音视频文件,如 264 目录下的是原始 H.264 码流测试文件, 265 目录下的是原始 H.265 码流测试文件等。
该代码包含以下库,每个库都有自己的子目录:
“UsageEnvironment”和“TaskScheduler”类用于调度延迟事件,为异步读取事件分配处理程序,以及输出错误/警告消息。另外,“HashTable”类定义了一个通用哈希表的接口,其余代码将使用这个接口。
UsageEnvironment继承关系:
UsageEnvironment协作图:
TaskScheduler继承关系:
hashTable继承关系:
这个库中的类封装了网络接口和套接字。尤其,“Groupsock”类封装了一个用于发送(和/或接收)多播数据报的套接字。
这个库为各种流媒体类型和编解码器定义了一个类层次结构(根类“Medium”类)。
Medium继承关系:
我也没看懂,不过可以按这个思想分析。
该库定义了“ UsageEnvironment”类的一个具体实现(子类),用于简单的控制台应用程序。读取事件和延迟的操作使用select()循环进行处理。
BasicUsageEnvironment继承关系:
BasicUsageEnvironment协作图:
这个目录实现了一些简单的程序,这些程序使用“BasicUsageEnvironment”来演示如何使用这些库开发应用程序。
testRTSPClient是一个命令行程序,向您展示如何打开和接收由RTSP URL(即以rtsp://开头的URL)指定的媒体流。在这个演示程序中,对接收到的音视频数据没有做处理。但是,您可以在自己的应用程序中使用和修改此代码,以(例如)解码和播放接收到的数据。
openRTSP类似于“testRTSPClient”,但是有更多的特性。它是一个命令行程序,与“testRTSPClient”不同,它的目的是作为一个完整的、功能齐全的应用程序(而不是在其他应用程序中使用它的代码)使用。有关“openRTSP”的更多信息(包括它的许多命令行选项)有机会看看。
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”演示应用程序的输入。
playSIP是一个命令行程序(类似于“openRTSP”),它调用SIP会话(使用SIP: URL),然后(可选地)将传入的媒体流记录到文件中。
testMP3Streamer重复读取MP3音频文件(名为“test.mp3”),并使用RTP将其流到多播组239.255.42.42,端口6666(使用RTCP的端口6667)。这个程序还有一个(可选的)内置的RTSP服务器。
testMP3Receiver执行相反的操作:它读取一个MP3/RTP流(来自相同的多播组/端口),并将重新构造的MP3流输出到“stdout”。它还发送RTCP接收报告。
MP3/RTP流可以使用这些工具之一播放工具链接。
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服务器。
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的文件中.
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’读取的。)
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”媒体播放器。
testAMRAudioStreamer从amr格式的音频文件(名为“test.amr”)(如RFC 3267, section 5中定义的那样)中读取数据,并使用内置的RTSP服务器通过IP多播传输封闭的音频流。
testDVVideoStreamer从一个DV视频文件(名为“test.dv”)中读取数据,然后使用一个内置的RTSP服务器通过IP多播将数据流传输出去。
目前,我们知道没有广泛可用的媒体播放器客户端可以播放这个流。
testMKVStreamer从“Matroska”(或“Webm”)文件(名为“test.mkv”)中读取数据,并使用内置的RTSP服务器通过IP多播传输数据流。
testMKVSplitter从“Matroska”(或“Webm”)文件中读取数据,并将其解复用为单独的输出文件—每个音轨对应一个输出文件。
vobStreamer读取一个或多个“ .vob”文件(例如,从DVD中读取),提取音频和视频流,然后使用RTP多播传输它们。
The applications MPEG2TransportStreamIndexer and testMPEG2TransportStreamTrickPlay。
testH264VideoToHLSSegments将名为“ in.264”的H.264(基本流)视频文件转换为一系列HLS(“ HTTP Live Streaming”)段,以及可通过Web浏览器访问的“ .m3u8”文件。
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字符串。)
这是“liveMedia”库的“AudioInputDevice”抽象类的一个实现。Windows应用程序可以使用它从输入设备读取PCM音频样本。
(该项目建立了两个库:“ libWindowsAudioInputDevice_mixer.lib”(使用Windows的内置混音器)和“ libWindowsAudioInputDevice_noMixer.lib”(不使用)。
下载源码,源码下载在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:
每个文件下都已经存在。
编译:
root@debian:~/live555/live# make
不幸的是没有一次编译成功,那就看看错误了,一个个解决错误。
apt-get install libssl-dev
然后再次make,这次就可以成功了。
wndows下编译就先不写了,以后用到了再补充。
“ LIVE555媒体服务器”是完整的RTSP服务器应用程序。 它可以流式传输几种媒体文件(必须存储在当前工作目录中,即从中启动应用程序的目录或子目录中):
这些视频流可由符合标准的RTSP/RTP媒体客户端接收/播放,包括:
要进入mediaServer目录下,执行运行live555MediaServer,命令:
./live555MediaServer
运行之后,会显示一下信息:
意思就是让我们去查看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播放器”。
这个就是资源文件,我之前偷懒下了tsx的,结果怎么都播不了。后来就下载了一个rango.ts的这次就可以播放了。
但是试了用http开头播放不了,不知道是不是我是用电脑播放的,但是用rtsp就可以播放,有明白的可以告诉我为什么?
播放效果
“ LIVE555代理服务器”是由“ LIVE555流媒体”软件构建的单播RTSP服务器,它充当一个或多个“后端”单播或多播RTSP / RTP流的“代理”(即,其他服务器)。
代理服务器的主要功能是,无论从代理服务器流式传输多少个单独的客户端,它仅读取一次每个“后端”流。 例如,这使代理服务器非常适合从支持RTSP的摄像机(一次可能无法处理多个连接)进行流式传输。
“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”选项来找出问题所在。)
默认情况下,代理服务器会要求通过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,这取决于每个客户端请求的内容。
一些“后端”RTSP服务器需要用户身份验证(通过用户名和密码)才能访问它们的流。如果您将“-u ”选项添加到代理服务器,那么它将使用这个 对(如果需要)来访问每个“后端”流。(若要指定空密码,请为使用"")。
或者,您可以尝试在“ rtsp://” URL中包含用户名和密码,例如:“ rtsp:// <用户名>:<密码> @ <主机名>:<等。”。 (但是,不建议这样做,因为在这种情况下,密码将通过Internet以明文形式发送。而且,并非所有“后端”服务器都将接受这种类型的URL。)
请注意,也可以提供对代理服务器本身的访问控制,即从“前端” RTSP客户端提供访问控制。 (但是,这不是从命令行完成的;而是通过修改代理服务器的源代码来完成的。请注意,随附的代码
#ifdef ACCESS_CONTROL
#endif
in "live555ProxyServer.cpp".
默认情况下,此服务器应用程序尝试使用标准RTSP服务器端口号之一(554和8554)。 或者,您可以使用“ -p ”选项来指定服务器尝试将指定的端口号用于RTSP。 (如果无法使用此端口,则将照常尝试使用标准端口号之一。)
该服务器应用程序还可以为使用“ REGISTER” RTSP命令发布的后端流设置代理。(此广告-指定后端流的“ rtsp://” URL-可以由后端服务器本身或某些第三方应用程序发送。)要为服务器应用程序提供此功能, 使用“ -R”命令行选项启动它。 (如果使用此选项,则可以省略在命令行上输入任何“ rtsp://” URL。)
然后,可以使用将在控制台上宣布的“ rtsp://” URL从代理服务器访问代理流。
这个不是很理解,到时候理解了再补充。
这是遇到的问题的解决方法,有一些别人已经解决的了,所以我们遇到问题先看看这里有没有我们想要的答应,如果没有,到时可以通过发邮件。
这一篇文章只要是对live555官网的一个基本翻译,如果看开源代码,一下子看代码接收还是有点慢,还是先看文档,看看别人是怎么的代码是怎么组织起来,需要对整体有一个全面的认识,然后再深入,这也是我看源码的方式,希望对live555有研究的可以跟我多交流交流,毕竟我也是新手,准备接收源码的摧残。