1. web端實現rtsp實時推流視頻播放可行性方案
在web端實現rtsp實時推流視頻播放,有多種可行性方案,包括RTMP、HLS、WebSocket、VLC插件、JSMpeg、WebRTC(webrtc-streamer)以及liveweb等。以下是幾種方案的簡要概述:
1. **RTMP方案**:需要ffmpeg處理rtsp到rtmp,通過nginx代理,但依賴flash支持,且Windows下編譯復雜,且主流瀏覽器不支持flash。
2. **HLS方案**:通過切片轉存為多個視頻片段,web端用video.js播放,簡單但延遲較高,適合點播。
3. **WebSocket**:原生支持,延遲低,但前端接收的是mp4格式,易於顯示。
4. **VLC插件**:直接播放RTSP,無需中介,但需手動安裝插件且對瀏覽器兼容性有限。
5. **WebRTC (webrtc-streamer)**:性能好、延遲低,但後端CPU佔用高,且支持多路同屏數有限。
6. **liveweb**:支持多種流媒體格式,具備高可用性和靈活性,可實現H5無插件直播。
目前,WebRTC方案被認為是最好的,尤其阿里雲等服務採用此方案。但需注意的是,WebRTC還有更多功能,如實時通話,未來可能有更多應用空間。
綜上,選擇哪種方案取決於項目需求、技術棧和兼容性要求,權衡延遲、穩定性、兼容性和資源消耗等因素。
2. live555移植到hi3516做rtsp伺服器
live555庫本身實現了做rtsp伺服器,客戶端可以通過rtsp客戶端訪問伺服器上的文件並播放,支持的文件格式如下:
本次任務實現了把live555移植到嵌入式海思晶元hi3516上做rtsp伺服器,除了支持客戶端播放伺服器上上面格式文件外,另添加了實時播放hi3516攝像頭圖像與音頻的功能。
live555源碼目錄如下:
四個基本的庫分別是:BasicUsageEnvironment, groupsock, liveMedia和UsageEnvironment。
編譯後即生成這4個庫文件:
這里我只簡單說下liveMedia庫的功能,其他三個庫是live555運行的基礎庫,太(mei)簡(yan)單(jiu),就不說了。
liveMedia庫包含了音視頻相關的所有功能,包含音視頻文件的解析,RTP傳輸封裝等,我們可以看到這個目錄下有對h264、AAC等文件解析的支持:
交叉編譯過程:略
這里我主要是修改mediaServer文件夾下的示常式序,添加實時預覽攝像頭圖像與mic聲音功能。
hi3516晶元,視頻編碼格式為h264,音頻編碼格式為AAC。
1.添加音頻AAC支持
添加類 ADTSAudioLiveSource ,繼承自FramedSource
在該類的doGetNextFrame函數里實現獲取hi3516音頻數據做為rtsp伺服器音頻源。
注意點:
1.1 adts默認是帶7位元組或者9位元組的頭,傳給rtsp的時候是要去掉頭的,實際上RTSP通過rtp傳輸AAC幀的時候是不帶adts頭的,而是帶4個位元組的mpeg4-generic頭。
1.2 從FramedSource繼承而來的變數
每次doGetNextFrame幀時,從FIFO里取一個完整的AAC幀,把幀拷貝到fTo buf裡面,然後比較幀大小與fMaxSize來賦值幾個關鍵的變數:
注意,不管幀長是否大於fMaxSize,每次都需要把完整的幀拷貝到fTo指針,live555內部會根據fNumTruncatedBytes等變數自行處理分包。
1.3 doGetNextFrame函數最後不管有沒有取到幀,都需要執行FramedSource::afterGetting
1.4 采樣率,通道數,configstr等的計算
這幾個變數在mediaSubbsession建立RTPsink時要用到,它直接影響了SDP里對於AAC音頻描述欄位的產生
添加類 ,繼承自
createNewStreamSource函數創建上面的ADTSAudioLiveSource做為音頻輸入源,參數estBitrate為預估的碼率,海思AAC編碼碼率設置為24kbps,所以estBitrate設置為24.
createNewRTPSink有必要繼承,因為需要根據音頻源的采樣率、通道數等創建RTPSink.
2.添加h264支持
添加 H264FramedLiveSource ,繼承自FramedSource
unsigned maxFrameSize()函數必須繼承,裡面設置幀最大可能的大小,我設置為100000,如果不繼承就是默認的,會出現畫面馬賽克
doGetNextFrame函數裡面和AAC取幀的處理差不多,我加多了一個步驟,就是第一次取幀的時候會調用介面去產生一個關鍵幀,並且等待這個關鍵幀到來才處理,這樣連接後出圖會比較快。
添加類 ,繼承自
這個類就是實現createNewStreamSource時創建H264FramedLiveSource
3.修改DynamicRTSPServer
修改類DynamicRTSPServer,在lookupServerMediaSession函數里動點手腳,默認在這個函數裡面會根據文件名去尋找伺服器下相應的文件做為直播源,我這里比較如果是我特定的live源名字則直接返回,相應的live源創建rtsp伺服器的時候就添加好
4.初始化rtsp server
初始化rtsp伺服器,添加一個ServerMediaSession,該mediaSession添加一個和一個,然後把該mediaSession添加給rtsp伺服器。
客戶端訪問 rtsp://x.x.x.x/ch0.live 時就可以看到實時的攝像頭圖像與聲音啦!