live555 源碼分析(一:簡介)

1.1 LIVE555簡介

基於標準的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”。(有關如何使用這些庫的一些特定示例,請參見下面的測試程序。)

1.2 源碼下載

項目的源代碼:http://live555.com/liveMedia/public/
在這裏插入圖片描述
其中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繼承關係:
在這裏插入圖片描述
UsageEnvironment協作圖:
在這裏插入圖片描述
TaskScheduler繼承關係:
在這裏插入圖片描述
hashTable繼承關係:
在這裏插入圖片描述

1.3.2 groupsock

這個庫中的類封裝了網絡接口和套接字。尤其,“Groupsock”類封裝了一個用於發送(和/或接收)多播數據報的套接字。

groupsock繼承關係:
在這裏插入圖片描述
groupsock協作圖:
在這裏插入圖片描述

1.3.3 liveMedia

這個庫爲各種流媒體類型和編解碼器定義了一個類層次結構(根類“Medium”類)。
Medium繼承關係:
在這裏插入圖片描述
我也沒看懂,不過可以按這個思想分析。

Medium協作圖:
在這裏插入圖片描述

1.3.4 BasicUsageEnvironment

該庫定義了“ UsageEnvironment”類的一個具體實現(子類),用於簡單的控制檯應用程序。讀取事件和延遲的操作使用select()循環進行處理。
BasicUsageEnvironment繼承關係:
在這裏插入圖片描述
BasicUsageEnvironment協作圖:
在這裏插入圖片描述

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 <os-platform>"
    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

不幸的是沒有一次編譯成功,那就看看錯誤了,一個個解決錯誤。

  1. openssl/ssl.h 沒有找到
    在這裏插入圖片描述
    解決辦法就是缺失文件,百度一下就知道了,執行一下命令安裝
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媒體客戶端接收/播放,包括:

1.5.2 運行

要進入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就可以播放,有明白的可以告訴我爲什麼?
在這裏插入圖片描述
播放效果
播放效果

1.6 Proxy Server

1.6.1 簡介

“ LIVE555代理服務器”是由“ LIVE555流媒體”軟件構建的單播RTSP服務器,它充當一個或多個“後端”單播或多播RTSP / RTP流的“代理”(即,其他服務器)。

代理服務器的主要功能是,無論從代理服務器流式傳輸多少個單獨的客戶端,它僅讀取一次每個“後端”流。 例如,這使代理服務器非常適合從支持RTSP的攝像機(一次可能無法處理多個連接)進行流式傳輸。
在這裏插入圖片描述

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有研究的可以跟我多交流交流,畢竟我也是新手,準備接收源碼的摧殘。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章