GStreamer Video auf Image oder Panel von Lazarus

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6972
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

GStreamer Video auf Image oder Panel von Lazarus

Beitrag von af0815 »

Hat es wer schon geschafft, ein Video (oder Kamerastream) mit GStreamer auf einer Komponente von Lazarus anzuzeigen ?

GStreamer deswegen, weil ich das über alle Plattformen habe (Linux, Win, Raspibian). Weil genaugenommen möchte ich ein Video darstellen, dessen Geschwindigkeit ich stufenlos anpassen kann. Deswegen fällt mir mal V4L(2), mit dem ich die meiste Erfahrung habe, mal aus der Wahl heraus.

Ich habe kein Problem damit den Stream zu öffnen und dann wird auch einem vom GStreamer erzeugten Fenster angezeigt. Das ist zwar schön, aber ich will das in einem Fenster (oder Image, Picture, Panel,...) haben, damit ich das gesamt Layout (sicher) in der Hand habe.

Der Weg den ich aktuell sehe ist, das ich eine Videosink erstellen muss, in die ich den Stream so umforme, das er auf der Komponente meiner Wahl erscheint.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7056
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von Mathias »

Dies ist das einzige was mir das in den Sinn kam, hier wird die gstreamer Ausgabe in einem GTK3 Fenster dargestellt.
Vielleicht hilf dir dies ein wenig weiter.

https://gstreamer.freedesktop.org/docum ... language=c

Der Weg den ich aktuell sehe ist, das ich eine Videosink erstellen muss, in die ich den Stream so umforme, das er auf der Komponente meiner Wahl erscheint.
Dieser sink "appsink", gibt alles als Pixelbuffer aus. Somit musst du noch eine Lösung finden, dies in eine LCL-Komponente zu zaubern.
Was mir da in den Sinn kommt, zB. GLDrawPixels.

Ich habe eine Lösung in C mit ChatGPT generiert, welches den Inhalt der Webcm in einem X11 ximage ausgibt.
Wen du willst, veröffentliche es, einfach so will ich es nicht rein stellen, da ChatGPT nicht so beliebt ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6972
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von af0815 »

Mathias hat geschrieben: So 5. Okt 2025, 14:02 Ich habe eine Lösung in C mit ChatGPT generiert, welches den Inhalt der Webcm in einem X11 ximage ausgibt.
Wen du willst, veröffentliche es, einfach so will ich es nicht rein stellen, da ChatGPT nicht so beliebt ist.
Das mit dem nicht beliebt sein, kann ich nachvollziehen, ich halte nur bedingt etwas von KI.

Ich halte halte mehr von HI (Human Intelligence).
Danke für das Beispiel, ich will es nur in Pascal, und mit nativen LCL Komponeneten, nicht direkt auf die GTK-Elemente :D

Ich versuche mal hinein zu kommen. Die GST-API habe ich bei meinen Versuchen schon erweitert, weil beim FPC fehlt sehr viel was man für Video benötigt und ein Beispiel was mir die Kamera des Laptop in einem extra Fenster anzeigt läuft auch schon. Muss das ganze man sauberer machen, das ich es hier posten kann.

Edit:
In gstlocalcam.zip ist das Projekt, das bei mir die Laptopkamera verwendet
In gst_af.zip ist sind die GStreamer Header die beim FPC dabei sind, mit den bisher von mir gefundenen weiteren Infos.
Dateianhänge
gstlocalcam.zip
(6.91 KiB) 101-mal heruntergeladen
gst_af.zip
(119.42 KiB) 100-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7056
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von Mathias »

Ich versuche mal hinein zu kommen. Die GST-API habe ich bei meinen Versuchen schon erweitert, weil beim FPC fehlt sehr viel was man für Video benötigt
Dies ist mir bekannt, daher habe ich eine eigene Bindung für GST gemacht, das ist so ziemlich alles dabei.
Die Bindung die du meinst ist nur bei fpc trunk dabei, bei der stable fehlt sie. Auch wurde die glib2 spezifischen Makros weggelassen.
Auch die Enums dort sind eine Katastrophe, bei eine or Verknüpfung muss man casten wie ein Weltmeister.
https://github.com/sechshelme/Lazarus-G ... /gstreamer

Die package für die glib2 wird auch noch gebraucht, daher habe ich eine Bindung gemacht, welche fast auf dem neusten Stand ist.
https://github.com/sechshelme/Lazarus-G ... ages/glib2

Und hier habe ich ein Beispiel, welches in den X11 ximage schreibt. Ich denke, dies sollte man abändern können, so da man ein OpenGL Control von der LCL verwenden kann und dann in eine Textur schreiben.
https://github.com/sechshelme/Lazarus-G ... X11_signal
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6972
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von af0815 »

Danke, vor allen sieht das jetzt kompletter aus. Mal sehen ob ich das auf die Reihe bekomme.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6972
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von af0815 »

Mathias hat geschrieben: So 5. Okt 2025, 19:22
Ich versuche mal hinein zu kommen. Die GST-API habe ich bei meinen Versuchen schon erweitert, weil beim FPC fehlt sehr viel was man für Video benötigt
Dies ist mir bekannt, daher habe ich eine eigene Bindung für GST gemacht, das ist so ziemlich alles dabei.
Die Bindung die du meinst ist nur bei fpc trunk dabei, bei der stable fehlt sie. Auch wurde die glib2 spezifischen Makros weggelassen.
Auch die Enums dort sind eine Katastrophe, bei eine or Verknüpfung muss man casten wie ein Weltmeister.
https://github.com/sechshelme/Lazarus-G ... /gstreamer
Ich habe Probleme das erste Beispiel hoch zu bekommen. Laut der Readme.md sollte ich folgende Pakete installieren, aber das geht schief (Linux Mint) Beispiel gstreamer/webcam/10_Konsole
andi@andi-Latitude:~$ sudo apt install libxml2-dev libfreetype6-dev libharfbuzz-dev libgraphene-1.0-dev libcairo2-dev libglib2.0-dev libpango1.0-dev libgdk-pixbuf2.0-dev libgtk-4-dev libwebkit2gtk-6.0-dev libgtksourceview-5-dev gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav libges-1.0-dev libchafa-dev libmicrohttpd-dev
[sudo] Passwort für andi:
Paketlisten werden gelesen… Fertig
Abhängigkeitsbaum wird aufgebaut… Fertig
Statusinformationen werden eingelesen… Fertig
E: Paket libwebkit2gtk-6.0-dev kann nicht gefunden werden.
E: Mittels des Musters »libwebkit2gtk-6.0-dev« konnte kein Paket gefunden werden
Weil in Lazarus gibt es folgenden Fehler.
Compile Project, Target: /home/andi/data/workdir/gstreamer/Mathias/Lazarus-GNOME-GTK4-Packages_and_Examples/Example/GTK4_and_Extensions/gstreamer/webcam/10_-_Konsole/project1: Exit code 1, Errors: 6, Warnings: 5, Hints: 2
Hint: Start of reading config file /home/andi/data/lazdev/main_main/fpc/bin/x86_64-linux/fpc.cfg
Hint: End of reading config file /home/andi/data/lazdev/main_main/fpc/bin/x86_64-linux/fpc.cfg
Verbose: Free Pascal Compiler version 3.3.1-18360-ge1b6a8f192 [2025/08/09] for x86_64
Verbose: Copyright (c) 1993-2025 by Florian Klaempfl and others
Verbose: Target OS: Linux for x86-64
Verbose: Compiling project1.lpr
Verbose: Linking /home/andi/data/workdir/gstreamer/Mathias/Lazarus-GNOME-GTK4-Packages_and_Examples/Example/GTK4_and_Extensions/gstreamer/webcam/10_-_Konsole/project1
Warning: linker: /usr/bin/ld.bfd: /home/andi/data/workdir/gstreamer/Mathias/Lazarus-GNOME-GTK4-Packages_and_Examples/packages/glib2/lib/x86_64-linux/fp_glib2.o: in function `G_TYPE_BOOKMARK_FILE':
glib_types.inc(244,0) Error: linker: undefined reference to `g_bookmark_file_get_type'
Warning: linker: /usr/bin/ld.bfd: /home/andi/data/workdir/gstreamer/Mathias/Lazarus-GNOME-GTK4-Packages_and_Examples/packages/glib2/lib/x86_64-linux/fp_glib2.o: in function `G_TYPE_HMAC':
glib_types.inc(249,0) Error: linker: undefined reference to `g_hmac_get_type'
Warning: linker: /usr/bin/ld.bfd: /home/andi/data/workdir/gstreamer/Mathias/Lazarus-GNOME-GTK4-Packages_and_Examples/packages/glib2/lib/x86_64-linux/fp_glib2.o: in function `G_TYPE_DIR':
glib_types.inc(254,0) Error: linker: undefined reference to `g_dir_get_type'
Warning: linker: /usr/bin/ld.bfd: /home/andi/data/workdir/gstreamer/Mathias/Lazarus-GNOME-GTK4-Packages_and_Examples/packages/glib2/lib/x86_64-linux/fp_glib2.o: in function `G_TYPE_RAND':
glib_types.inc(259,0) Error: linker: undefined reference to `g_rand_get_type'
Warning: linker: /usr/bin/ld.bfd: /home/andi/data/workdir/gstreamer/Mathias/Lazarus-GNOME-GTK4-Packages_and_Examples/packages/glib2/lib/x86_64-linux/fp_glib2.o: in function `G_TYPE_STRV_BUILDER':
glib_types.inc(264,0) Error: linker: undefined reference to `g_strv_builder_get_type'
project1.lpr(26,1) Error: Error while linking
project1.lpr(26,1) Verbose: There were 1 errors compiling module, stopping
Verbose: Compilation aborted
Verbose: /home/andi/data/lazdev/main_main/fpc/bin/x86_64-linux/ppcx64 returned an error exitcode
Edit: Das Paket libwebkit2gtk-6.0-dev gibt es scheinbar nicht für mich. Habe es mal rausgenommen.

Edit2: Die Errors in Lazarus (Lazarus 4.99 (rev main_4_99-2488-g06df910f7f) FPC 3.3.1 x86_64-linux-gtk2) werden auch nicht weniger.

Edit3: Wenn ich die Teile, was Probleme machen auskommentiere läuft das erste Beispiel
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7056
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von Mathias »

Was für eine Linux Mint Version hast du ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6972
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von af0815 »

Mathias hat geschrieben: Mo 6. Okt 2025, 22:18 Was für eine Linux Mint Version hast du ?
Distributor ID: Linuxmint
Description: Linux Mint 21.3
Release: 21.3
Codename: virginia

Linux version 5.15.0-157-generic (buildd@lcy02-amd64-004) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04.2) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6972
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von af0815 »

Habe deine Examples einmal auf Windows probiert auszuführen.

GStreamer von hier: https://gstreamer.freedesktop.org/download/#windows in der MinGW 64 Version.

Allerdings gibt es ein Problem, weil es den Fehler $C0000135 schmeisst. Auf der Commandline gestartet ist gar nichts sichtbar.

Edit:
Bei der MSVC 64-bit Version ist es exakt gleich.

Edit2:
Windows ist und bleibt Windows - Nach einem Neustart des Rechners wird es etwas klarer, es kommt eine bessere Fehlermeldung.
Screenshot 2025-10-07 102045.png
Screenshot 2025-10-07 102045.png (14.37 KiB) 210 mal betrachtet
Ok, damit kann man weiterarbeiten.

Edit3:
Wenn man folgende dlls in das Verzeichnis der Exe kopiert, so geht es einmal Prinzipiell. Das dann die Queue einen Fehler wirft ist klar, weil es auf Windows kein V4L gibt. Aber das ist einmal nicht das Problem.

Code: Alles auswählen

  pipeline := gst_parse_launch('v4l2src name=cam_src ! videoconvert ! videoscale ! video/x-raw,format=RGB ! queue ! videoconvert ! ximagesink name=img_origin', nil);
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 15.09.2025 06:24 31232 ffi-7.dll
-a---- 15.09.2025 06:29 1432064 glib-2.0-0.dll
-a---- 15.09.2025 06:29 25088 gmodule-2.0-0.dll
-a---- 15.09.2025 06:29 346624 gobject-2.0-0.dll
-a---- 15.09.2025 06:36 1376768 gstreamer-1.0-0.dll
-a---- 15.09.2025 06:24 12800 intl-8.dll
-a---- 15.09.2025 06:24 348160 pcre2-8-0.dll
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7056
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von Mathias »

af0815 hat geschrieben: Di 7. Okt 2025, 08:43
Mathias hat geschrieben: Mo 6. Okt 2025, 22:18 Was für eine Linux Mint Version hast du ?
Distributor ID: Linuxmint
Description: Linux Mint 21.3
Release: 21.3
Codename: virginia

Linux version 5.15.0-157-generic (buildd@lcy02-amd64-004) (gcc (Ubuntu 11.4.0-1ubuntu1~22.04.2) 11.4.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025
Dann ist der Fall klar, das du mit Fehlern bombardierst wirst. Meine Bindings sind an 22.x angepasst. Sie sollten auch mit Ubuntu 24.4 LST laufen. Alles was neuer ist sollte auch gehen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6972
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von af0815 »

Unter Windows sollte folgendes gehen
// .\gst-launch-1.0.exe -v dshowvideosrc ! videoconvert ! autovideosink
pipeline := gst_parse_launch('dshowvideosrc ! videoconvert ! autovideosink', nil);
Wobei die auskommentierte Zeile auf der Kommandozeile geht, nur im Pascal geht es nicht. Aber das ist einmal herumsuchen in den Tiefen des Systems.

Das Beispiel lautet komplett einmal (Wie bei Mathias, nur leicht geändert):

Code: Alles auswählen

program project1;

uses
  Crt,
  fp_glib2,
  fp_gst;

var
  pipeline: PGstElement;
  GError:   PGError;

begin
  GError:=nil;
  pipeline:= nil;

  gst_init(@argc, @argv);

  {$ifdef Linux}
  pipeline := gst_parse_launch('v4l2src name=cam_src ! videoconvert ! videoscale ! video/x-raw,format=RGB ! queue ! videoconvert ! ximagesink name=img_origin', nil);
  {$Else}
  // .\gst-launch-1.0.exe -v dshowvideosrc ! videoconvert ! autovideosink
  pipeline := gst_parse_launch('dshowvideosrc ! videoconvert ! autovideosink', @GError);
  {$EndIf}

  if pipeline = nil then begin
    WriteLn('pipeline error');
    if GError<> nil then begin
      Writeln('Error: ' + GError^.message);
      g_error_free(GError);
    end;
  end
  else begin
    gst_element_set_state(pipeline, GST_STATE_PLAYING);
  end;
  repeat
  until KeyPressed;
  gst_object_unref(pipeline);
end.
Und ja, man muss auch hier die Namen der Libs für Windows anpassen, die sind in den beiden Paketen nicht richtig.
Zuletzt geändert von af0815 am Di 7. Okt 2025, 14:17, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7056
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von Mathias »

Habe deine Examples einmal auf Windows probiert auszuführen.
Dies ist bei mir auch so eine Glückssache. Ich beziehe mir die DLLs von fedora-Linux, und je nach Entwickler stand geht es oder es geht nicht.
So viel es mir ist, gibt es für Windows eine setup.exe, welches einem gstramer installiert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 7056
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von Mathias »

Wobei die auskommentierte Zeile auf der Kommandozeile geht, nur im Pascal geht es nicht. Aber das ist einmal herumsuchen in den Tiefen des Systems.
Hast du mal diese Tutorials im Windows probiert, sie sind ein Ebenbild der Original C-Tutorials, welche ich von hier habe: https://gstreamer.freedesktop.org/docum ... language=c


...../Example/GTK4_and_Extensions/gstreamer/Tutorial
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6972
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von af0815 »

Ich habe meinen vorigen Post editiert und dort die Fehlerauswertung hinzugefügt, jetzt bekommt man direkt von GStreamer die Fehlermeldungen.

Code: Alles auswählen

 
var
  GError:   PGError;
 
.... 
  pipeline := gst_parse_launch('dshowvideosrc ! videoconvert ! autovideosink', @GError);
 
  if pipeline = nil then begin
    WriteLn('pipeline error');
    if GError<> nil then begin
      Writeln('Error: ' + GError^.message);
      g_error_free(GError);
    end;
  end
Und siehe da, er findet die dshowvideosrc nicht im Lazarusprogramm. Aber auf der Kommandozeile schon.
Error: no element "dshowvideosrc"
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 7056
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: GStreamer Video auf Image oder Panel von Lazarus

Beitrag von Mathias »

Und siehe da, er findet die dshowvideosrc nicht im Lazarusprogramm. Aber auf der Kommandozeile schon.
Also bei mir geht dies auch auf der Konsole nicht.

Code: Alles auswählen

gst-launch-1.0 -v dshowvideosrc ! videoconvert ! autovideosink
WARNUNG: Fehlerhafte Leitung: Kein Element »dshowvideosrc«
Ist dies etwa Windows vorbehalten ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten