網路監控攝影機與 RTSP 遠端錄影備份
許多一般家用型、採 Wi-Fi 無線網路連接的網路監控攝影機(IP camera)都具備 RTSP 串流輸出的功能。所以除了預設的本機儲存能力外,其實也可以考慮啟用此功能。然後在區域網路中的其它電腦主機上,常態性的從攝影機接收 RTSP 串流,並儲存成檔案,來實現某種即時的遠端錄影備份。雖然這並不是一項很認真的需求,只是根據手上有的設備做試驗,但還是想看看這樣的作法是否容易實現。
結果並沒有如預期般的單純,在 Linux 主機上若是以腳本程式搭配工作排程的方式執行 FFmpeg,例如在腳本中執行以下指令:
- ffmpeg -loglevel error -i <RTSP 來源位址> -y -vcodec copy -an -t <錄製長度> <輸出的 MKV 檔案> > <輸出的日誌檔> 2>&1
發現會不定時出現停滯不動的情形,也就是 FFmpeg 會突然接收不到串流,但也不會自動結束程序,就這樣停在那裡,使得錄影備份就此中斷。然而只要重新再執行一次 FFmpeg,則又會恢復串流的接收。這樣的情形,平均一週可能有一或兩天會發生,頻率不算高,時段也不定。但沒有明顯可歸結出的環境因素,而且是一個始終存在的狀況。
試著調整 FFmpeg 的 -loglevel 參數,增加日誌輸出的細節。然而並沒有找到有用的線索,它依然是直接停在那裡,未顯示出什麼特別的狀態,也不會自行終止。另一方面,是否是攝影機設備的內部因素,或者與無線網路連線有關,DR 也覺得不容易去做偵錯。於是設計構想出現了轉變,認為必須首先讓 FFmpeg 有逾時自行結束程序的機制。然後根據 FFmpeg 程序是否存在,來自動地重新執行 FFmpeg。
試驗了一陣,最後是再新增以下三個參數:
- -rtsp_transport tcp(指定 RTSP 傳輸使用 TCP)
- -timeout 30000(設定 TCP I/O 30 秒逾時)
- -rw_timeout 30000(設定等待網路讀寫作業 30 秒逾時)
其中需要留意參數擺放的位置,例如 -rw_timeout 必須放在 -i 之後,否則會出現「Option rw_timeout not found」的錯誤。所以修改後的指令應如下所示:
- ffmpeg -loglevel error -rtsp_transport tcp -i <RTSP 來源位址> -timeout 30000 -rw_timeout 30000 -y -vcodec copy -an -t <錄製長度> <輸出的 MKV 檔案> > <輸出的日誌檔> 2>&1
工作排程與腳本程式的搭配方式也因此做了調整,原本是每日 00:00 啟動,然後用 FFmpeg 的參數「-t 24:00:00」指定錄製長度為 24 小時。但後續修改成每 5 分鐘啟動一次,檢查當前是否存在執行中的 FFmpeg 程序。若無便執行新的 FFmpeg 程序,並根據當前時間計算出剩餘應錄製的長度,再寫入到執行參數中。如此一來,一旦遠端錄影出現中斷,當日就會產生不只一份錄影檔,而且錄影檔之間也可能會存在一些未錄製到的間隔。雖然實作上有點粗糙,不過至少整個過程是自動化的,無須人為涉入。