在Novatek iVoT XVR平台上使用RTSP輸出video out影像

前言

在Novatek的iVoT平台中,有許多sample code的輸出設定為VideoOutput(通常為HDMI,VGA或CVBS等輸出格式),但是在IPC的EVB上預設並沒有這些輸出的接口,因此使用者無法在EVB上執行這些sample code,或者是必須將之改寫為使用寫入檔案的方式,才能看到執行的效果。

其實在Novatek iVoT SDK中的Image Quality Utility中,其實有使用到Live555 Streaming Library,但是在範例中卻沒有使用到,也缺乏相關說明,因此本文將介紹如何修改原生的範例程式原始碼中,使其支援RTSP串流,可以使用播放程式在PC上看到即時的影像。


RTSP簡介

即時串流協定(Real Time Streaming Protocol,RTSP)是一種網路應用協定,由Real Networks和Netscape共同提出,屬於TCP/IP中應用層的協議,該協議定義了一對多應用程式如何有效地通過 IP網路傳送多媒體數據。RTSP在體系結構上位於RTP和RTCP之上,可以選擇使用UDP或TCP來傳送數據,通常使用的通訊埠為554。

RTSP 和RTP、RTCP的關係

RTSP不像HTTP和FTP協定是完整的下載多媒體檔案到本機上進行播放,它是以固定的資料速率透過網路將影音資料發送至用戶端,用戶端也是按照這種速度觀看多媒體影音,當影音畫面播放過後,就不可以再重複播放,除非重新向伺服器端要求資料。

而RTP協定詳細說明了在網路上傳遞聲音和視訊的標準封包格式。它一開始被設計為一個multicast協定,但後來被用在很多unicast的應用中。RTP協定常用於串流多媒體系統(配合RTSP協定),視訊會議與對講機系統,使它成為IP電話產業的技術基礎,可使用TCP或UDP來進行傳輸。

RTCP為RTP控制協定(Real-time Transport Control Protocol或RTP Control Protocol),負責管理RTP傳輸的品質,會定期在傳送端與接收端傳送統計數據,如已傳送封包數、丟失封包數或者網路延遲等,播放程式可應用這些統計資料來進行傳輸品質的調整。

RTSP連接流程

RTSP的基本的傳輸流程,首先是由用戶端向伺服器送出RTSP的OPTIONS指令,然後伺服器端會回傳所支援的RTSP方法,接下來發送DESCRIBE請求來建立連線,跟著是使用SETUP來確認傳輸的協議,例如RTP over UDP,如此便可以開始傳輸RTP格式的影音內容,最後要結束時則使用TEARDOWN來終止連線,完整的流程可參考figure 1。

RTSP connection flow
figure 1

範例實作

我們使用在SDK中的範例,display_to_encode來改寫,原本範例的功能,是將前端輸入的四支類比攝影機,用四分割的模式顯示在螢幕上,然後對整個畫面進行編碼後儲存為檔案,使用者如果要看到錄製下來的影片,需要將檔案由設備中複製出來,再拷貝到電腦上才能觀看,整個範例的HDAL module使用流程可參考figure 2。

HDAL diagram
figure 2

在範例中,使用的RTSP server為Live555函式庫,使用LGPL v3授權,為了方便使用再另外包裝一層nvtrtspd以簡化傳遞的參數,若要將輸出的格式由檔案改為RTSP串流,需要做以下調整:

  1. 在專案中加入h與nvtrtspd.c(可由pq_video_rtsp資料夾中複製)

  2. 新增資料結構VIDEO_INFO,後續會提供給live555 library使用,內容包含串流所需要的視訊音訊格式,VPS,SPS與PPS等資訊
    VIDEO_INFO

  3. 等待video encoder開始後,設定所需要的HDAL callback函式
    HDAL CallBack

  4. 初始化並開啟nvtrtspd
    nvtrtspd init


  • 等待RTSP用戶端提出連線需求
  • 由於範例中只有影像的資料,因此聲音相關的函式都只是空殼並無作用,與影像相關的callback funciton說明如下:


    函式說明

    refresh_video_info


    此函式需在VideoEncode Module運作後才能執行,目的是取得目前的影像編碼格式與VPS、SPS與PPS等資訊並填入VIDEO_INFO的變數中,在RTSP伺服器端回應用戶端的DESCRIBE請求時,會放在SDP資料中傳回,讓用戶得知要影像的尺寸與使用何種解碼器

    on_open_video


    當用戶端提出連線需求時,判斷是否到達使用者上限,若沒有超過上限便會允許並重設video encode module使得下一frame會帶有VPS、SPS與PPS資訊,若已達上限則會拒絕連線。

    on_close_video


    用戶端結束連線,更新目前使用者連線數量。

    on_get_video_info


    RTSP伺服器端要回傳用戶端的SDP資訊時,將目前的資訊複製到NVTLIVE555_VIDEO_INFO的格式並傳遞給伺服器。

    on_lock_video


    這是實際video frame的內容,需將資料從video encode module中取出,存放在暫存記憶體後將資料的位址與大小填入NVTLIVE555_STRM_INFO的格式,live555會將之包裝成RTP格式的封包,傳送給用戶端。

    on_unlock_video


    封包已傳送給用戶,釋放在on_lock_video中所配置的暫存記憶體。


    執行結果

    伺服器端

    將每個所需的callback function都實作完成並配置好後,就可以在設備上執行程式,此時設備作為伺服器端,執行結果如下:

    此時RTSP Server已經準備好接收用戶端的連線請求。

    用戶端

    我們使用的用戶為VLC Media Player,執行後按下開啟網路串流的選項,就可以輸入伺服器端的資訊準備連線,設備預設的IP位址與RTSP的URL為rtsp://192.168.0.4/channel0


    按下播放按鈕後,就可以看到目前設備前端攝影機的即時串流影像了


    結語

    使用Live555 Streaming Library,可以方便的將各個範例的輸出改至RTSP串流,免去透過網路或是儲存媒體複製檔案後才能觀看結果的繁瑣過程,可以更為即時的看到影像以了解範例中各個參數的效果,讓產品的開發更加便利。

    ★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

    ★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

    評論