FFmpeg 實作簡易監視器與錄影

話說公司裡有一個房間是充當資訊機房的作用,雖然放置了一堆設備跟線路,但外觀上就是很單純的一個房間,也沒有監視器。儘管監視器實際上並不是很重要,但由於 DR 的座位,跟機房之間有點距離。所以若能規劃出一個簡易方案,從遠端就能夠檢視機房現場,覺得也不是件壞事。

 

於是便從機房中選了一部作業系統為 RHEL 8.x 的伺服器主機,裝上一支 Microsoft LifeCam HD-3000 網路攝影機。讓該主機除了原本的任務外,再額外擔負起監視機房的工作。至於軟體層的規劃非常單純,DR 的構想是在主機上使用 FFmpeg 擷取視訊鏡頭(/dev/video0),並轉碼成 H.264 串流;然後透過管線輸送給本機的 VLC 播放軟體,再由 VLC 建立一個簡單的 HTTP 服務在 8080 埠上。編寫的指令如下:

  • ffmpeg -f v4l2 -thread_queue_size 8192 -video_size 1280x720 -input_format mjpeg -i /dev/video0 -vf "drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf: text='%{localtime\: %Y-%m-%d %H\\\\\:%M\\\\\:%S}': fontcolor=white@0.8: x=7: y=700" -an -c:v libx264 -preset veryfast -b:v 3000k -maxrate 3000k -bufsize 6000k -pix_fmt yuvj422p -g 50 -f flv -|cvlc --intf dummy stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=0.0.0.0:8080}

 

由於沒有打算收錄音訊的部份,所以麥克風裝置是完全省略,不做擷取與轉碼。以及為了讓輸出的影像能夠反映出日期及時間,所以加上了繪製文字的設定,將時間繪製在畫面左下角。除此之外,前述指令的 VLC 輸出功能是監聽 TCP 8080 埠,所以防火牆規則要記得做相應的放行。

 

順利執行指令後,在電腦上使用 VLC 或其它媒體播放器,開啟 http://<主機 IP 位址>:8080,便應能夠播放串流。而在產生串流後,除了可使用播放器做監看外,也可以另外執行指令來進行錄影。舉例來說,於主機上執行以下指令,便能夠從 http://localhost:8080 儲存 5 分鐘長度的 MP4 影片:

  • ffmpeg -i http://localhost:8080 -y -vcodec copy -an -t 00:05:00 output.mp4

 

若以此類推,再利用系統排程及編寫腳本,就能夠實作出定期及分段錄影的機制了。

 

分類: