web-dev-qa-db-ja.com

Raspberry Pi:VLCを使用してWebカメラをストリーミングする:Logitech C920 [トランスコーディングなしのH264ビデオ+オーディオ+ LED制御]-SpyCam / BabyCam

RaspberryPiとLogitech C920 Webcamがあります。私はこれらのデバイスを監視/ベビーカメラとして使用したいと思います:CPUを集中的に使用するビデオトランスコーディングなしで(+ = --- ==)Stream audio + video over HTTP(または他のプロトコル)

C920ウェブカメラはネイティブにH264をストリーミングできるため、理論的にはRaspberyPi + VLCにビデオストリームのトランスコードを依頼する必要はありません。

組み込みのC920マイクストリームは、Webカメラストリームに含まれていないようです。カムとマイクは2つの別個のデバイスです。

C920には、LEDインジケータも組み込まれています。録音中にLEDが点灯しないように制御します。

どうすればそれを達成できますか?

7
LoneWanderer

このソリューションは、以下に示すバージョンでテストされ動作しています。このメソッドを使用すると、RaspberryPi3は常に約5%CPUです。

編集2018-11-18: RaspiVWSプロジェクトホームページ でオールインワンソリューションプロトタイプを見ることができます(好奇心のある人は GitHubプロジェクト を参照してください)

0予備チェック

1。ウェブカメラのビデオ設定

2。マイクの識別

3。 VLCを使用したスト​​リーム

4。 RaspberryPi3 +をWifiアクセスポイントにする(Piを接続する既存のネットワークがない場合)

5。起動時またはサービスとしてのスクリプト

6。 [編集]追加コマンド:無限ループ録画と分割ビデオ

7。 [編集]特定の時点でのプログラムの実行

8。 [編集]トラブルシューティング


0.予備チェック

答えは、Raspbian 9.4 Stretchでの作業です。次のコマンドでバージョンを確認します。

lsb_release -a

見るべき:

No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.4 (stretch)
Release:        9.4
Codename:       stretch

次のツールを使用できます。

  • v4lを使用すると、Webカメラを制御できます。コマンドv4l2-ctlを提供します。これにより、Webカメラを制御および構成できます。
  • ビデオプレーヤーであるだけでなく、強力なストリーミング機能も備えたVLC

次のコマンドでインストールできます:

Sudo apt-get install vlc
Sudo apt-get install v4l-utils

すべてをインストールしたら、C920 Webカメラを構成できます。


1.ウェブカメラのビデオ設定

v4l2-ctl --allは、使用可能なすべてのデバイスとその構成をリストします

pi@raspberrypi:~ $ v4l2-ctl --all
Driver Info (not using libv4l2):
    Driver name   : uvcvideo
    Card type     : HD Pro Webcam C920
    Bus info      : usb-3f980000.usb-1.5
    Driver version: 4.14.30
    Capabilities  : 0x84200001
        Video Capture
        Streaming
        Extended Pix Format
        Device Capabilities
    Device Caps   : 0x04200001
        Video Capture
        Streaming
        Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
    Width/Height      : 1920/1080
    Pixel Format      : 'H264'
    Field             : None
    Bytes per Line    : 3840
    Size Image        : 4147200
    Colorspace        : sRGB
    Transfer Function : Default
    YCbCr/HSV Encoding: Default
    Quantization      : Default
    Flags             : 
Crop Capability Video Capture:
    Bounds      : Left 0, Top 0, Width 1920, Height 1080
    Default     : Left 0, Top 0, Width 1920, Height 1080
    Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080
Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080
Streaming Parameters Video Capture:
    Capabilities     : timeperframe
    Frames per second: 30.000 (30/1)
    Read buffers     : 0
                     brightness (int)    : min=0 max=255 step=1 default=-8193 value=128
                       contrast (int)    : min=0 max=255 step=1 default=57343 value=128
                     saturation (int)    : min=0 max=255 step=1 default=57343 value=128
 white_balance_temperature_auto (bool)   : default=1 value=1
                           gain (int)    : min=0 max=255 step=1 default=57343 value=255
           power_line_frequency (menu)   : min=0 max=2 default=2 value=2
      white_balance_temperature (int)    : min=2000 max=6500 step=1 default=57343 value=4822 flags=inactive
                      sharpness (int)    : min=0 max=255 step=1 default=57343 value=128
         backlight_compensation (int)    : min=0 max=1 step=1 default=57343 value=0
                  exposure_auto (menu)   : min=0 max=3 default=0 value=3
              exposure_absolute (int)    : min=3 max=2047 step=1 default=250 value=333 flags=inactive
         exposure_auto_priority (bool)   : default=0 value=1
                   pan_absolute (int)    : min=-36000 max=36000 step=3600 default=0 value=0
                  tilt_absolute (int)    : min=-36000 max=36000 step=3600 default=0 value=0
                 focus_absolute (int)    : min=0 max=250 step=5 default=8189 value=0 flags=inactive
                     focus_auto (bool)   : default=1 value=1
                  zoom_absolute (int)    : min=100 max=500 step=1 default=57343 value=100
                      led1_mode (menu)   : min=0 max=3 default=3 value=3
                 led1_frequency (int)    : min=0 max=255 step=1 default=0 value=0

最後の2行は、LEDインジケーターを非アクティブにするなど、組み込みのLEDインジケーターを制御するための手がかりを提供します。 -d0パラメーターは、どのデバイスに変更を適用する必要があるかを示します(複数のカムがある場合、またはそのデバイス名が変更されている場合)

v4l2-ctl -d0 --set-ctrl=led1_mode=0
v4l2-ctl -d0 --set-ctrl=led1_frequency=30

2.マイクの識別

コマンドarecord -lは、ALSAデバイスのリストを提供します。 (ALSAはRaspberryPiのオーディオマネージャーです)

pi@raspberrypi:~ $ arecord -l
**** Liste des Périphériques Matériels CAPTURE ****
carte 1: C920 [HD Pro Webcam C920], périphérique 0: USB Audio [USB Audio]
  Sous-périphériques: 1/1
  Sous-périphérique #0: subdevice #0

これは、内蔵マイクがhardware 1, periph 0にあることを意味します。コマンドラインでalsamixer -c 1 -V captureを使用して確認できます

3. VLCを使用したスト​​リーミング

VLCはコマンドラインを使用して起動できます。単一のストリームアクセスでビデオとオーディオが混在しているわけではないため、VLCにそれを依頼する必要があります。 VLCのtranscoding機能の役割です。

  1. HTTPを介したストリーミング

また、HTTPでストリーミングしたいのですが、VLCはそれも実現できます。

cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'

説明

  • v4l2:///dev/video0:chroma=h264はVLC入力データを提供します。/dev/video0からビデオストリームを取得し、h264エンコーディングです(Webカメラが0番目のビデオデバイスである場合、別の番号になる可能性があります。v4l2-ctl --allコマンド)
  • :input-slave=alsa://hw:1,0は、ビデオで別の入力ストリームを取るようVLCに指示します。上記のarecordから識別されるオーディオストリームです
  • --soutは、VLCに出力ストリームの処理方法を指示します
  • #transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}は、4つのRaspberryPi3 +コアすべてを使用して、オーディオをmpgaコーデック、128 kbit/s、2チャンネル、44100 Hzサンプリングに変換するようVLCに指示します。 audiosyncはオプションです。これを実現するのに時間がかかりました。ウェブカメラのh264ビデオストリームは提供されたままです(ビデオトランスコーディングなし)。
  • :standard{access=http,mux=ts,mime=video/ts,dst=:8099}は、TS多重化形式でポート8099でHTTP経由のストリームを提供するようVLCに指示します。

他のデバイスでは、VLCを使用してRaspberryPi3 + VLCストリームにアクセスできます:vlc http://<raspberrypi-ip>:8099

VLCクライアントで動作します:

  • ウィンドウズ
  • ユニックス
  • マック
  • iPhone 7(v11.2.1(15C153))とVLCアプリ(3.0.3(305))で確認済み

NB:Webcamの出力で既にビデオがH264 1920x1080 30fpsになっていると、RaspberryPi3 + CPUを大幅に節約できます。

  1. 異なる容器

また、さまざまなコンテナ、またはコンテナ+ストリームに記録することもできます。以下に例を示します。

  • mKV cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mkv,dst='/home/pi/Webcam_Record/MyVid.mkv'}'に記録する

  • mP4に記録cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/MyVid.mp4'}'

  • レコード+ストリームcvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:duplicate{dst=standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/MyVid.mp4'},dst=standard{access=http,mux=ts,mime=video/ts,dst=:8099}}'

    1. ファイル名、タイムスタンプのフォーマット

ファイル名にフォーマットされた文字列を使用することもできます。次のようなプレフィックスコマンド:

cvlc --sout-file-format v4l2:///dev/video0:<...> dst='/home/pi/Webcam_Record/%F_%T_MyVid.mp4'}

YYYY-MM-DD_HH:MM:SS_MyVid.mp4という名前のファイルが生成されます(:はUNIXファイル名では許可されますが、Windowsファイル名では許可されません)

4. RaspberryPi3 +をWifiアクセスポイントにする

Piを接続する既存のネットワークがない場合:RaspberryPi3 +の公式Webサイトからの指示に従うことができます: https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

それ以外の場合、既にネットワークがあれば、そのIPを使用してpiに接続できます。パート3を参照

他のデバイスでは、VLCを使用してRaspberryPi3 + VLCストリームにアクセスできます:vlc http://<raspberrypi-ip>:8099

5.起動時のスクリプト

多くのコマンドをbashファイルmy_bash_file.shに入れることができます。例えば ​​:

#!/bin/bash
# auto stream launch + led off
#cvlc -vvv for verbose debug

# change this value to adapt to your webcam device number
deviceNb=0

# force video format + led off
v4l2-ctl -d${deviceNb} --set-fmt-video=width=1920,height=1080,pixelformat=1 --set-ctrl=led1_mode=0

# if delay needed 
# cvlc v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0  :live-caching=2500  --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'

# no delay
cvlc v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
  1. 基本的な方法

その後、rc.localスクリプトでカスタムスクリプトを使用して、起動時に実行することができます。 RaspberryPi3 +の公式Webサイトから指示に従うことができます: https://www.raspberrypi.org/documentation/linux/usage/rc-local.md

  1. 別の方法:デーモンサービスを作成する

必要なすべてのbashコマンドが/home/pi/Webcam_Record/vlc_webcam_stream_service.shにあると仮定して、「webcam-stream」サービスを作成します

cd /lib/systemd/system/
Sudo nano webcam-stream.service

そしてそれを書いてください:

[Unit]
Description=Custom Webcam Streaming Service
After=multi-user.target

[Service]
Type=simple
ExecStart=/home/pi/Webcam_Record/vlc_webcam_stream_service.sh
Restart=on-abort

[Install]
WantedBy=multi-user.target

サービスファイルとスクリプトを実行可能にします。

Sudo chmod 644 /lib/systemd/system/webcam-stream.service
chmod +x /home/pi/Webcam_Record/vlc_webcam_stream.sh

VLCをルートとして実行できるようにします。

Sudo sed -i 's/geteuid/getppid/' /usr/bin/vlc

デーモンをリロードして、サービスを有効にします。

Sudo systemctl daemon-reload
Sudo systemctl enable webcam-stream.service

認識され動作していることを確認します。

Sudo service webcam-stream status
Sudo service webcam-stream start

ビデオが正しくストリーミングされていることを別のコンピューターで確認できます。サービスの実行中は、ウェブカメラは利用できません。


完了したら、RaspberryPi3 + wifiアクセスポイントに接続して、ビデオストリームにアクセスできます。


6. [編集]追加コマンド:無限ループ録画とビデオの分割

次のbashスクリプトは、タイムスタンプ付きのファイル名とストリーミングで15秒間の動画を無限に記録できます

#!/bin/bash
# auto stream launch + led off
#cvlc -vvv for verbose debug

# adapt to video device name
deviceNb=1

# loop duration
duration=15

#infinite recording
#loopOption=
loopOption=--loop

# force video format + led off
v4l2-ctl -d ${deviceNb} --set-fmt-video=width=1920,height=1080,pixelformat=1 --set-ctrl=led1_mode=0

# if delay needed :live-caching=2500
cvlc --sout-file-format --run-time=${duration} ${loopOption} v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:duplicate{dst=standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/%F_%T_Spy.mp4'}:dst=standard{access=http,mux=ts,mime=video/ts,dst=:8099}'

7. [編集]特定の瞬間のプログラム実行

編集2018年8月4日

今日14:00に実行を開始するには、次のコマンドを使用できます。

./my_vlc_webcam_script.sh | at 1400

詳細については、atコマンドマニュアルを参照してください。


8.トラブルシューティング

2018年7月7日編集

最近、dist-upgrade後にVLCエラーに遭遇しました。

VLC media player 2.2.6 Umbrella (revision 2.2.6-0-g1aae78981c)
[00acb230] Pulse audio output error: PulseAudio server connection failure: Connection refused

私が見つけた解決策は、VLCをGUIモードで起動し、デフォルトのオーディオデバイスを(自動ではなく)ALSAに変更することです。コマンドラインでもできます。ここにある解決策を参照してください PulseAudioでのVLCの問題

cvlc -A alsa,none --alsa-audio-device default
22
LoneWanderer