FFplay 與 Xephyr 實作多格監視畫面
最近在評估無須依賴監視系統所提供的網頁後台、就能夠在電腦上查看監視畫面的替代方案。由於該監視系統也有提供 RTSP 串流,所以其實是可以在媒體播放器上,輸入指定的連線位址及登入帳密,就能夠播放監視畫面。然而如果要同時觀看十幾個畫面頻道,這樣若是播放程式也要同時開啟十幾個在桌面上,感覺就不是一件很妙的事……
於是在 Linux 桌面系統上嘗試了幾種解決方案,包含在 VLC 裡設定多個媒體來源的合成,並且也透過 FFmpeg 做過類似的試驗;此外也有嘗試過標榜可同步播放多個媒體的播放程式(GridPlayer)。然而這些試驗,在實際播放時都還是有遇到一些狀況,可靠性始終不及直接同時開啟多個播放程式、這種簡單粗暴卻是有效的作法。這因此讓 DR 覺得,與其再繼續細究這些解決方案的障礙,不如聚焦在如何讓多個播放程式在同時運作時,有更好的呈現方式,至少要能夠避免這些播放視窗凌亂地互相交疊的情形。
那麼在設法對播放程式進行編排控制的思維下,FFmpeg 隨附的簡易播放程式 FFplay,就會是一個比較好的實作選項。其具備多項有用的參數,例如 -noborder 可以消除視窗外框,-alwaysontop 讓視窗保持在前景;以及 -left、-top 指定視窗的座標位置,最後則是 -x、-y 可以用於指定視窗的大小。所以只要編寫一支腳本,以迴圈帶入參數的方式來執行多次 ffplay 指令:
- ffplay -hide_banner -loglevel error -noborder -alwaysontop -left <X 座標> -top <Y 座標> -x <視窗寬度> -y <視窗高度> "<串流來源位址>" &
多個播放串流就會整齊地陳列在桌面上,然後簡單地用 pkill 就可以將其全數關閉:
- pkill ffplay
然而除非部署的電腦主機是純粹做查看監視畫面的用途,否則這些監視畫面就這樣固定在桌面上,是蠻有可能會影響到其它的操作任務。即便如果有多螢幕的配置能夠分擔桌面工作區域,使用者仍是有可能會在管理工作視窗時,發覺到同時存在著大量的視窗程式項目。於是這便是 Xephyr 能夠派上用場的時候了,可以使用 Xephyr 建立一個新的顯示窗格:
- Xephyr -resizeable -screen 1280x720 :2 &
然後將 ffplay 指令改投放至該顯示窗格中:
- DISPLAY=:2 ffplay -hide_banner -loglevel error -noborder -alwaysontop -left <X 座標> -top <Y 座標> -x <視窗寬度> -y <視窗高度> "<串流來源位址>" &
如此一來就可以形成一個單一視窗(Xephyr),來容納多個播放畫面,可自由地將視窗移動到桌面上的不同位置。儘管如前所述,直接開多個播放程式來呈現多頻道的監視畫面,的確是挺粗暴的作法。但無論如何,如果在其它方式上進展不順,那麼這至少是一種姑且有用的作法。