我們在實作Windows平台RTSP播放器或RTMP播放器的時候,需要考慮的點很多,比如多執行個體設計、多繪制模式相容、軟硬解碼支援、快照、RTSP下TCP-UDP自動切換等,以下就其中幾個方面,做個大概的探讨。
我們在實作Windows平台播放的時候,一般首選D3D,D3D不支援的情況下,考慮資料回上來,采用GDI模式,一般實作如下,先做D3D檢測,以大牛直播SDK播放端為例(Github),調用NT_SP_IsSupportD3DRender(),檢測是否支援D3D模式,如果支援的話,調用NT_SP_SetRenderWindow(), 然後,設定是否等比例縮放(調用NT_SP_SetRenderScaleMode())。
如果不支援D3D,設定RGB資料回調:
資料處理如下:
在OnPaint()繪制即可:
Windows平台硬解碼,主要适用于性能偏弱的PC端,或者有多路播放訴求的場景,一般建議在軟解性能沒問題的情況下,盡量軟解,具體處理如下,先檢測系統是否支援硬解,如果支援,再做硬解設定,這樣的好處在于如果系統不支援硬解,可以繼續軟解播放,具體設定如下,在調用NT_SP_Open()之前,做檢測,因為NT_SP_Open()每個句柄對應一個player執行個體,多個執行個體隻需要做一次判斷即可:
播放之前,設定硬解碼:
隻解關鍵幀的場景,也是用于多路播放訴求,比如一般的監控場景,考慮到多路的場景,一般關鍵幀間隔不大(如1-2秒一個),平台可對現場場景有個宏觀了解,如需重點關注某幾路畫面的時候,再實時取消這個選項,實作全幀播放,是以,隻解關鍵幀一定要做成實時調用的接口才更有設計意義。
好多現場的開發人員有這樣的困惑,有些裝置,在安裝時,可能沒調整好角度,導緻拍出來的角度倒立等,看着很不友善,這時候,如果現場裝置比較多的話,不可能每台裝置都到現場重新安裝,實時view旋轉,就展現了價值,具體如下:
視訊view選擇,會消耗一定的CPU。
實時快照功能不表,是一個好的RTSP播放器和RTMP播放器必備的功能,實時快照是把解碼後的yuv資料重新編碼成png,是以有一定的CPU消耗,不建議過于頻繁操作,具體實作如下:
後續,我們将針對RTSP和RTMP播放器設計過程中的其他點,做更進一步的探讨。