iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0
佛心分享-IT 人職涯歷練

我從 intern 變菜鳥:30 天學會別再手擀破輪子系列 第 16

Day 16|只是要一張照片,別先闖進攝影機裡

  • 分享至 

  • xImage
  •  

我們用 SMART——Specific(具體)、Measurable(可衡量)、Achievable(可達成)、Relevant(具關聯)、Time-bound(有時限)——把每個故事拆成五天,作為每次動手造輪子前的五個檢查問題。

本篇是故事四「從 ONVIF 攝影機截圖太難了,我們來搞 V4L2」的 Specific 篇:現在真正要解決的是什麼問題?

本篇定位:說明不熟悉上層協定時,人容易誤以為直接碰底層會比較簡單。

當時發生了什麼

需求很樸素:整合平台在特定事件發生時,向現場的網路攝影機(IP camera)要一張當下的畫面,附進紀錄裡。攝影機是現成的商用產品,接在客戶網路上,跟我們的系統隔著一條網路線。

問題出在沒有人熟 ONVIF(Open Network Video Interface Forum)。文件打開是一整片 SOAP(Simple Object Access Protocol)與 WSDL,裝置服務、媒體服務、Profile、Snapshot URI 一堆名詞互相引用;RTSP 又是另一個世界。兩天過去,進度停在「還在讀規格」——讀了很多卻交不出東西的挫折,比讀不懂更難受。

第三天,有人試著用出廠預設密碼 SSH 進了攝影機。畫面跳出一個熟悉的 shell,ls /dev 一敲,video0 就躺在那裡。那一刻會議室的氣氛肉眼可見地鬆了:兩天讀不出結果的東西,換一個入口就有了實感。提案於是誕生:「別跟那些協定纏鬥了,直接在攝影機裡跑一支程式,從 V4L2 抓影像丟出來。Linux 我們熟,這樣最直接、最單純。」

我也認同。現在回想,那天說服我們的是一種直覺——離資料愈近愈可靠、Linux 我們天天在用、SSH 一登入就「有東西」了——技術判斷在那個當下缺席。「底層」聽起來就是源頭,源頭聽起來就是簡單。

真正的問題在哪裡

先把名詞放回各自的位置。

ONVIF 是網路攝影機的產業標準介面,用 SOAP 與 WS-* 那一套定義裝置服務與媒體服務,解的是「陌生的整合者隔著網路,如何跟一台陌生的攝影機打交道」:怎麼找到設備、怎麼認證、怎麼問出它能提供什麼。

當時繞暈我們的陷阱之一,是 ONVIF 裡有兩種東西中文都想叫它「設定檔」。一種是 Profile S、Profile T 這類一致性規範:認證層級的功能集合,回答的是「這台設備通過了哪一套一致性檢驗」,其中 Profile S 已經進入淘汰程序。另一種是 GetProfiles 回傳的媒體設定檔(media profile):攝影機內部的組態,把影像與音訊來源對應到編碼器、PTZ 與分析設定。兩者分屬不同層次,混著讀只會愈讀愈糊。至於 Snapshot URI,是設備回答「單張畫面去這裡拿」的那個網址,不是另一套技術,是問出來的答案。

設備探索也一樣。ONVIF 用 WS-Discovery 在同一個網段發 UDP 多播找設備,而多播通常不穿越路由器,跨網段時它幫不上忙;何況探索的產出只是一組裝置服務位址而已。裝置管理服務的進入點本身是固定的 http://<裝置IP>/onvif/device_service——位址已經知道的時候,這一步可以直接略過。

RTSP(Real Time Streaming Protocol,即時串流協定,RFC 2326)解的是另一個問題:連續影像怎麼在網路上開始、暫停、結束,靠 DESCRIBE、SETUP、PLAY 協調,影像資料再由 RTP 載送。

V4L2(Video4Linux2)則是 Linux 核心提供的本機影像擷取 API,操作的對象是 /dev/videoN 這樣的本機裝置節點,服務對象從頭到尾都在機器裡面。

三者不是同一件事的三種難度,而是三個不同位置的答案。

我們的需求是隔著網路要一張圖。遠端整合的難處——認證、網路狀況、跨廠牌差異——不會因為鑽進設備內部就消失,只會換一種形式跟進來:SSH 帳密也是認證,程式要部署進去、影像要送出來,仍然得走那條網路。

「愈底層愈簡單」是那天最大的錯覺。V4L2 看起來乾淨,是因為它只承諾把裝置節點的資料交給你,格式協商、緩衝佇列、色彩轉換、編碼全是你的事。上層協定名詞多,是因為它把這些事都做完了,名詞是服務的目錄。

那台攝影機還不是我們的產品。SSH 進客戶網路上的商用設備改東西,跨過的是產品邊界,早就不只是技術選型。

可以怎麼做

Specific 這一步,是在被任何名詞嚇跑之前,先把需求釘成一句話:「事件發生時,系統透過網路,向指定攝影機取得一張當下的畫面。」需求是截圖,不是串流、錄影或設備管理——這個區分決定了該讀哪一段文件。

接著盤點驗證所需的資訊:型號與韌體版本、宣告通過哪一套一致性規範、管理帳密、網段是否可達、裝置服務位址。這些翻說明書或開設備網頁介面就能查,比進去探險便宜得多。

最後用架構邊界檢查方案:我們的系統在攝影機外面,正當的互動面是它公開的網路介面;要進到設備裡面的方案,都該當成跨越邊界的例外來審查,而不是預設選項。V4L2 沒有錯,它只是站在門內。

今天學到的事

不熟悉上層協定時,底層會散發一種虛假的親切感,因為它的概念比較少。但概念少不等於工作少:那些消失的名詞,之後都會變成要親手寫的程式。當需求只是在門外取得一張照片,進屋拆攝影機通常不是捷徑,而是換了一個更難離開的入口。

不過那天還有一個更基本的問題沒有人問:就算圖拿到了,怎樣才算拿對了?工程師的電腦上曾經出現過一張 JPEG,算不算完成?在談怎麼做之前,得先講清楚什麼叫做完。


上一篇
Day 15|每一層暫時包裝,都要有轉正或拆除期限
下一篇
Day 17|截得到一張圖,還要知道它是不是正確、穩定、可重現
系列文
我從 intern 變菜鳥:30 天學會別再手擀破輪子17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言