如何在 Linux 中使用舊相機作為網(wǎng)絡(luò)攝像頭
今年,在我基本上放棄了 MacBook,轉(zhuǎn)而使用 NixOS 機器之后,我開始在與人進(jìn)行視頻通話時被要求“打開攝像頭”。這是一個問題,因為我沒有網(wǎng)絡(luò)攝像頭。我考慮購買一個,但后來我意識到我有一臺完好無損的 2008 年產(chǎn)的佳能 EOS Rebel XS 數(shù)碼單反相機放在書架上。這臺相機有一個 mini-USB 接口,所以我自然而然地思考:一臺數(shù)碼單反相機、一個 mini-USB 接口和一臺臺式電腦,是否意味著我能擁有一個網(wǎng)絡(luò)攝像頭?
只有一個問題。我的佳能 EOS Rebel XS 不能錄制視頻。它可以拍攝一些漂亮的照片,僅此而已。所以這結(jié)束了?
還是有別的辦法?
恰好有一個叫做 ??gphoto2?? 的神奇的開源軟件。一旦安裝,它允許你從計算機控制各種支持的相機,并拍攝照片和視頻。
支持的相機
首先,了解你的設(shè)備是否得到支持:
拍攝圖像
你可以用它拍照:
快門觸發(fā),圖像會保存到你當(dāng)前的工作目錄中。
錄制視頻
我意識到了這里的潛力,所以盡管我的相機沒有視頻功能,我還是決定嘗試 ??gphoto2 --capture-movie?
? 命令。不知怎么,盡管我的相機不支持視頻功能,??gphoto2?
? 仍然能夠生成一個 MJPEG 文件!
在我的相機上,我需要將其置于“實時預(yù)覽”模式下,然后 ??gphoto2?
? 才能錄制視頻。這包括將相機設(shè)置為縱向模式,然后按下 “設(shè)置Set” 按鈕,使取景器關(guān)閉,相機屏幕顯示圖像。不幸的是,這還不足以將其用作網(wǎng)絡(luò)攝像頭。它仍然需要分配一個視頻設(shè)備,例如 ??/dev/video0?
?。
安裝 ffmpeg 和 v4l2loopback
毫不奇怪,有一個開源的解決方案來解決這個問題。首先,使用你的包管理器安裝 ??gphoto2?
?、??ffmpeg?
? 和 ??mpv?
?。例如,在 Fedora 、CentOS 、Mageia 和類似的 Linux 發(fā)行版上:
在 Debian、Linux Mint 及其類似發(fā)行版:
我使用的是 NixOS,這是我的配置文件:
創(chuàng)建虛擬視頻設(shè)備需要使用 ??v4l2loopback?
? Linux 內(nèi)核模塊。在撰寫本文時,該功能未包含在主線內(nèi)核中,因此你需要自己下載和編譯它:
如果你像我一樣使用 NixOS ,你可以在 ??configuration.nix?
? 中添加額外的模塊包:
在 NixOS 上, 運行 ??sudo nixos-rebuild switch?
?,然后重啟。
創(chuàng)建一個視頻設(shè)備
假設(shè)你的計算機當(dāng)前沒有 ??/dev/video?
? 設(shè)備,你可以借助 ??v4l2loopback?
? 在需要時創(chuàng)建一個。
運行以下命令,將 ??gphoto2?
? 中的數(shù)據(jù)發(fā)送到 ??ffmpeg?
?,使用設(shè)備如 ??/dev/video0?
? 設(shè)備:
你得到的輸出是這樣的:
要查看來自網(wǎng)絡(luò)攝像頭的視頻,請使用 ??mpv?
? 命令:
Streaming a live feed from the webcam
自動啟動你的網(wǎng)絡(luò)攝像頭
每次想使用網(wǎng)絡(luò)攝像頭時都需要執(zhí)行一次命令有點麻煩。幸運的是,你可以在啟動時自動運行此命令。我將其實現(xiàn)為一個 ??systemd?
? 服務(wù):
在 NixOS 上,運行 ??sudo nixos-rebuild switch?
?,然后重新啟動你的計算機。你的網(wǎng)絡(luò)攝像頭已經(jīng)開啟并處于活動狀態(tài)。
要檢查是否存在任何問題,可以使用 ??systemctl status webcam?
? 命令。它會告訴你服務(wù)最后一次運行的時間,并提供其以前輸出的日志。這對于調(diào)試非常有用。
迭代以使其變得更好
止步于此也許很誘人。但是,考慮到當(dāng)前的全球危機,我們可能需要思考是否有必要一直開著網(wǎng)絡(luò)攝像頭。這讓我感到不太理想,原因如下:
- 這浪費電。
- 這類事情涉及隱私問題。
我的攝像頭有一個鏡頭蓋,所以說實話,第二個原因并不真的讓我感到困擾。當(dāng)我不使用網(wǎng)絡(luò)攝像頭時,我總是可以把鏡頭蓋上。然而,讓一個耗電量大的單反相機整天開著(更不用說需要解碼視頻所需的 CPU 開銷),對我的電費并沒有任何好處。
理想情況是:
- 我一直把相機插在電腦上,但是關(guān)閉的。
- 當(dāng)我想使用網(wǎng)絡(luò)攝像頭時,我按下相機的電源按鈕將其打開。
- 我的計算機會檢測到相機并啟動 systemd 服務(wù)。
- 使用網(wǎng)絡(luò)攝像頭完成后,我再次將其關(guān)閉。
為了實現(xiàn)這一點,你需要使用一個自定義的 udev 規(guī)則。
udev 規(guī)則可以告訴你的計算機,當(dāng)它發(fā)現(xiàn)某個設(shè)備已經(jīng)可用時執(zhí)行某個任務(wù)。這可以是外部硬盤甚至是非 USB 設(shè)備。在這種情況下,你需要通過其 USB 連接識別相機。
首先,指定 udev 規(guī)則被觸發(fā)時要運行的命令。你可以用一個 shell 腳本來完成(??systemctl restart webcam?
? 應(yīng)該可以工作)。我運行的是 NixOS,所以我只需要創(chuàng)建一個派生包(一個 Nix 包),它會重新啟動 systemd 服務(wù):
接下來,實際定義 udev 規(guī)則。查找攝像頭的設(shè)備和廠商 ID。使用 ??lsusb?
? 命令可以完成此操作。該命令可能已經(jīng)安裝在你的發(fā)行版上,但我不經(jīng)常使用它,因此我只需要根據(jù)需要使用 ??nix-shell?
? 安裝它:
無論你的計算機上已經(jīng)安裝了它,還是剛剛安裝,請運行 ??lsusb?
? :
在此輸出中,廠商 ID 為 ??04a9?
?,設(shè)備 ID 為 ??317b?
?。這已足以創(chuàng)建 udev 規(guī)則:
或者,如果你使用的是 NixOS:
最后,在你的 ??start-webcam?
? systemd 服務(wù)中刪除 ??wantedBy = ["multi-user.target"];?
? 這一行。(如果保留它,則無論相機是否開啟,該服務(wù)都會在下次重啟時自動啟動。)
重復(fù)使用舊技術(shù)
我希望這篇文章能讓你在放棄一些舊技術(shù)之前三思而后行。Linux 可以為技術(shù)注入活力,無論是你的電腦還是數(shù)碼相機或其他外圍設(shè)備等簡單的東西。