日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

今年,在我基本上放棄了 macBook,轉(zhuǎn)而使用 NixOS 機(jī)器之后,我開(kāi)始在與人進(jìn)行視頻通話時(shí)被要求“打開(kāi)攝像頭”。這是一個(gè)問(wèn)題,因?yàn)槲覜](méi)有網(wǎng)絡(luò)攝像頭。我考慮購(gòu)買一個(gè),但后來(lái)我意識(shí)到我有一臺(tái)完好無(wú)損的 2008 年產(chǎn)的佳能 EOS Rebel XS 數(shù)碼單反相機(jī)放在書(shū)架上。這臺(tái)相機(jī)有一個(gè) mini-USB 接口,所以我自然而然地思考:一臺(tái)數(shù)碼單反相機(jī)、一個(gè) mini-USB 接口和一臺(tái)臺(tái)式電腦,是否意味著我能擁有一個(gè)網(wǎng)絡(luò)攝像頭?

只有一個(gè)問(wèn)題。我的佳能 EOS Rebel XS 不能錄制視頻。它可以拍攝一些漂亮的照片,僅此而已。所以這結(jié)束了?

還是有別的辦法?

恰好有一個(gè)叫做 ??gphoto2?? 的神奇的開(kāi)源軟件。一旦安裝,它允許你從計(jì)算機(jī)控制各種支持的相機(jī),并拍攝照片和視頻。

支持的相機(jī)

首先,了解你的設(shè)備是否得到支持:

$ gphoto2 --list-cameras

拍攝圖像

你可以用它拍照:

$ gphoto2 --capture-image-and-download

快門觸發(fā),圖像會(huì)保存到你當(dāng)前的工作目錄中。

錄制視頻

我意識(shí)到了這里的潛力,所以盡管我的相機(jī)沒(méi)有視頻功能,我還是決定嘗試 ??gphoto2 --capture-movie?? 命令。不知怎么,盡管我的相機(jī)不支持視頻功能,??gphoto2?? 仍然能夠生成一個(gè) MJPEG 文件!

在我的相機(jī)上,我需要將其置于“實(shí)時(shí)預(yù)覽”模式下,然后 ??gphoto2?? 才能錄制視頻。這包括將相機(jī)設(shè)置為縱向模式,然后按下 “設(shè)置Set” 按鈕,使取景器關(guān)閉,相機(jī)屏幕顯示圖像。不幸的是,這還不足以將其用作網(wǎng)絡(luò)攝像頭。它仍然需要分配一個(gè)視頻設(shè)備,例如 ??/dev/video0??。

安裝 ffmpeg 和 v4l2loopback

毫不奇怪,有一個(gè)開(kāi)源的解決方案來(lái)解決這個(gè)問(wèn)題。首先,使用你的包管理器安裝 ??gphoto2??、??ffmpeg?? 和 ??mpv??。例如,在 Fedora 、centos 、Mageia 和類似的 linux 發(fā)行版上:

$ sudo dnf install gphoto2 ffmpeg mpv

在 Debian、Linux Mint 及其類似發(fā)行版:

 
$ sudo apt install gphoto2 ffmpeg mpv

我使用的是 NixOS,這是我的配置文件:

# configuration.nix
...
environment.systemPackages = with pkgs; [
  ffmpeg
  gphoto2
  mpv
...
]

創(chuàng)建虛擬視頻設(shè)備需要使用 ??v4l2loopback?? Linux 內(nèi)核模塊。在撰寫本文時(shí),該功能未包含在主線內(nèi)核中,因此你需要自己下載和編譯它:

$ git clone https://github.com/umlaeute/v4l2loopback
$ cd v4l2loopback
$ make
$ sudo make install
$ sudo depmod -a

如果你像我一樣使用 NixOS ,你可以在 ??configuration.nix?? 中添加額外的模塊包:

[...]
boot.extraModulePackages = with config.boot.kernelPackages;
[ v4l2loopback.out ];
boot.kernelModules = [
  "v4l2loopback"
];
boot.extraModprobeConfig = ''
  options v4l2loopback exclusive_caps=1 card_label="Virtual Camera"
'';
[...]

在 NixOS 上, 運(yùn)行 ??sudo nixos-rebuild switch??,然后重啟。

創(chuàng)建一個(gè)視頻設(shè)備

假設(shè)你的計(jì)算機(jī)當(dāng)前沒(méi)有 ??/dev/video?? 設(shè)備,你可以借助 ??v4l2loopback?? 在需要時(shí)創(chuàng)建一個(gè)。

運(yùn)行以下命令,將 ??gphoto2?? 中的數(shù)據(jù)發(fā)送到 ??ffmpeg??,使用設(shè)備如 ??/dev/video0?? 設(shè)備:

$ gphoto2 --stdout --capture-movie |
 ffmpeg -i - -vcodec rawvideo -pix_fmt yuv420p -f v4l2 /dev/video0

你得到的輸出是這樣的:

ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with gcc 11.3.0 (GCC)
  configuration: --disable-static ...
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
Capturing preview frames as movie to 'stdout'. Press Ctrl-C to abort.[mjpeg @ 0x1dd0380] Format mjpeg detected only with low score of 25, misdetection possible!
Input #0, mjpeg, from 'pipe:':
  Duration: N/A, bitrate: N/A
  Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 768x512 ...
Stream mApping:
  Stream #0:0 -> #0:0 (mjpeg (native) -> rawvideo (native))[swscaler @ 0x1e27340] deprecated pixel format used, make sure you did set range correctly
Output #0, video4linux2,v4l2, to '/dev/video0':
  Metadata:
    encoder         : Lavf58.76.100
  Stream #0:0: Video: rawvideo (I420 / 0x30323449) ...
    Metadata:
      encoder         : Lavc58.134.100 rawvideoframe=  289 fps= 23 q=-0.0 size=N/A time=00:00:11.56 bitrate=N/A speed=0.907x

要查看來(lái)自網(wǎng)絡(luò)攝像頭的視頻,請(qǐng)使用 ??mpv?? 命令:

$ mpv av://v4l2:/dev/video0 --profile=low-latency --untimed

Streaming a live feed from the webcam

Streaming a live feed from the webcam

自動(dòng)啟動(dòng)你的網(wǎng)絡(luò)攝像頭

每次想使用網(wǎng)絡(luò)攝像頭時(shí)都需要執(zhí)行一次命令有點(diǎn)麻煩。幸運(yùn)的是,你可以在啟動(dòng)時(shí)自動(dòng)運(yùn)行此命令。我將其實(shí)現(xiàn)為一個(gè) ??systemd?? 服務(wù):

# configuration.nix
...
  systemd.services.webcam = {
    enable = true;
    script = ''
      ${pkgs.gphoto2}/bin/gphoto2 --stdout --capture-movie |
        ${pkgs.ffmpeg}/bin/ffmpeg -i - 
            -vcodec rawvideo -pix_fmt yuv420p -f v4l2  /dev/video0
    '';
wantedBy = [ "multi-user.target" ];
  };
...

在 NixOS 上,運(yùn)行 ??sudo nixos-rebuild switch??,然后重新啟動(dòng)你的計(jì)算機(jī)。你的網(wǎng)絡(luò)攝像頭已經(jīng)開(kāi)啟并處于活動(dòng)狀態(tài)。

要檢查是否存在任何問(wèn)題,可以使用 ??systemctl status webcam?? 命令。它會(huì)告訴你服務(wù)最后一次運(yùn)行的時(shí)間,并提供其以前輸出的日志。這對(duì)于調(diào)試非常有用。

迭代以使其變得更好

止步于此也許很誘人。但是,考慮到當(dāng)前的全球危機(jī),我們可能需要思考是否有必要一直開(kāi)著網(wǎng)絡(luò)攝像頭。這讓我感到不太理想,原因如下:

  • 這浪費(fèi)電。
  • 這類事情涉及隱私問(wèn)題。

我的攝像頭有一個(gè)鏡頭蓋,所以說(shuō)實(shí)話,第二個(gè)原因并不真的讓我感到困擾。當(dāng)我不使用網(wǎng)絡(luò)攝像頭時(shí),我總是可以把鏡頭蓋上。然而,讓一個(gè)耗電量大的單反相機(jī)整天開(kāi)著(更不用說(shuō)需要解碼視頻所需的 CPU 開(kāi)銷),對(duì)我的電費(fèi)并沒(méi)有任何好處。

理想情況是:

  • 我一直把相機(jī)插在電腦上,但是關(guān)閉的。
  • 當(dāng)我想使用網(wǎng)絡(luò)攝像頭時(shí),我按下相機(jī)的電源按鈕將其打開(kāi)。
  • 我的計(jì)算機(jī)會(huì)檢測(cè)到相機(jī)并啟動(dòng) systemd 服務(wù)。
  • 使用網(wǎng)絡(luò)攝像頭完成后,我再次將其關(guān)閉。

為了實(shí)現(xiàn)這一點(diǎn),你需要使用一個(gè)自定義的 udev 規(guī)則。

udev 規(guī)則可以告訴你的計(jì)算機(jī),當(dāng)它發(fā)現(xiàn)某個(gè)設(shè)備已經(jīng)可用時(shí)執(zhí)行某個(gè)任務(wù)。這可以是外部硬盤甚至是非 USB 設(shè)備。在這種情況下,你需要通過(guò)其 USB 連接識(shí)別相機(jī)。

首先,指定 udev 規(guī)則被觸發(fā)時(shí)要運(yùn)行的命令。你可以用一個(gè) shell 腳本來(lái)完成(??systemctl restart webcam?? 應(yīng)該可以工作)。我運(yùn)行的是 NixOS,所以我只需要?jiǎng)?chuàng)建一個(gè)派生包(一個(gè) Nix 包),它會(huì)重新啟動(dòng) systemd 服務(wù):

# start-webcam.nix
with import <nixpkgs> { };
writeShellScriptBin "start-webcam" ''
  systemctl restart webcam
  # debugging example
  # echo "hello" &> /home/tom/myfile.txt
  # If myfile.txt gets created then we know the udev rule has triggered properly''

接下來(lái),實(shí)際定義 udev 規(guī)則。查找攝像頭的設(shè)備和廠商 ID。使用 ??lsusb?? 命令可以完成此操作。該命令可能已經(jīng)安裝在你的發(fā)行版上,但我不經(jīng)常使用它,因此我只需要根據(jù)需要使用 ??nix-shell?? 安裝它:

$ nix-shell -p usbutils

無(wú)論你的計(jì)算機(jī)上已經(jīng)安裝了它,還是剛剛安裝,請(qǐng)運(yùn)行 ??lsusb?? :

$ lsusb
Bus 002 Device 008: ID 04a9:317b Canon, Inc. Canon Digital Camera[...]

在此輸出中,廠商 ID 為 ??04a9??,設(shè)備 ID 為 ??317b??。這已足以創(chuàng)建 udev 規(guī)則:

ACTION=="add", SUBSYSTEM=="usb",
ATTR{idVendor}=="04a9",
ATTR{idProduct}=="317b",
RUN+="/usr/local/bin/start-webcam.sh"

或者,如果你使用的是 NixOS:

# configuration.nix[...]let
  startWebcam = import ./start-webcam.nix;[...]
services.udev.extraRules = ''
  ACTION=="add",  
  SUBSYSTEM=="usb", 
  ATTR{idVendor}=="04a9", 
  ATTR{idProduct}=="317b",  
  RUN+="${startWebcam}/bin/start-webcam"'';[...]最后,在你的 ??start-webcam?? systemd 服務(wù)中刪除 ??wantedBy = ["multi-user.target"];?? 這一行。(如果保留它,則無(wú)論相機(jī)是否開(kāi)啟,該服務(wù)都會(huì)在下次重啟時(shí)自動(dòng)啟動(dòng)。)

重復(fù)使用舊技術(shù)

我希望這篇文章能讓你在放棄一些舊技術(shù)之前三思而后行。Linux 可以為技術(shù)注入活力,無(wú)論是你的電腦還是數(shù)碼相機(jī)或其他外圍設(shè)備等簡(jiǎn)單的東西。

分享到:
標(biāo)簽:攝像頭
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定