閱讀542 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何利用live555開源庫從攝像機抓取視頻數據並保存文件?

**live555簡介 **
live555是一個為流媒體提供解決方案的跨平台的C++開源項目,它實現了對標準流媒體傳輸協議(如RTP/RTCP、RTSP、SIP等)的支持。同時,live555實現了對多種音視頻編碼格式(包括MPEG、H.263+、DV、JPEG等)的流化、接收和處理等的支持。目前,live555已經被用於多款播放器的流媒體播放功能的實現,如VLC、MPlayer、MediaPortal、ivrworx等。

live555庫文件的編譯生成
live555開源項目網址是:https://www.live555.com/liveMedia/,點擊如下圖紅色區域內的文字即可進入代碼下載頁麵:
_1

點擊“here”之後,出現了如下頁麵,點擊“live555-latest.tar.gz”下載最新代碼:
_2

將下載之後的代碼拷貝到虛擬機上,並按照如下圖所示的方法對文件進行編譯:
_3

具體使用的命令如下:

第一步:./genMakefiles linux-64bit (linux的位數要根據自己實際所使用的係統位數來確定)

第二步:make (這一步生成各個靜態庫和測試代碼的可執行文件)

第三步:make install (此時將靜態庫文件安裝到了/usr/local/lib目錄下,將可執行文件安裝到了/usr/local/bin目錄下)

生成靜態庫文件和可執行文件之後,大家便可以進入/usr/local/bin目錄運行各個可執行文件。

**live555庫文件簡介 **
live555包含四個基本的庫,分別是:libBasicUsageEnvironment.a,libgroupsock.a,libliveMedia.a和libUsageEnvironment.a。其中,libBasicUsageEnvironment.a庫包含的是用於整個係統的基礎功能類;libUsageEnvironment.a庫用於事件的調度,實現異步讀取事件的句柄的設置以及錯誤信息的輸出;libgroupsock.a庫是對網絡接口的封裝,用於收發數據包,它主要是麵向多播數據的收發,同時也支持單播數據的收發;libliveMedia.a庫中有一係列類,這些類針對不同的流媒體類型和編碼。

有關live555的更多詳細介紹請參考:https://blog.csdn.net/leixiaohua1020/article/details/12235615。

**live555視頻文件生成流程介紹 **
視頻文件中保存的是RTSP的視頻流,一個簡單的RTSP消息交互過程如下(C 表示RTSP客戶端,S 表示RTSP服務端):

1.C->S:OPTION request //詢問S 有哪些方法可用
1.S->C:OPTION response //S 回應信息中包括提供的所有可用方法
2.C->S:DESCRIBE request //要求得到S 提供的媒體初始化描述信息
2.S->C:DESCRIBE response //S 回應媒體初始化描述信息,主要是sdp
3.C->S:SETUP request //設置會話的屬性,以及傳輸模式,提醒S 建立會

3.S->C:SETUP response //S 建立會話,返回會話標識符,以及會話相關信息
4.C->S:PLAY request //C 請求播放
4.S->C:PLAY response //S 回應該請求的信息
S->C:發送流媒體數據
5.C->S:TEARDOWN request //C 請求關閉會話
5.S->C:TEARDOWN response //S 回應該請求

筆者編寫的上位機程序要利用RTSP協議從海康威視攝像機中獲取視頻流並保存到本地文件(mp4格式)中,其消息總體流程如下圖所示:
_4

注意,在建立了TCP連接之後,我們要讓RTSP報文通過HTTP端口(80)傳輸,因為RTSP的標準端口是554,但是由於各種不同的防火牆等安全策略配置的原因,客戶端在訪問554端口時可能存在限製,從而無法正常傳輸RTSP報文,但是HTTP端口(80端口)是普遍開放的,於是就有了讓RTSP報文通過80端口透傳的想法,即RTSP-Over-HTTP。

live555視頻文件生成程序所產生的日誌樣式如下所示:

Created new TCP socket 3 for connection
Connecting to 192.168.4.60, port 80 on socket 3...
...remote connection opened
Requesting RTSP-over-HTTP tunneling (on port 80)

Sending request: GET /h264/ch01/main/av_stream HTTP/1.1
CSeq: 1
User-Agent: openRTSP (LIVE555 Streaming Media v2017.09.12)
Host: 192.168.4.60
x-sessioncookie: 26bd2785b22af60ca36f09d
Accept: application/x-rtsp-tunnelled
Pragma: no-cache
Cache-Control: no-cache


Received 63 new bytes of response data.
Received a complete GET response:
HTTP/1.0 200 OK
Content-Type: application/x-rtsp-tunnelled


Connecting to 192.168.4.60, port 80 on socket 4...
...remote connection opened
Sending request: POST /h264/ch01/main/av_stream HTTP/1.1
CSeq: 1
User-Agent: openRTSP (LIVE555 Streaming Media v2017.09.12)
Host: 192.168.4.60
x-sessioncookie: 26bd2785b22af60ca36f09d
Content-Type: application/x-rtsp-tunnelled
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 32767
Expires: Sun, 9 Jan 1972 00:00:00 GMT


Sending request: OPTIONS rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream RTSP/1.0
CSeq: 2
User-Agent: openRTSP (LIVE555 Streaming Media v2017.09.12)


    The request was base-64 encoded to: T1BUSU9OUyBydHNwOi8vYWRtaW46YWRtaW4xMjNAMTkyLjE2OC40LjYwOjU1NC9oMjY0L2NoMDEvbWFpbi9hdl9zdHJlYW0gUlRTUC8xLjANCkNTZXE6IDINClVzZXItQWdlbnQ6IG9wZW5SVFNQIChMSVZFNTU1IFN0cmVhbWluZyBNZWRpYSB2MjAxNy4wOS4xMikNCg0K

Received 153 new bytes of response data.
Received a complete OPTIONS response:
RTSP/1.0 200 OK
CSeq: 2
Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER
Date:  Tue, Sep 26 2017 13:37:03 GMT


Sending request: DESCRIBE rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream RTSP/1.0
CSeq: 3
User-Agent: openRTSP (LIVE555 Streaming Media v2017.09.12)
Accept: application/sdp


    The request was base-64 encoded to: REVTQ1JJQkUgcnRzcDovL2FkbWluOmFkbWluMTIzQDE5Mi4xNjguNC42MDo1NTQvaDI2NC9jaDAxL21haW4vYXZfc3RyZWFtIFJUU1AvMS4wDQpDU2VxOiAzDQpVc2VyLUFnZW50OiBvcGVuUlRTUCAoTElWRTU1NSBTdHJlYW1pbmcgTWVkaWEgdjIwMTcuMDkuMTIpDQpBY2NlcHQ6IGFwcGxpY2F0aW9uL3NkcA0KDQo=

Received 733 new bytes of response data.
Received a complete DESCRIBE response:
RTSP/1.0 200 OK
CSeq: 3
Content-Type: application/sdp
Content-Base: rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream/
Content-Length: 573

v=0
o=- 1506433023437648 1506433023437648 IN IP4 192.168.4.60
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream/
m=video 0 RTP/AVP 96
b=AS:5000
a=control:rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream/trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z0KAMouVAEABg0IAAA4QAAK/IQg=,aN44gA==
a=Media_header:MEDIAINFO=494D4B48010100000400000100000000000000000000000000000000000000000000000000000000;
a=appversion:1.0

Opened URL "rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream", returning a SDP description:
v=0
o=- 1506433023437648 1506433023437648 IN IP4 192.168.4.60
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream/
m=video 0 RTP/AVP 96
b=AS:5000
a=control:rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream/trackID=1
a=rtpmap:96 H264/90000
a=fmtp:96 profile-level-id=420029; packetization-mode=1; sprop-parameter-sets=Z0KAMouVAEABg0IAAA4QAAK/IQg=,aN44gA==
a=Media_header:MEDIAINFO=494D4B48010100000400000100000000000000000000000000000000000000000000000000000000;
a=appversion:1.0

Created receiver for "video/H264" subsession (client ports 39434-39435)
Changed socket receive buffer size for the "video/H264" subsession from 212992 to 425984 bytes
Sending request: SETUP rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream/trackID=1 RTSP/1.0
CSeq: 4
User-Agent: openRTSP (LIVE555 Streaming Media v2017.09.12)
Transport: RTP/AVP/TCP;unicast;interleaved=0-1


    The request was base-64 encoded to: U0VUVVAgcnRzcDovL2FkbWluOmFkbWluMTIzQDE5Mi4xNjguNC42MDo1NTQvaDI2NC9jaDAxL21haW4vYXZfc3RyZWFtL3RyYWNrSUQ9MSBSVFNQLzEuMA0KQ1NlcTogNA0KVXNlci1BZ2VudDogb3BlblJUU1AgKExJVkU1NTUgU3RyZWFtaW5nIE1lZGlhIHYyMDE3LjA5LjEyKQ0KVHJhbnNwb3J0OiBSVFAvQVZQL1RDUDt1bmljYXN0O2ludGVybGVhdmVkPTAtMQ0KDQo=

Received 178 new bytes of response data.
Received a complete SETUP response:
RTSP/1.0 200 OK
CSeq: 4
Session:       2103693098;timeout=60
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=4fdd3575;mode="play"
Date:  Tue, Sep 26 2017 13:37:03 GMT


Setup "video/H264" subsession (client ports 39434-39435)
Outputting to the file: "/usr/local/DaTang/Video/Video20170926133712.mp4"
Sending request: PLAY rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream/ RTSP/1.0
CSeq: 5
User-Agent: openRTSP (LIVE555 Streaming Media v2017.09.12)
Session: 2103693098
Range: npt=0.000-


    The request was base-64 encoded to: UExBWSBydHNwOi8vYWRtaW46YWRtaW4xMjNAMTkyLjE2OC40LjYwOjU1NC9oMjY0L2NoMDEvbWFpbi9hdl9zdHJlYW0vIFJUU1AvMS4wDQpDU2VxOiA1DQpVc2VyLUFnZW50OiBvcGVuUlRTUCAoTElWRTU1NSBTdHJlYW1pbmcgTWVkaWEgdjIwMTcuMDkuMTIpDQpTZXNzaW9uOiAyMTAzNjkzMDk4DQpSYW5nZTogbnB0PTAuMDAwLQ0KDQo=

Received a complete PLAY response:
RTSP/1.0 200 OK
CSeq: 5
Session:       2103693098
RTP-Info: url=rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream/trackID=1;seq=43500;rtptime=280383108
Date:  Tue, Sep 26 2017 13:37:03 GMT


Started playing session
Receiving streamed data (signal with "kill -HUP 3652" or "kill -USR1 3652" to terminate)...

**命令樣式 **
如果利用live555提供的測試程序來生成視頻文件,那麼就要大家就可以參考live目錄下的testProgs目錄下的openRTSP.cpp和playCommon.cpp文件,它們生成的可執行文件名為openRTSP,可用此命令來在當前目錄下生成mp4文件:./openRTSP -T 80 -b 200000 -B 2250000 -f 25 -w 720 -h 480 -r -4 -P 300 -v “rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream”,其中,-T 80表示通過HTTP的80端口來傳輸RTSP報文,-b 200000表示將file-sink-buffer-size設置為200000,-B 2250000表示輸入socket的大小(input-socket-buffer-size)設置為2250000,-f 25表示視頻流每秒的幀數為25,-w 720 -h 480表示視頻的寬度為720、高度為480,-r為接收並保存視頻流,-4表示生成mp4格式的視頻文件,-P 300表示每個視頻文件的長度為300秒,-v表示隻生成視頻文件,“rtsp://admin:admin123@192.168.4.60:554/h264/ch01/main/av_stream”是獲取攝像機RTSP視頻流的URL。

在64位Ubuntu係統中,通過對openRTSP.cpp和playCommon.cpp文件進行修改,可利用C代碼調用C++函數,可配置文件生成目錄及生成文件名,並在文件生成好之後搬移到特定的目錄中。

總結
live555是一個用C++程序編寫的開源項目,支持TCP、HTTP、RTSP等協議,非常適合用於對視頻數據的采集和播放,已經被成功應用到很多的視頻播放器中。

在將live555應用到上位機程序之前,我們需要了解RTSP消息的交互流程、RTSP 消息格式等。通過筆者前期的測試驗證,已實現通過live555從海康威視攝像機中采集視頻流並保存到mp4文件中,同時可設置每個文件的錄製時長、幀數、存放目錄等。

最後更新:2017-09-26 19:33:22

  上一篇:go  【播放器--場景】使用播放器實現重播視頻
  下一篇:go  2017杭州雲棲大會 智能客服專場預熱 — 用心服務客戶,用雲助力客服