it-swarm.com.de

Raspberry Pi: Verwenden Sie VLC zum Streamen der Webcam: Logitech C920 [H264-Video ohne Transcodierung + Audio + LED-Steuerung] - SpyCam / BabyCam

Ich habe ein RaspberryPi und eine Logitech C920 Webcam. Ich möchte diese Geräte verwenden, um als Überwachungs-/Babycam zu arbeiten, d. H.: Streamen von Audio + Video über HTTP (oder ein anderes Protokoll) ohne CPU-intensive Videotranscodierung

Die C920-Webcam kann H264 nativ streamen, sodass ich theoretisch nicht RaspberyPi + VLC bitten muss, den Videostream zu transkodieren.

Der Stream des integrierten C920-Mikrofons scheint nicht im Webcam-Stream enthalten zu sein. Kamera und Mikrofon sind zwei separate Geräte.

Das C920 hat auch eine eingebaute LED-Anzeige. Ich möchte das kontrollieren, um zu vermeiden, dass die LED während der Aufnahme aufleuchtet.

Wie kann ich das erreichen?

7
LoneWanderer

Diese Lösung wurde getestet und funktioniert mit den unten angegebenen Versionen. Mit dieser Methode ist der RaspberryPi3 immer rund 5% CPU.

edit 18.11.2018: Den All-in-One-Lösungsprototyp kann man auch auf RaspiVWS-Projekthomepage sehen (für Neugierige siehe GitHub-Projekt )

0. Vorabkontrollen

1. Webcam-Videokonfiguration

2. Mikrofonidentifikation

3. Stream mit VLC

4. Machen Sie RaspberryPi3 + zu einem Wifi Access Point (Wenn Sie kein Netzwerk haben, mit dem Sie Ihren Pi verbinden können)

5. Skript beim Start oder als Dienst

6. [EDIT] Zusätzliche Befehle: Endlosschleifen-Aufnahme & Video teilen

7. [EDIT] Programmausführung zu einem bestimmten Zeitpunkt

8. [EDIT] FEHLERSUCHE


0. Vorabkontrollen

Die Antwort funktioniert mit Raspbian 9.4 Stretch. Überprüfen Sie Ihre Version mit dem folgenden Befehl:

lsb_release -a

Das solltest du sehen:

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

Wir können uns auf folgende Tools verlassen:

  • mit v4l können Sie die Webcam steuern. Es bietet den Befehl v4l2-ctl, Mit dem wir die Webcam steuern und konfigurieren können.
  • VLC ist nicht nur ein Videoplayer, sondern verfügt auch über leistungsstarke Streaming-Funktionen

Sie können sie mit den folgenden Befehlen installieren:

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

Sobald alles installiert ist, können Sie Ihre C920-Webcam konfigurieren.


1. Webcam-Videokonfiguration

v4l2-ctl --all Listet alle verfügbaren Geräte und deren Konfiguration auf

[email protected]:~ $ 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

Die letzten beiden Zeilen geben uns Hinweise zur Steuerung der eingebauten LED-Anzeige, beispielsweise zum Deaktivieren der LED-Anzeige. Der Parameter -d0 Gibt an, auf welchem ​​Gerät die Änderung angewendet werden soll (wenn Sie mehrere Kameras haben oder deren Gerätename geändert wurde).

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

2. Identifizierung des Mikrofons

Der Befehl arecord -l Gibt uns die Liste der ALSA-Geräte. (ALSA ist der Audio-Manager in RaspberryPi)

[email protected]:~ $ 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

Dies bedeutet, dass sich das eingebaute Mikrofon auf hardware 1, periph 0 Befindet. Sie können dies in der Befehlszeile mit alsamixer -c 1 -V capture Überprüfen.

3. Streamen Sie mit VLC

VLC kann über die Befehlszeile gestartet werden. Da wir nicht bereits Video und Audio in einem einzigen Stream-Zugriff gemischt haben, müssen wir VLC bitten, dies zu tun. Dies ist die Rolle der Funktion transcoding von VLC.

  1. Stream über HTTP

Wir wollen auch über HTTP streamen, das kann auch 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}'

Erläuterung

  • v4l2:///dev/video0:chroma=h264 Gibt VLC-Eingabedaten an: Es wird der Videostream von/dev/video0 abgerufen und es handelt sich um eine h264-Codierung (wenn Ihre Webcam das 0. Videogerät ist, kann es sich auch um eine andere Zahl handeln, siehe v4l2-ctl --all Befehl)
  • :input-slave=alsa://hw:1,0 Weist VLC an, einen weiteren Eingabestream mit dem Video aufzunehmen. Dies ist der Audio-Stream, der aus dem obigen arecord hervorgeht
  • --sout Teilt VLC mit, wie mit dem Ausgabestream umgegangen werden soll
  • #transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1} Weist VLC an, die Audiodaten mit allen 4 RaspberryPi3 + -Kernen in den Codec mpga, 128 kbit/s, 2 Kanäle, 44100 Hz, zu konvertieren. Audiosync ist optional. Ich habe einige Zeit gebraucht, um dies zu realisieren: Der h264-Videostream der Webcam wird wie vorgesehen beibehalten (keine Videotranscodierung).
  • :standard{access=http,mux=ts,mime=video/ts,dst=:8099} Weist VLC an, Streams über HTTP an Port 8099 im TS-Muxing-Format bereitzustellen.

Auf jedem anderen Gerät können Sie mit VLC auf Ihren RaspberryPi3 + VLC-Stream zugreifen: vlc http://<raspberrypi-ip>:8099

Es funktioniert mit jedem VLC-Client:

  • fenster
  • unix
  • mac
  • bestätigt mit iPhone 7 (v11.2.1 (15C153)) mit VLC App (3.0.3 (305))

NB: Wenn das Video bereits in H264 1920x1080 30fps in der Ausgabe der Webcam gespeichert ist, wird viel RaspberryPi3 + -CPU gespart.

  1. Verschiedene Behälter

Sie können auch in verschiedene Container aufnehmen, oder sogar Container + Stream. Hier einige Beispiele:

  • aufnahme in 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'}'

  • auf MP4 aufnehmen 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'}'

  • record + stream 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. Formatieren Sie Dateinamen, Zeitstempel

Sie können auch eine formatierte Zeichenfolge für Dateinamen verwenden. Präfix-Befehl wie folgt:

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

Es wird eine Datei mit dem Namen YYYY-MM-DD_HH:MM:SS_MyVid.mp4 Erstellt (: Sind in Unix-Dateinamen, jedoch nicht in Windows-Dateinamen zulässig).

4. Machen Sie RaspberryPi3 + zu einem Wifi Access Point

Wenn Sie kein Netzwerk haben, mit dem Sie Ihren Pi verbinden können: Sie können den Anweisungen auf der offiziellen RaspberryPi3 + -Website folgen: https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

Andernfalls können Sie, wenn Sie bereits ein Netzwerk haben, eine Verbindung zu Ihrem Pi über dessen IP-Adresse herstellen. Siehe Teil 3

Auf jedem anderen Gerät können Sie mit VLC auf Ihren RaspberryPi3 + VLC-Stream zugreifen: vlc http://<raspberrypi-ip>:8099

5. Skript beim Start

Sie können viele Befehle in eine Bash-Datei einfügen my_bash_file.sh. Zum Beispiel :

#!/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. Grundlegende Methode

Sie können dann festlegen, dass das Skript rc.local Ihr benutzerdefiniertes Skript verwendet, das beim Start ausgeführt wird. Sie können den Anweisungen auf der offiziellen RaspberryPi3 + -Website folgen: https://www.raspberrypi.org/documentation/linux/usage/rc-local.md

  1. Eine andere Methode: Erstellen Sie einen Deamon-Service

Wir werden einen "Webcam-Stream" -Dienst erstellen, vorausgesetzt, alle erforderlichen Bash-Befehle befinden sich in /home/pi/Webcam_Record/vlc_webcam_stream_service.sh

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

Und schreibe hinein:

[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

Machen Sie die Service-Datei und das Skript ausführbar:

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

Ermöglichen, dass VLC als root ausgeführt wird:

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

Laden Sie Deamons neu und aktivieren Sie unseren Service:

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

Überprüfen Sie, ob es erkannt wird und funktioniert:

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

Sie können mit einem anderen Computer überprüfen, ob das Video korrekt gestreamt wird. Beachten Sie, dass die Webcam nicht verfügbar ist, während der Dienst ausgeführt wird.


Sobald Sie fertig sind, können Sie eine Verbindung zum RaspberryPi3 + WLAN-Zugangspunkt herstellen und auf Ihren Videostream zugreifen.


6. [EDIT] Zusätzliche Befehle: Endlosschleifen-Aufnahme & Video teilen

Die folgenden Bash-Skripte ermöglichen die unendliche Aufzeichnung von 15 Sekunden langen Videos mit zeitgestempelten Dateinamen und Streaming

#!/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. [EDIT] Programmausführung zu einem bestimmten Zeitpunkt

EDIT 04 aug 2018

Um die Ausführung heute um 14:00 Uhr zu starten, können Sie den folgenden Befehl verwenden:

./my_vlc_webcam_script.sh | at 1400

Weitere Informationen finden Sie im Befehlshandbuch für at.


8. FEHLERSUCHE

EDIT 07 jul 2018

Ich bin kürzlich nach einem dist-upgrade auf einen VLC-Fehler gestoßen:

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

Die Lösung, die ich gefunden habe, besteht darin, VLC im GUI-Modus zu starten und das Standard-Audiogerät in ALSA zu ändern (anstelle von Automatisch). Ich kann auch in der Kommandozeile gemacht werden. Sehen Sie sich die hier gefundene Lösung an VLC-Probleme mit PulseAudio

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