RaspberryPiとLogitech C920 Webcamがあります。私はこれらのデバイスを監視/ベビーカメラとして使用したいと思います:CPUを集中的に使用するビデオトランスコーディングなしで(+ = --- ==)Stream audio + video over HTTP(または他のプロトコル)
C920ウェブカメラはネイティブにH264をストリーミングできるため、理論的にはRaspberyPi + VLCにビデオストリームのトランスコードを依頼する必要はありません。
組み込みのC920マイクストリームは、Webカメラストリームに含まれていないようです。カムとマイクは2つの別個のデバイスです。
C920には、LEDインジケータも組み込まれています。録音中にLEDが点灯しないように制御します。
どうすればそれを達成できますか?
このソリューションは、以下に示すバージョンでテストされ動作しています。このメソッドを使用すると、RaspberryPi3は常に約5%CPUです。
編集2018-11-18: RaspiVWSプロジェクトホームページ でオールインワンソリューションプロトタイプを見ることができます(好奇心のある人は GitHubプロジェクト を参照してください)
0予備チェック
1。ウェブカメラのビデオ設定
2。マイクの識別
3。 VLCを使用したストリーム
4。 RaspberryPi3 +をWifiアクセスポイントにする(Piを接続する既存のネットワークがない場合)
5。起動時またはサービスとしてのスクリプト
6。 [編集]追加コマンド:無限ループ録画と分割ビデオ
7。 [編集]特定の時点でのプログラムの実行
8。 [編集]トラブルシューティング
答えは、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
次のツールを使用できます。
v4l2-ctl
を提供します。これにより、Webカメラを制御および構成できます。次のコマンドでインストールできます:
Sudo apt-get install vlc
Sudo apt-get install v4l-utils
すべてをインストールしたら、C920 Webカメラを構成できます。
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
コマンド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
を使用して確認できます
VLCはコマンドラインを使用して起動できます。単一のストリームアクセスでビデオとオーディオが混在しているわけではないため、VLCにそれを依頼する必要があります。 VLCのtranscoding
機能の役割です。
また、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クライアントで動作します:
NB:Webcamの出力で既にビデオがH264 1920x1080 30fpsになっていると、RaspberryPi3 + CPUを大幅に節約できます。
また、さまざまなコンテナ、またはコンテナ+ストリームに記録することもできます。以下に例を示します。
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}}'
ファイル名にフォーマットされた文字列を使用することもできます。次のようなプレフィックスコマンド:
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ファイル名では許可されません)
Piを接続する既存のネットワークがない場合:RaspberryPi3 +の公式Webサイトからの指示に従うことができます: https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
それ以外の場合、既にネットワークがあれば、そのIPを使用してpiに接続できます。パート3を参照
他のデバイスでは、VLCを使用してRaspberryPi3 + VLCストリームにアクセスできます:
vlc http://<raspberrypi-ip>:8099
多くのコマンドを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}'
その後、rc.local
スクリプトでカスタムスクリプトを使用して、起動時に実行することができます。 RaspberryPi3 +の公式Webサイトから指示に従うことができます: https://www.raspberrypi.org/documentation/linux/usage/rc-local.md
必要なすべての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アクセスポイントに接続して、ビデオストリームにアクセスできます。
次の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}'
編集2018年8月4日
今日14:00に実行を開始するには、次のコマンドを使用できます。
./my_vlc_webcam_script.sh | at 1400
詳細については、at
コマンドマニュアルを参照してください。
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