Senden Sie h264-Videos ohne Transcodierung von einer Logitech C920-Kamera



Die Verzögerung betrug nicht mehr als 0,3 Sekunden, da die Kamera an ein schwaches BeagleBone Blue mit einer Prozessorlast von nicht mehr als 30% angeschlossen ist und der Videostream über einen WLAN-Router an einen Laptop übertragen wird.

Zunächst bestand die Aufgabe darin, Videos vom Roboter an einen großen Computer zu senden, ohne den Prozessor auf den Roboter zu laden und ohne Verzögerungen. Beim Googeln von Kameras und Programmen für diese Aufgabe wurde festgestellt, dass sich Kameras mit hardwarebasierter Videokodierung auf der Kamera selbst befinden. Danach wurde die Logitech C920-Kamera gekauft. Und es begannen Tests und Experimente, bei denen zwei Übersetzungsoptionen ohne Transcodierung gefunden wurden.

Alle weiteren Aktionen werden unter Ubuntu 16.04 überprüft, die zweite Option funktioniert wahrscheinlich unter Windows

Übertragen Sie hardwarecodiertes Video von einer Logitech C920-Kamera über cvlc und v4l2


clvc - Server sendet Video über vlc über die Befehlszeile.

Hardware, die einen Videostream codiert


Stellen Sie die Pixelformatkameras auf H264 ein

v4l2-ctl --device=/dev/video1 --set-fmt-video=width=800,height=600,pixelformat=1 

Testen Sie H264 mit vlc, damit die Einstellungen nicht zurückgesetzt werden:

 cvlc v4l2:///dev/video1 --demux h264 

Wenn Sie dies versuchen, setzt vlc die Einstellungen vor dem Spielen zurück:

 cvlc v4l2:///dev/video1:chroma=h264 

Die Wiedergabe funktioniert. Wir bekommen den H264-Stream von der Kamera. Lassen Sie uns nun über HTTP über das Netzwerk gehen:

 cvlc v4l2:///dev/video1:chroma=h264:width=800:height=600 --sout '#standard{access=http,mux=ts,dst=localhost:8080,name=stream,mime=video/ts}' -vvv 

(Im Netzwerk müssen Sie anstelle von localhost die IP-Adresse Ihres lokalen Geräts verwenden.)

Empfängerstart:

 mplayer http://localhost:8080/ 

Es stellt sich heraus, dass MPEG-TS es mplayer ermöglicht, jederzeit mit einer leichten Verzögerung eine Verbindung zum Stream herzustellen (wahrscheinlich auf einen Keyframe oder etw warten).

Wenn Sie mux = avi, mime = video / avi verwenden, müssen Sie mplayer ausführen, sobald Sie vlc starten. Andernfalls wird mplayer nicht abgespielt.

Ffmpeg-Fehler


  • Wenn Sie versuchen, ffmpeg anstelle von vlc zu spielen, werden Sie wahrscheinlich auf dieses Problem stoßen : ffmpeg.org/trac/ffmpeg/ticket/1387
  • Sobald Sie ffmpeg ausführen, wird zu "Video: rawvideo (YUY2 / 0x32595559)" gewechselt.
  • Während es MJPEG akzeptiert, funktioniert es nicht mit H.264
  • Dasselbe passiert bei Verwendung von qv4l2: Wenn Sie die Aufnahme im H264-Modus starten, erhalten Sie tatsächlich das YUY2-Videofenster

Hardware-decodiertes Video abspielen


Mplayer kann Framebuffer spielen, stellen Sie sicher, dass X nicht funktioniert, und geben Sie Folgendes ein:

 mplayer http://192.168.1.100:8080/ -fs -framedrop -vo fbdev 

Sie können auch im X-Fenster spielen, wenn Sie möchten: Führen Sie X über die Befehlszeile aus:

 Xorg -retro &> /dev/zero 

Es gibt Unmengen von fbdev-Fehlermeldungen, die wir stillschweigend in / dev / zero ablegen

Spielen Sie einen Videostream von einer LAN-VLC-Quelle ab (siehe Abschnitt oben):

 DISPLAY=":0" mplayer http://192.168.1.100:8080/ -fs -framedrop 

  • Wenn wir dies tun, werden wir feststellen, dass wir noch kein Xvideo oder eine Hardwarebeschleunigung verwenden
  • linux-sunxi.org/CedarX scheint uns eine VPU-Bibliothek zur Verfügung zu stellen, was leider eine unsichere Sache von Allwinner ist
  • Aber es gibt einen gehackten VLC, der es verwenden kann: linux-sunxi.org/VLC
  • Erfolgreich kompiliert

Himbeer pi


Falls Sie Artefakte im Bild und Streams von Raspberry Pi bemerken, verwenden Sie:

 cvlc v4l2:///dev/video0:chroma=h264 ... 

Möglicherweise müssen Sie die Firmware aktualisieren:

 apt-get install rpi-update raspi-config rpi-update reboot 

Broadcast-Zusammenfassung über cvlc und v4l2


Tests haben gezeigt, dass die Prozessorlast auf Beaglebone Blue nicht mehr als 30% beträgt, was für einen schwachen Prozessor sehr gut ist, aber es ist nicht klar, wie dieses Video dann in ROS verschoben werden soll.

Wenn die WLAN-Bandbreite nicht ausreicht, steigt die Videoverzögerung stark an. Theoretisch kann dies durch Umschalten von tcp auf udp gelöst werden. In der cvlc-Dokumentation wird die Möglichkeit der Übertragung über udp erwähnt.

Übertragen Sie hardwarecodiertes Video von einer Logitech C920-Kamera über Gstreamer


Ursprünglicher Entwicklerartikel, der diese Methode in Gstreamer unterstützt.
Installieren Sie gstreamer unter Ubuntu 16.04

 sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools sudo apt-get install libgstreamer-plugins-base1.0-dev 

Mit der Quelle uvch264src können Sie:


  • Erfassen Sie gleichzeitig einen h264-Hardware-codierten Videostream und einen Crawler-Videostream.
  • Konfigurieren Sie die Hardware-Videokodierung (Bitrate, Keyframes und mehr).

Die sekundäre Sucherquelle ist ein interessantes Konzept. Zusätzlich zum H.264-Hauptstrom erhalten Sie einen Sekundärstrom mit niedriger Auflösung im MJPG- oder YUV-Format. Ich bin nicht sicher, ob dies eine Funktion der Gstreamer-Kamera, des Treibers oder des Quellblocks ist, aber ich hoffe, dass dies für unsere Beaglebone-Kameras nützlich ist, vorausgesetzt, die Funktion verwendet keinen zu großen Prozessor, um zwischen RAW und JPG zu konvertieren.

Das folgende Beispiel zeigt eine Pipeline, die einen hochauflösenden H.264-Stream und einen Sucher-Stream anzeigt:

 gst-launch-1.0 -v -e uvch264src device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

Der primäre H.264-Stream wird mit dem Block avdec_h264 dekodiert, auf den über das Paket gst-libav zugegriffen werden kann ( siehe Hinweise im oz9aec-Wiki) . Das Sucherfeld kann mit dem Fakelink verbunden werden, wenn es nicht benötigt wird, aber ich glaube nicht, dass es deaktiviert werden kann (Sie können es trotzdem deaktivieren). Zumindest ist dies der Eindruck, dass ich den originalen KaKaRoTo-Blogbeitrag lese .

Sie werden wahrscheinlich überlastet sein, wenn Sie eine große Anzahl von Parametern sehen, die für diesen Quellblock konfiguriert werden können:

 gst-inspect-1.0 uvch264src 

Uvch264src-Parameterliste
Fabrikdetails:
Rang keine (0)
Langname UVC H264 Quelle
Klass Quelle / Video
Beschreibung UVC H264 Codierungskameraquelle
Autor Youness Alaoui <youness.alaoui@collabora.co.uk>

Plugin Details:
Nennen Sie uvch264
Beschreibung UVC-konformes Plugin für H264-Codierungskameras
Dateiname /usr/lib/x86_64-linux-gnu/gstreamer-1.0/libgstuvch264.so
Version 1.8.3
Lizenz LGPL
Quellmodul gst-plugins-bad
Erscheinungsdatum der Quelle 19.08.2016
Binärpaket GStreamer Bad Plugins (Ubuntu)
Ursprungs-URL launchpad.net/distros/ubuntu/+source/gst-plugins-bad1.0

GObject
+ ---- Ursprünglich nicht bekannt
+ ---- GstObject
+ ---- GstElement
+ ---- GstBin
+ ---- GstBaseCameraSrc
+ ---- GstUvcH264Src

Implementierte Schnittstellen:
Gstchildproxy

Pad-Vorlagen:
SRC-Vorlage: 'vidsrc'
Verfügbarkeit: Immer
Fähigkeiten:
Video / X-Raw
Format: {I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV21 , NV61, NV24, GREY8, GREY16_BE, GREY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_1041010 , GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE}
Breite: [1, 2147483647]
Höhe: [1, 2147483647]
Framerate: [0/1, 2147483647/1]
Bild / JPEG
Breite: [1, 2147483647]
Höhe: [1, 2147483647]
Framerate: [0/1, 2147483647/1]
Video / x-h264
Breite: [1, 2147483647]
Höhe: [1, 2147483647]
Framerate: [0/1, 2147483647/1]
Stream-Format: {Byte-Stream, AVC}
Ausrichtung: au
Profil: {hoch, Haupt, Grundlinie, eingeschränkte Grundlinie}

SRC-Vorlage: 'imgsrc'
Verfügbarkeit: Immer
Fähigkeiten:
LEER

SRC-Vorlage: 'vfsrc'
Verfügbarkeit: Immer
Fähigkeiten:
Video / X-Raw
Format: {I420, YV12, YUY2, UYVY, AYUV, RGBx, BGRx, xRGB, xBGR, RGBA, BGRA, ARGB, ABGR, RGB, BGR, Y41B, Y42B, YVYU, Y444, v210, v216, NV12, NV21, NV21 , NV61, NV24, GREY8, GREY16_BE, GREY16_LE, v308, RGB16, BGR16, RGB15, BGR15, UYVP, A420, RGB8P, YUV9, YVU9, IYU1, ARGB64, AYUV64, r210, I420_1041010 , GBR, GBR_10LE, GBR_10BE, NV12_64Z32, A420_10LE, A420_10BE, A422_10LE, A422_10BE, A444_10LE, A444_10BE}
Breite: [1, 2147483647]
Höhe: [1, 2147483647]
Framerate: [0/1, 2147483647/1]
Bild / JPEG
Breite: [1, 2147483647]
Höhe: [1, 2147483647]
Framerate: [0/1, 2147483647/1]

Elementflaggen:
Keine Flags gesetzt

Bin Flags:
Keine Flags gesetzt

Elementimplementierung:
Hat die Funktion change_state (): 0x7ff438f22ba0

Element verfügt über keine Taktfunktionen.
Element verfügt über keine URI-Verarbeitungsfunktionen.

Pads:
Src: 'vfsrc'
Src: 'imgsrc'
SRC: 'vidsrc'

Elementeigenschaften:
name: Der Name des Objekts
Flags: lesen, schreiben
String Standard: "uvch264src0"
parent: Das übergeordnete Objekt des Objekts
Flags: lesen, schreiben
Objekt vom Typ "GstObject"
Async-Behandlung: Der Bin verarbeitet asynchrone Statusänderungen
Flags: lesen, schreiben
Boolescher Wert. Standard: false
Nachrichtenweiterleitung: Leitet alle untergeordneten Nachrichten weiter
Flags: lesen, schreiben
Boolescher Wert. Standard: false
Modus: Der Aufnahmemodus (Standbildaufnahme oder Videoaufnahme)
Flags: lesen, schreiben
Enum "GstCameraBin2Mode" Standard: 2, "mode-video"
(1): Modusbild - Standbildaufnahme (Standard)
(2): Modus-Video - Videoaufnahme
Zoom: Digitaler Zoomfaktor (zB 1,5 bedeutet 1,5x)
Flags: lesen, schreiben
Float. Bereich: 1 - 3.402823e + 38 Standard: 1
Max-Zoom: Digitaler Zoomfaktor (zB 1,5 bedeutet 1,5x)
Flags: lesbar
Float. Bereich: 1 - 3.402823e + 38 Standard: 10
Bereit zur Erfassung: Informiert, dass dieses Element zum Starten einer weiteren Erfassung bereit ist
Flags: lesbar
Boolescher Wert. Standard: true
Post-Previews: Wenn Vorschaubilder für die Aufnahme in den Bus gestellt werden sollen
Flags: lesen, schreiben
Boolescher Wert. Standard: true
Vorschau-Caps: Die Caps des Vorschau-Bildes, das veröffentlicht werden soll (NULL bedeutet ANY)
Flags: lesen, schreiben
JEDER

Vorschau-Filter: Ein benutzerdefinierter Vorschau-Filter zum Verarbeiten von Vorschaubilddaten
Flags: lesen, schreiben
Objekt vom Typ "GstElement"
Autostart: Startet die Erfassung automatisch, wenn der Status PAUSED aktiviert wird
Flags: lesen, schreiben
Boolescher Wert. Standard: false
Farbraumname: Der Name des Farbraumelements
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
String Standard: "Videokonvertierung"
JPEG-Decoder-Name: Der Name des JPEG-Decoder-Elements
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
String Standard: "jpegdec"
num-clock-samples: Anzahl der für die PTS-Synchronisation zu sammelnden Clock-Samples (-1 = unbegrenzt)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: 0 - 2147483647 Standard: 0
Anzahl Puffer: Anzahl der Puffer, die vor dem Senden der EOS ausgegeben werden sollen (-1 = unbegrenzt)
Flags: lesen, schreiben
Ganzzahl Bereich: -1 - 2147483647 Standard: -1
Gerät: Gerätestandort
Flags: lesen, schreiben
String Standard: "/ dev / video0"
Gerätename: Name des Geräts
Flags: lesbar
String Standard: ""
Anfangsbitrate: Anfangsbitrate in Bit / Sekunde (statische Steuerung)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Ganzzahl ohne Vorzeichen. Bereich: 0 - 4294967295 Standard: 3.000.000
Slice-Einheiten: Slice-Einheiten (statische Kontrolle)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Ganzzahl ohne Vorzeichen. Bereich: 0 - 65535 Standard: 4
Slice-Modus: Definiert die Einheit der Slice-Units-Eigenschaft (statische Steuerung)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Enum "UvcH264SliceMode" Standard: 3, "Slice / Frame"
(0): ignoriert - ignoriert
(1): Bits / Slice - Bits pro Slice
(2): MBs / Slice - MBs pro Slice
(3): Slice / Frame - Slice Per Frame
Iframe-Periode: Zeit zwischen IDR-Frames in Millisekunden (statische Kontrolle)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Ganzzahl ohne Vorzeichen. Bereich: 0 - 65535 Standard: 10000
Verwendungsart: Die Verwendungsart (statische Kontrolle)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Enum "UvcH264UsageType" Standard: 1, "Echtzeit"
(1): Echtzeit - Echtzeit (Videokonferenzen)
(2): Rundfunk - Rundfunk
(3): Lagerung - Lagerung
(4): ucconfig0 - UCConfig 0
(5): ucconfig1 - UCConfig 1
(6): ucconfig2q - UCConfig 2Q
(7): ucconfig2s - UCConfig 2S
(8): ucconfig3 - UCConfig 3
Entropie: Entropie (statische Kontrolle)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Enum "UvcH264Entropy" Standard: 0, "cavlc"
(0): cavlc - CAVLC
(1): cabac - CABAC
enable-sei: SEI-Bild-Timing aktivieren (statische Steuerung)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Boolescher Wert. Standard: false
num-reorder-frame: Anzahl der B-Frames zwischen den Referenzframes (statische Kontrolle)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Ganzzahl ohne Vorzeichen. Bereich: 0 - 255 Standard: 0
Vorschau gespiegelt: Horizontal gespiegeltes Bild für Nicht-H.264-Streams (statische Kontrolle)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Boolescher Wert. Standard: false
Leaky-Bucket-Größe: Größe der Leaky-Bucket-Größe in Millisekunden (statische Kontrolle)
Flags: Lesen, Schreiben, kann nur NULL oder BEREIT sein
Ganzzahl ohne Vorzeichen. Bereich: 0 - 65535 Standard: 1000
Ratensteuerung: Ratensteuerungsmodus (statische und dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Enum "UvcH264RateControl" Standard: 1, "cbr"
(1): cbr - Konstante Bitrate
(2): vbr - Variable Bitrate
(3): qp - Konstante QP
Feste Framerate: Feste Framerate (statische und dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Boolescher Wert. Standard: false
max-mbps: Die Anzahl der Makroblöcke pro Sekunde für die maximale Verarbeitungsrate
Flags: lesbar
Ganzzahl ohne Vorzeichen. Bereich: 0 - 4294967295 Standard: 0
level-idc: Level IDC (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl ohne Vorzeichen. Bereich: 0 - 255 Standard: 40
Spitzenbitrate: Die Spitzenbitrate in Bit / Sekunde (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl ohne Vorzeichen. Bereich: 0 - 4294967295 Standard: 3.000.000
durchschnittliche Bitrate: Die durchschnittliche Bitrate in Bit / Sekunde (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl ohne Vorzeichen. Bereich: 0 - 4294967295 Standard: 3.000.000
min-iframe-qp: Die minimale Quantisierungsschrittgröße für I-Frames (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: -127 - 127 Standard: 10
max-iframe-qp: Die minimale Quantisierungsschrittgröße für I-Frames (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: -127 - 127 Standard: 46
min-pframe-qp: Die minimale Quantisierungsschrittgröße für P-Frames (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: -127 - 127 Standard: 10
max-pframe-qp: Die minimale Quantisierungsschrittgröße für P-Frames (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: -127 - 127 Standard: 46
min-bframe-qp: Die minimale Quantisierungsschrittgröße für B-Frames (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: -127 - 127 Standard: 10
max-bframe-qp: Die minimale Quantisierungsschrittgröße für B-Frames (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: -127 - 127 Standard: 46
ltr-buffer-size: Gesamtzahl der Langzeitreferenzrahmen (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: 0 - 255 Standard: 0
ltr-Encoder-Steuerung: Anzahl der LTR-Frames, die das Gerät steuern kann (dynamische Steuerung)
Flags: Lesen, Schreiben, kann NULL, READY, PAUSED oder PLAYING sein
Ganzzahl Bereich: 0 - 255 Standard: 0

Elementaktionen:
"Get-enum-settings": gboolean user_function (GstElement * -Objekt,
gchararray arg0,
gpointer arg1,
gpointer arg2);
"Get-Boolean-Einstellung": gboolean user_function (GstElement * -Objekt,
gchararray arg0,
gpointer arg1,
gpointer arg2);
"Get-int-settings": gboolean user_function (GstElement * -Objekt,
gchararray arg0,
gpointer arg1,
gpointer arg2,
gpointer arg3);
"Start-Capture": void user_function (GstElement * -Objekt);
"Stop-Capture": void user_function (GstElement * -Objekt);

Viele dieser Parameter können zum Konfigurieren von Parametern bei der H.264-Komprimierung verwendet werden. Ich finde das ziemlich überraschend, da die Komprimierung durch den Chip in der Kamera erfolgt. Im folgenden Beispiel wird die Standarddatenrate von 3 auf 5 Mbit / s erhöht und das Standard-Keyframe-Intervall von 10 auf 3 Sekunden verringert:

 gst-launch-1.0 -v -e uvch264src initial-bitrate=5000000 average-bitrate=5000000 iframe-period=3000 device=/dev/video0 name=src auto-start=true src.vfsrc ! queue ! video/x-raw,format=YUY2,width=320,height=240,framerate=10/1 ! xvimagesink sync=false src.vidsrc ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

Andererseits gibt es keine Parameter zum Anpassen der üblichen Parameter der Webcam, wie z. B. Kontrast, Helligkeit, Fokus usw. Um sie zu konfigurieren, benötigen wir daher noch externe Tools wie v4l2.ctl oder die in nächster Abschnitt.

v4l2src


Es sieht so aus, als könnten wir auch das gute alte v4l2src verwenden, um H.264-codierte Streams vom Logitech C920 zu erfassen:

 gst-launch-1.0 -v -e v4l2src device=/dev/video1 ! queue ! video/x-h264,width=1280,height=720,framerate=30/1 ! h264parse ! avdec_h264 ! xvimagesink sync=false 

Dies ist wahrscheinlich auf die Entwicklung von gstreamer und V4L2 zurückzuführen. Diese Option sieht einfacher aus, wenn Sie die H.264-Komprimierungseinstellungen nicht ändern müssen. Dadurch erhalten wir Zugriff auf Kameraeinstellungen wie Helligkeit und Kontrast. Es hat auch den Vorteil, dass es sich in einem guten Plugin-Paket befindet, das in Zukunft möglicherweise besser aufbewahrt wird.

Webcasting über Gstreamer


Starten Sie auf dem empfangenden Computer den Empfänger:

 gst-launch-1.0 -v udpsrc port=6666 ! application/x-rtp, encoding-name=H264 ! rtph264depay ! h264parse ! avdec_h264 ! videoconvert ! autovideosink 

Auf einem Gerät mit einer Kamera starten wir die Übertragung von hardwarecodiertem Video:

 gst-launch-1.0 uvch264src name=src auto-start=true src.vidsrc ! video/x-h264,width=160,height=120,framerate=30/1 ! h264parse ! rtph264pay ! udpsink host=192.168.1.196 port=6666 

Besonderer Dank geht an Amomum, die mir beim Schreiben dieses Codes geholfen hat.

Zusammenfassung der Verzögerung der Videoübertragung über Gstreamer


Selbst mit einer Auflösung von 1920 * 1080 überschritt die Prozessorlast von Beaglebone Blue 30% nicht und die Videoverzögerung betrug nicht mehr als 0,3 Sekunden. Ja, da das Video in dieser Version über udp gesendet wurde, fällt das Bild bei Verlust von Paketen zum nächsten Schlüsselbild auseinander, aber wir können es so konfigurieren, dass Schlüsselbilder häufiger gesendet werden.

ROS-Aufgaben


Es bleibt nur noch, das empfangene Video in ROS zu pushen, wenn jemand dabei helfen kann, schreiben Sie in einem persönlichen.

Source: https://habr.com/ru/post/de415567/


All Articles