1. 程式人生 > >使用樹莓派實現(山寨)高清視頻疊加(HDMI OSD)

使用樹莓派實現(山寨)高清視頻疊加(HDMI OSD)

.com 方法 python read 播放 vdp 顯示 視頻顯示 字符

項目需要在HDMI上疊加一些字符包括漢字和數值,要求不能使用臺式機,本身也沒有HDMI采集卡驅動開發能力,所以通過海思的HDMI編碼器將HDMI編碼為h.264網絡視頻流,然後通過樹莓派解碼顯示,做字符疊加(OSD),將樹莓派的HDMI輸出接在電視上,就實現了HDMI的高清視頻字符疊加。
1、中文字符問題
  opencv實現中文字符顯示需要依賴freetype,所以這裏簡單的加載一張圖像模板,opencv在模板上添加數字,漢字部分不需要動在模板中寫好即可。
2、樹莓派串口問題
首先read的時候報錯:
  device reports readiness to read but returned no data (device disconnected?)
然後重新打開,報錯:
  Could not configure port: (5, ‘Input/output error‘)
用minicom打開正常,再用程序打開也正常
整個系統經常假死,ssh無法連接,已經連接的終端不斷開,但無法操作,鼠標能移動,但界面無反應。軟件停止運行,但有時視頻能正常播放。
將樹莓派的硬件串口引出後,問題解決。
3、視頻顯示問題
一開始使用nanopi-M1,但播放視頻時發現卡頓嚴重,1080p僅能播放14幀每秒。使用OpenCV-Python直接打開rtsp流,進行疊加顯示,結果卡頓嚴重,基本上全是綠屏。CPU占用率單核100%,說明opencv使用軟解,無法達到實時。
通過ffmpeg播放rtsp流,效果一樣。通過ffmpeg播放時,解碼部分是硬解,但轉碼部分沒有優化,導致CPU占用達到100%,不能流暢播放。
通過mplayer指定解碼器播放視頻文件流暢,CPU占用30%,所以應該是用GPU解碼的:
  mplayer rtsp://192.168.1.90:554/ -vo vdpau -vc ffh264vdpau
使用mplayer播放rtsp時,CPU占用率低,但播放不流暢。懷疑是mplayer的rtsp部分有問題,現在也沒有解決。

所以用樹莓派繼續嘗試。
在樹莓派3上使用omxplayer直接播放rtsp視頻:
  omxplayer --avdict rtsp_transport:tcp rtsp://192.168.1.90:554/
但延時高。而且也沒有找到方法做osd。所以找了這個鏈接:https://github.com/AndrewFromMelbourne/raspidmx,用這裏邊的例子pngview實現了PNG圖像在顯示器上透明顯示,一邊用omxplayer播放rtsp視頻,一邊用opencv繪制PNG圖像,再通過pngview畫到顯示器上,就實現了視頻osd功能。

單張PNG疊加實現後,將pngview編譯成動態庫,由Python調用,但疊加幾次以後黑屏,無法解決。所以pngview仍然作為獨立進程使用,Python 調用opencv在PNG模板上繪制數字,保存在內存文件系統/tmp下,然後調用pngview顯示,啟動pngview後,延時50ms殺死上次啟動的pngview,防止閃屏。

內存文件系統:
在/etc/fstab中加入一行:
  none /tmp tmpfs default 0 0
或者在/etc/rc.local中加入
  mount tmpfs /tmp -t tmpfs -o size=128m
註:size=128m 表示/tmp最大能用128m
不管哪種方式,只要linux重啟,/tmp下的文件全部消失

這樣就實現了HDMI視頻osd功能。效果如下:

技術分享

4、顯示分辨率問題
解決視頻顯示以後,本以為就完成了。但是斷電重新開機時,發現屏幕分辨率不對。
  1、使用顯示器直接連接樹莓派,顯示器先上電,樹莓派再上電,分辨率1280*720,一切正常
  2、使用顯示器直接連接樹莓派,顯示器稍晚1s上電,樹莓派不啟動圖形界面,顯示器上顯示無信號
  3、使用以色列圖傳連接樹莓派,同時上電時,顯示分辨率變為640*480,無法改變
  4、使用以色列圖傳連接樹莓派,圖傳上電以後樹莓派上電,顯示分辨率為1920*1080,無法改變,視頻正常播放,osd正常疊加,但視頻和osd一起運行,屏幕花屏,然後黑屏。截掉任意一個程序,恢復正常。
問題無法解決,所以開機時檢測屏幕分辨率,若分辨率不對,就重啟,由於分辨率問題是樹莓派與顯示器一起上電導致的,所以重啟後分辨率就對了,就形成了以上的第四種情況,然後又接了一個HDMI雙路視頻切換的盒子,這個切換盒與樹莓派同時上電可以獲得正確的分辨率,於是問題解決了……
所以系統拓撲如下……

技術分享

由於不具備全系統開發能力,無法提高系統集成度,只能依靠買來的模塊攢,最終無法做出穩定可靠的東西

使用樹莓派實現(山寨)高清視頻疊加(HDMI OSD)