? RK3399/RK3328具有強大的視頻編解碼能力,Soc集成的硬件視頻編解碼器VPU,能同時處理多路視頻的編解碼,Soc集成的圖形加速引擎RGA, 可以高效地處理圖形縮放、旋轉(zhuǎn)、顏色空間轉(zhuǎn)換等操作。結(jié)合VPU和RGA,可以高效地實現(xiàn)視頻流的解碼和后處理,作為第三方應(yīng)用處理的數(shù)據(jù)源。
調(diào)用API
????????Rockchip開發(fā)的mpp庫,提供了非常易于使用API,通過各種不同的控制項,可以適應(yīng)多種不同場景的視頻編解碼應(yīng)用。
硬件準(zhǔn)備
?
????????RK3399平臺:AIO-3399C主板 + 12路攝像頭
運行Demo
?
????????Firefly在RK3399和RK3328 Ubuntu平臺上, 針對目前最常見的場景,提供了一個多路RTSP流解碼的Demo,Demo支持在RK3399平臺上, 同時解12路H264/H265 RTSP,測試流幀率為25fps,無丟幀,低延時,CPU占用率較低(基本只用于RTSP流接收和封包)。在RK3328平臺上,同時能解6路H264/H265 RTSP。
運行過程
?
????????Demo中,MPP解碼->圖像后處理->顯示整個流程中,VPU和RGA都是直接訪問內(nèi)存物理地址,整個過程零內(nèi)存拷貝,效率很高。處理后的數(shù)據(jù),通過libdrm接口,直接送往顯示接口輸出。
????????Demo對解碼后的圖像輸出數(shù)據(jù),只做了顯示處理,如果在實際應(yīng)用中需要對圖像做處理,可能會導(dǎo)致幀率下降。
演示效果
?
運行時效果圖如下:
實時幀率
實時幀率計算結(jié)果如下:
安裝方法
Demo運行在RK3399 或 RK3328 Ubuntu 18.04平臺上。
?
1. 確認(rèn)系統(tǒng)中存在 /dev/rga 設(shè)備節(jié)點。 如果沒有此節(jié)點, 請參考wiki更新最新的固件。
2.?安裝:
????$?sudo?apt?update???? ????$?sudo?apt?install?firefly-multi-rtsp
3.根據(jù)實際環(huán)境,修改配置文件。 參照下一節(jié)配置參數(shù)。
4. 運行:
????$?sudo?test_ff_rtsp_dec
5. 退出:
運行過程中,按Enter鍵,退出Demo, 由于退出時需要關(guān)閉多路rtsp流,所以退出時需要稍作等待。
配置參數(shù)
?
Demo中提供了一個配置文件config.json,用于配置demo的運行環(huán)境。
?
配置文件位于/etc/ff_rtsp_dec/config.json ,json格式。(注意不要在config.json中添加注釋,否則可能會導(dǎo)致json解析出錯)
主要配置項如下
基礎(chǔ)參數(shù):
????"basepara"?:?{ ????????"dri_path"?:?"/dev/dri/card0",??//不要修改 ???????? ????????"prefer_monitor_w"?:?1920,? ????????"prefer_monitor_h"?:?1080, ???????? ????????"code_type"?:?"H265",?//rtsp流編碼類型,H264/H265 ?????????"line_count"?:?12,??//rtsp流數(shù)量 ????????? ?????????"output_w"?:?480,??//每一路解碼后的輸出size. ?????????"output_h"?:?360, ????????? ?????????"rotate"?:?0?//旋轉(zhuǎn)???未使用 ????????? ?????????},
其中prefer_monitor_w 和 prefer_monitor_h是配置外接顯示設(shè)備的分辨率。
?
1. 配置外接顯示設(shè)備的分辨率,僅在顯示設(shè)備支持多種分辨率(如HDMI、DP等顯示器)時有效,如果顯示設(shè)備支持該分辨率,則將顯示設(shè)備設(shè)置為該分辨率。
?
2. LVDS, MIPI屏該配置無效(但仍需保留該配置項,只是配置值無效),因為LCD支持一種分辨率。
?
3. 配置此參數(shù)后,Demo將顯示設(shè)備設(shè)置為對應(yīng)的分辨率,然后計算該分辨率是否能夠完整顯示所有路RTSP解碼后的輸出。如果不能顯示,應(yīng)該減小rtsp流數(shù)量,或者減小輸出尺寸。
????line_h?=?prefer_monitor_w?/?output_w;? ????line_v?=?prefer_monitor_h?/?output_h;? ????line_h?*?line_v