Audio-Schnittstelle gesucht. ( gstreamer )

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Mathias
Beiträge: 6956
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Audio-Schnittstelle gesucht.

Beitrag von Mathias »

Mathias hat geschrieben: So 28. Jul 2024, 09:09
af0815 hat geschrieben: Fr 26. Jul 2024, 21:13 gstreamer fällt mir dazu ein.
Noch besser, die Header sind bei Lazarus schon dabei . 👍
Ich vermute das es aber sehr veraltet ist, wie es bei anderen Headern auch der Fall ist.
Wie ich vermutet habe, bei Lazarus ist ein Museumstück dabei.
Es fehlen einige Konstanten und Methoden.

ZB. fehlt folgendes.

Code: Alles auswählen

  function GST_PAD_LINK_FAILED(ret: TGstPadLinkReturn): boolean;
  begin
    Result := longint(ret) < longint(GST_PAD_LINK_OK);
  end;
Und leider wurde alles mit enums anstelle von LongInt übersetzt, so das viele Cast nötig sind.

Aber eines ist sicher, gstreamer ist eine recht spannende Sache.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Audio-Schnittstelle gesucht.

Beitrag von Mathias »

So jetzt geht mal START und PAUSE.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  if pipeline = nil then begin
    pipeline := gst_parse_launch('filesrc location=test.mp3 !  mpegaudioparse ! mpg123audiodec ! audioconvert ! audioresample ! pulsesink', nil);
    //    pipeline := gst_parse_launch('filesrc location=test.flac ! decodebin3 ! audioconvert ! audioresample ! autoaudiosink', nil);
  end;
  gst_element_set_state(pipeline, GST_STATE_PLAYING);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if pipeline <> nil then  begin
    gst_element_set_state(pipeline, GST_STATE_PAUSED);
  end;
So wie es aussieht, kann man auch ohne Thread arbeiten.
Bei den Lazarus-Sourcen hat es ein Beispiel dabei,m welches ein MP3 ohne das uri Zeugs abspielt.

So wie ich noch festgestellt habe, arbeitet gstreamer auf Basis von glib.
Das wird wohl auch der Grund sein, wieso man viele Propertys mit String übergeben muss.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
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: Audio-Schnittstelle gesucht.

Beitrag von af0815 »

Das mit dem Strings ist dem Parser geschuldet, der dir die Sache sehr vereinfacht. Wenn du die Pipeline aus einzelnen Elementen und Verbindungen aufbaust, sieht die Sache ganz anders aus, dafür hast du viel mehr Kontrolle zu Laufzeit.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Audio-Schnittstelle gesucht.

Beitrag von Mathias »

So nun kann ich mit einem Timer die Spielposition abfragen und kann direkt mitten in den Song springen.
Dateianhänge
lazarus_gstreamer.zip
(4.84 KiB) 47-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Audio-Schnittstelle gesucht.

Beitrag von Mathias »

gstreamer muss ja sehr mächtig sein.

Habt ihm mal folgendes in der Konsole eingegeben.

Code: Alles auswählen

gst-inspect-1.0 --plugin
Es werden mehr als 1600 Plugins gefunden. :shock:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
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: Audio-Schnittstelle gesucht.

Beitrag von af0815 »

Ja, gstreamer ist ein sehr mächtiges Audio Video System und wenn man es verstanden hat kann man auch die Plugins schreiben die man eventuell speziell braucht.

Die Plugins sind auch wegen der vielen Hardware Unterstützung zahlreich, auch gibt es für die gleiche Aufgabe unterschiedliche Lösungswege und daher unterschiedliche Module.

Und es ist auf allen Plattformen vorhanden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Audio-Schnittstelle gesucht.

Beitrag von Mathias »

Ja, gstreamer ist ein sehr mächtiges Audio Video System und wenn man es verstanden hat kann man auch die Plugins schreiben die man eventuell speziell braucht.
So wie es scheint, braucht es recht viel Einarbeitungszeit.
Ein Ton kommt relativ schnell mal.
Aber jetzt scheitert es schon an der Lautstärke-Verstellung.

Ich wollte dies bei einfachsten Tutorial von gstreamer einfügen. Aber "volume" hat nil. :roll:

Code: Alles auswählen

  pipeline =
      gst_parse_launch
      ("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm",
//      ("playbin uri=file:/home/tux/Schreibtisch/test.mp3",
      NULL);

  GstElement *volume;
  volume = gst_bin_get_by_name (GST_BIN (pipeline), "volume0");
  if (volume == NULL) {
    g_print ("Please give a pipeline with a 'volume' element in it\n");
    return 1;
  }
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Audio-Schnittstelle gesucht.

Beitrag von Mathias »

Immerhin habe ich es mal hingekriegt, mehrer Stücke parallel abzuspielen und die Position anzuzeigen.
Da ist SDL_mix schon mal gescheitert.


Nachtrag:
Ich habe hier reingeguckt. da muss schon einiges möglich sein.
https://discourse.gstreamer.org/t/pipel ... asked/2130
Dateianhänge
lazarus_gstreamer.zip
(6.78 KiB) 43-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Audio-Schnittstelle gesucht.

Beitrag von Mathias »

So bin ich noch weiter gekommen, jetzt habe ich es endlich hingekriegt, die Lautstärke zu verstellen.
Anscheinend geht dies nur, wen man die pipeline Manuel zusammen stellt.
Im Anhang eine kleine Konsolen-Version.
Dateianhänge
project1.lpr
(2.37 KiB) 41-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Audio-Schnittstelle gesucht.

Beitrag von Mathias »

Beim gstreamer merkt man gut, das es auf glib aufbaut.

Diese beiden Zeilen machen das selbe.

Code: Alles auswählen

pipeline := gst_pipeline_new('audio-player');

Code: Alles auswählen

pipeline := g_object_new(GST_TYPE_BIN, 'name', 'audio-player', nil);  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Audio-Schnittstelle gesucht. ( gstreamer )

Beitrag von Mathias »

Man kann damit auch sehr einfach eine Webcam ansteuern.

Code: Alles auswählen

uses
  Crt,  glib2,  ctypes,  gst;

  var
    pipeline: PGstElement;
  begin
    gst_init(@argc, @argv);

    pipeline := gst_parse_launch('v4l2src name=cam_src ! videoconvert ! videoscale ! video/x-raw,format=RGB ! queue ! videoconvert ! ximagesink name=img_origin', nil);

    if pipeline = nil then begin
      WriteLn('pipeline error');
    end;

    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    repeat
    until KeyPressed;

    gst_object_unref(pipeline);
  end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
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: Audio-Schnittstelle gesucht. ( gstreamer )

Beitrag von af0815 »

Tricky wird es wenn du gesteuert aus dem Stream Snapshots machen darfst. Und auf der HDD anlegst.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Audio-Schnittstelle gesucht. ( gstreamer )

Beitrag von Mathias »

af0815 hat geschrieben: Sa 7. Sep 2024, 13:16 Tricky wird es wenn du gesteuert aus dem Stream Snapshots machen darfst. Und auf der HDD anlegst.
Du meint ein Programm, mit dem ich filmen kann und den Stream auf die Platte speichern kann ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
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: Audio-Schnittstelle gesucht. ( gstreamer )

Beitrag von af0815 »

Mathias hat geschrieben: Sa 7. Sep 2024, 14:18
af0815 hat geschrieben: Sa 7. Sep 2024, 13:16 Tricky wird es wenn du gesteuert aus dem Stream Snapshots machen darfst. Und auf der HDD anlegst.
Du meint ein Programm, mit dem ich filmen kann und den Stream auf die Platte speichern kann ?
Nein, ich sprach von Snapshot, du lässt den Stream live laufen und auf Befehl mach du EIN Bild. Kein speichern des Streams, einfach nur Anzeigen und auf Tastendruck ein Bild gezielt ablegen.

Beispiel du hängst eine USB-Kamera an ein Mikroskop, Schaust dir dort live das ganze an und sagt, jetzt möchte ich ein Bild speichern (ohne das Livebild abzudrehen).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Audio-Schnittstelle gesucht. ( gstreamer )

Beitrag von Mathias »

Nein, ich sprach von Snapshot, du lässt den Stream live laufen und auf Befehl mach du EIN Bild. Kein speichern des Streams, einfach nur Anzeigen und auf Tastendruck ein Bild gezielt ablegen.
Dann habe ich sowas schon fast gemacht.
Ich kann den BildBuffer auslesen und ihn in ein OpenGL-Fenster kopieren.
Zuletzt geändert von Mathias am So 8. Sep 2024, 08:15, insgesamt 1-mal geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten