mediaview und capture

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
flodder
Foriker
Beiträge: 31
Registriert: Di 29. Dez 2009, 10:56
Kontaktdaten:

mediaview und capture

Beitrag von flodder » Mi 2. Jun 2021, 12:47

Hallo zusammen

Gibt es eine Möglichkeit, aus einem mediaview ein einzelnes Bild zu speichern?
Wenn ja: Wie?
Wenn nein: Welche alternativen Ansätze gibt es, um von der Webcam einen QR-Code einzulesen, um ihn in Text umzuwandeln und den Text dann vorlesen zu lassen.
Ich arbeite an einem barrierefreien Informationssystem und benötige eine Vorschau in einem mediaview. Weil dadurch für zbarcam /dev/video* nicht verfügbar ist, suche ich nach einer Lösung mit zbarimg.

vuott
Foriker
Beiträge: 126
Registriert: Fr 16. Jan 2015, 01:27
Wohnort: Europäische Union - Italia
Kontaktdaten:

Re: mediaview und capture

Beitrag von vuott » Mi 2. Jun 2021, 14:04

Ich empfehle diese Seiten:

- https://www.gambas-it.org/wiki/index.ph ... e_gb.media
- https://www.gambas-it.org/wiki/index.ph ... e_gb.media
- https://www.gambas-it.org/wiki/index.ph ... e_gb.media
- https://www.gambas-it.org/wiki/index.ph ... e_gb.media
- https://www.gambas-it.org/wiki/index.ph ... _GStreamer
- https://www.gambas-it.org/wiki/index.ph ... API_di_VLC

Um insbesondere den QR-Code mit den Ressourcen der gb.media-Komponente zu lese: gambas code
Private pl As MediaPipeline
Private tb As ToggleButton
Private drar As DrawingArea


Public Sub _new()

  With Me
    .W = 600
    .H = 600
  End With
  
  drar = New DrawingArea(Me)
  drar.Background = Color.Transparent
  
  With tb = New ToggleButton(Me) As "Tasto"
    .X = 500
    .Y = 550
    .W = 80
    .H = 40
    .Text = "Start"
  End With
  
End

Public Sub Form_Open()

  Dim src, zbr, snk As MediaControl
  
   pl = New MediaPipeline As "Pipeline"
   
   src = New MediaControl(pl, "v4l2src")
   zbr = New MediaControl(pl, "zbar")
   snk = New MediaControl(pl, "xvimagesink")
   
   src.LinkTo(zbr)
   zbr.LinkTo(snk)
   
   snk.SetWindow(drar)
  
End


Public Sub Tasto_Click()
 
 If tb.Value Then
   pl.Play()
   tb.Text = "Stop"
 Else
   pl.Stop()
   pl.Close()
   Me.Close
 Endif
 
End


Public Sub Pipeline_Event(Message As MediaMessage)
  
  Dim c As Byte

  If Message.Name = "barcode" Then
    For c = 1 To Message.count - 1
      With Message
        Print .Keys[c], Message[.Keys[c]],
      End With
    Next
    Print
  Endif
  
End
Zuletzt geändert von vuott am Sa 5. Jun 2021, 17:10, insgesamt 1-mal geändert.
In praeterita spectando dolenter subfero.

flodder
Foriker
Beiträge: 31
Registriert: Di 29. Dez 2009, 10:56
Kontaktdaten:

Re: mediaview und capture

Beitrag von flodder » Sa 5. Jun 2021, 09:56

Hallo vuott

Danke für den Code. Beim Ausführen bekomme ich bei pl.Play() die Meldung "Cannot set status in FMain:51".
Muss an dem Code noch etwas angepasst werden, Programme installiert oder Komponenten eingebunden werden?

vuott
Foriker
Beiträge: 126
Registriert: Fr 16. Jan 2015, 01:27
Wohnort: Europäische Union - Italia
Kontaktdaten:

Re: mediaview und capture

Beitrag von vuott » Sa 5. Jun 2021, 17:22

flodder hat geschrieben:
Sa 5. Jun 2021, 09:56
Hallo vuott

Danke für den Code. Beim Ausführen bekomme ich bei pl.Play() die Meldung "Cannot set status in FMain:51".
Muss an dem Code noch etwas angepasst werden, Programme installiert oder Komponenten eingebunden werden?
Entschuldigung, ich habe ein "MediaControl()" vergessen.
Hier ist der neue Code.
gambas code
Private pl As MediaPipeline
Private tb As ToggleButton
 
 
Public Sub _new()
 
  With Me
    .W = 200
    .H = 200
  End With
   
  With tb = New ToggleButton(Me) As "Tasto"
    .W = 80
    .H = 40
    .X = (Me.W / 2) - (.W / 2)
    .Y = (Me.H / 2) - (.H / 2)
    .Text = "Start"
  End With
   
End
 
Public Sub Form_Open()
 
  Dim src, cnv, zbr, snk As MediaControl
   
   pl = New MediaPipeline As "Pipeline"
  
   src = New MediaControl(pl, "v4l2src")
   cnv = New MediaControl(pl, "videoconvert")
   zbr = New MediaControl(pl, "zbar")
   snk = New MediaControl(pl, "xvimagesink")
    
   src.LinkTo(cnv)
   cnv.LinkTo(zbr)
   zbr.LinkTo(snk)
   
End
 
 
Public Sub Tasto_Click()
  
 If tb.Value Then
   pl.Play()
   tb.Text = "Stop"
 Else
   pl.Stop()
   pl.Close()
   Me.Close
 Endif
  
End
 
 
Public Sub Pipeline_Event(Message As MediaMessage)
   
  Dim c As Byte
 
  If Message.Name = "barcode" Then
    For c = 1 To Message.count - 1
      With Message
        Print .Keys[c], Message[.Keys[c]],
      End With
    Next
    Print
  Endif
   
End
In praeterita spectando dolenter subfero.

flodder
Foriker
Beiträge: 31
Registriert: Di 29. Dez 2009, 10:56
Kontaktdaten:

Re: mediaview und capture

Beitrag von flodder » Mo 7. Jun 2021, 09:26

Hallo vuott
Einiges funktioniert schon, aber einiges noch nicht so richtig.
  • An einem PC mit externer WebCam funktioniert es, beim Notebook mit eingebauter Kamera nicht. Kein Bild, keine Fehlermeldung. Wie kann ich das device /dev/video* direkt angeben, wenn z.B. mehrere Kameras vorhanden sind? Eine Webcam dürfte für QR-Codes nur bedingt geeignet sein, da das Bild scheinbar erst ab einem Abstand von 50 cm fokusiert wird. Dazu möchte ich dann eine eigene Kamera benutzen, für andere Anwendungen aber auch eine normale WebCam verwenden.
  • Wie bekomme ich das Bild z.B. in einen MediaView in FMain? Meine Versuche mit Linkto waren bislang erfolglos. Bin ich damit ansatzweise auf dem richtigen Weg oder habe ich einen generellen Denkfehler?

vuott
Foriker
Beiträge: 126
Registriert: Fr 16. Jan 2015, 01:27
Wohnort: Europäische Union - Italia
Kontaktdaten:

Re: mediaview und capture

Beitrag von vuott » Mo 7. Jun 2021, 10:09

flodder hat geschrieben:
Mo 7. Jun 2021, 09:26
Wie kann ich das device /dev/video* direkt angeben
Hallo flodder,
Um ein bestimmtes Videogerät einzustellen, müssen Sie es auf die "Device"-Eigenschaft von Mediacontrol "v4l2src" zuweisen. gambas code
src = New MediaControl(pl, "v4l2src")
src["device"] = "/dev/video0"   ' oder /video1, et cetera

flodder hat geschrieben:
Mo 7. Jun 2021, 09:26
da das Bild scheinbar erst ab einem Abstand von 50 cm fokusiert wird.
Ich erinnere mich, dass ich während der Proben einige Sekunden auf den Fokus warten musste.


flodder hat geschrieben:
Mo 7. Jun 2021, 09:26
Wie bekomme ich das Bild z.B. in einen MediaView in FMain?
Um das Video auf die "Form" zu bringen, müssen Sie eine zeichenbare Oberfläche verwenden, beispielsweise eine "DrawingArea".
Auf diese Grafikoberfläche müssen Sie den Videodatenstrom mit der Methode ".SetWindow()" umleiten.
In meinem Beispiel müssen Sie also einen "DrawingArea" auf das "Formular" und nach der Zeile setzen: gambas code
....
zbr.LinkTo(snk)
Sie müssen hinzufügen: gambas code
snk.SetWindow(DrawingArea1)
In praeterita spectando dolenter subfero.

flodder
Foriker
Beiträge: 31
Registriert: Di 29. Dez 2009, 10:56
Kontaktdaten:

Re: mediaview und capture

Beitrag von flodder » Mo 7. Jun 2021, 22:13

Hallo vuott
An einem PC mit externer Kamera funktioniert alles. Am Notebook bekomme ich weder mit der internen noch mit einer externen Kamera ein Bild. Mit zbarcam kann ich einen QR-Code lesen.
Nach dem Beenden bekomme ich an beiden Systemen folgende Meldung:
(gbx3:4967): GStreamer-CRITICAL **: 21:48:29.654: gst_structure_get_name: assertion 'structure != NULL' failed
Notebook:
Dell Inspiron 15 5000 2-in-1

Ansonsten (beide Systeme):
Manjaro
Gambas 3.15.2
gstreamer 1.18.4

vuott
Foriker
Beiträge: 126
Registriert: Fr 16. Jan 2015, 01:27
Wohnort: Europäische Union - Italia
Kontaktdaten:

Re: mediaview und capture

Beitrag von vuott » Di 8. Jun 2021, 08:36

Ich weiß nicht. Bei mir funktioniert es auch mit einem kleinen ASUS N450 Notebook.
In praeterita spectando dolenter subfero.

flodder
Foriker
Beiträge: 31
Registriert: Di 29. Dez 2009, 10:56
Kontaktdaten:

Re: mediaview und capture

Beitrag von flodder » Di 8. Jun 2021, 11:16

Hallo vuott
wenn ich auf der Konsole mit shell code
gst-launch-1.0 v4l2src ! xvimagesink
auf die Webcam zugreifen möchte, bekomme ich kein Bild. shell code
gst-launch-1.0 v4l2src ! videoconvert ! ximagesink
oder shell code
gst-launch-1.0 v4l2src ! videoconvert ! zbar ! videoconvert ! ximagesink
funktioniert fehlerfrei.
Ich habe schon versucht, das mit folgendem Code umzusetzen: gambas code
  Dim src, cnv  As MediaControl
    
   pl = New MediaPipeline As "Pipeline"
   
   src = New MediaControl(pl, "v4l2src")
   src["device"] = "/dev/video0"
   cnv = New MediaControl(pl, "videoconvert")
   snk = New MediaControl(pl, "xvimagesink")
       
   src.LinkTo(cnv)
   cnv.LinkTo(snk)

oder gambas code
  Dim src, cnv, zbr, vcv, snk As MediaControl
    
   pl = New MediaPipeline As "Pipeline"
   
   src = New MediaControl(pl, "v4l2src")
   src["device"] = "/dev/video0"
   cnv = New MediaControl(pl, "videoconvert")
   zbr = New MediaControl(pl, "zbar")
   vcv = New MediaControl(pl, "videoconvert")
   snk = New MediaControl(pl, "xvimagesink")
     

   
   src.LinkTo(cnv)
   cnv.LinkTo(zbr)
   zbr.LinkTo(vcv)
   vcv.LinkTo(snk)
Das funktioniert auf einem PC, auf dem Notebook leider nicht. Was ist denn bei gstreamer der Unterschied, ob ich es auf der Konsole oder aus Gambas heraus aufrufe?

vuott
Foriker
Beiträge: 126
Registriert: Fr 16. Jan 2015, 01:27
Wohnort: Europäische Union - Italia
Kontaktdaten:

Re: mediaview und capture

Beitrag von vuott » Mi 9. Jun 2021, 08:44

Hallo,
Ich denke, es hängt davon ab, wie Gambas GStreamer verwaltet, oder vielleicht (wahrscheinlicher) "GStreamer" (oder besser: gb.media) mit Gambas auf Ihrem Notebook hat ein Systemkonfliktproblem. (Ich wiederhole mir, dass der Code sogar auf einem alten ASUS Atom N450 regelmäßig funktioniert).
Auch ist mir zu anderen Themen passiert, dass eine "Pipeline", die mit "gst-launch-1.0" in der Konsole erstellt wurde, funktioniert, während selbst die gleiche externe Funktion, in Gambas mit "Extern" aufgerufen, nicht funktioniert.
...Sie können versuchen :| die Methode ".LinkTo()" (...nicht alle) durch ".LinkLaterTo()" zu ersetzen: in einigen Fällen konnte ich einige Betriebsprobleme lösen.

Sie können versuchen, die Klasse "MediaPlayer" anstelle der Klasse "MediaPipeline" zu verwenden, indem Sie einen anderen Code schreiben.
In praeterita spectando dolenter subfero.

vuott
Foriker
Beiträge: 126
Registriert: Fr 16. Jan 2015, 01:27
Wohnort: Europäische Union - Italia
Kontaktdaten:

Re: mediaview und capture

Beitrag von vuott » Do 10. Jun 2021, 23:44

flodder hat geschrieben:
Di 8. Jun 2021, 11:16
oder shell code
gst-launch-1.0 v4l2src ! videoconvert ! zbar ! videoconvert ! ximagesink
funktioniert fehlerfrei.
Anstelle des Shell-Befehls können Sie externe "GStreamer"-Funktionen verwenden:
gambas code
Private bo As Boolean


Library "libgstreamer-1.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Private Const GST_FORMAT_TIME As Integer = 3

' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)

' GstElement * gst_parse_launch (const gchar *pipeline_description, GError **error)
' Create a new pipeline based on command line syntax.
Private Extern gst_parse_launch(description As String, GError As Pointer) As Pointer

' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer
 
' gboolean gst_element_query_position (GstElement *element, GstFormat format, gint64 *cur)
' Queries an element for the stream position in nanoseconds.
Private Extern gst_element_query_position(gstelement As Pointer, gstformat As Pointer, cur As Pointer) As Boolean

' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)


Public Sub Main()
 
  Dim webcam As Pointer
  Dim tempus As Long
     
  gst_init(0, 0)
  
  webcam = gst_parse_launch("v4l2src ! videoconvert ! zbar ! videoconvert ! ximagesink", 0)
     
' Das Abspielen von Videos starten:
  gst_element_set_state(webcam, GST_STATE_PLAYING)
  
  Repeat 
    gst_element_query_position(webcam, GST_FORMAT_TIME, VarPtr(tempus))
    Write "\rZeit: " & Time(0, 0, 0, tempus / 1000000)
    Wait 0.01
  Until bo 
  
' Beenden Sie die Wiedergabe der Mediendatei:
  gst_element_set_state(webcam, GST_STATE_NULL)
  gst_object_unref(webcam)
  Print "\nAusführung abgeschlossen."
  Quit
      
End


Public Sub Application_Read() ' Durch Anklicken der „Enter“-Taste auf der Tastatur wird das Programm beendet.

  bo = True

End
In praeterita spectando dolenter subfero.

flodder
Foriker
Beiträge: 31
Registriert: Di 29. Dez 2009, 10:56
Kontaktdaten:

Re: mediaview und capture

Beitrag von flodder » Di 15. Jun 2021, 14:36

Hallo vuott

Mit den Rechnern, die ich für mein Projekt verwende, funktioniert deine Lösung. Ich werde auf dem Notebook evtl. nochmal einen anderen Kernel oder eine andere Distribution ausprobieren.
Wie kann ich denn den QR-Scanner autamatisch starten, wenn ich die Form öffne? gambas code
Public Sub Form_Open()

Dim src, cnv, zbr, snk As MediaControl
    
   pl = New MediaPipeline As "Pipeline"
   
   src = New MediaControl(pl, "v4l2src")
   cnv = New MediaControl(pl, "videoconvert")
   zbr = New MediaControl(pl, "zbar")
   snk = New MediaControl(pl, "xvimagesink")
     
   src.LinkTo(cnv)
   cnv.LinkTo(zbr)
   zbr.LinkTo(snk)
    
   snk.SetWindow(MediaView1)
   
   pl.Play()

End
funktioniert nicht. Das Bild wir in einem separaten Fenster dargestellt und nicht in der DrawingArea oder im MediaView. Wo liegt denn da der Unterschied?

vuott
Foriker
Beiträge: 126
Registriert: Fr 16. Jan 2015, 01:27
Wohnort: Europäische Union - Italia
Kontaktdaten:

Re: mediaview und capture

Beitrag von vuott » Di 15. Jun 2021, 15:58

flodder hat geschrieben:
Di 15. Jun 2021, 14:36
Wie kann ich denn den QR-Scanner autamatisch starten, wenn ich die Form öffne?
Hallo flodder,
Ich verstehe nicht, was Sie damit meinen. :|
Das Scannen des Qr-Codes beginnt mit dem Öffnen der "Form" (in diesem Fall) und genauer gesagt mit der Methode ".Play()".

flodder hat geschrieben:
Di 15. Jun 2021, 14:36
...funktioniert nicht. Das Bild wir in einem separaten Fenster dargestellt
Es tut mir leid, aber ich kann Ihnen sagen, dass ich aus eigener Erfahrung feststellen konnte, dass die Ressourcen des gb.media "auch" durch die Hardware beeinflusst werden.
Für mich funktioniert dieser Code beispielsweise nicht mit allen Webcams.

flodder hat geschrieben:
Di 15. Jun 2021, 14:36
nicht in der DrawingArea oder im MediaView.
Versuchen Sie einen "Wait 0.5" (oder 1) einfügen vor der Methode "pl.Play()".


Für mich funktioniert der folgende Code, und das Video erscheint in "Mediaview": gambas code
Public Sub Form_Open()
 
  Dim src, cnv, zbr, snk As MediaControl
  Dim pl As MediaPipeline
  
  Me.Show
  Wait 1
  
   pl = New MediaPipeline As "Pipeline"
    
   src = New MediaControl(pl, "v4l2src")
   cnv = New MediaControl(pl, "videoconvert")
   zbr = New MediaControl(pl, "zbar")
   snk = New MediaControl(pl, "xvimagesink")
      
   src.LinkTo(cnv)
   cnv.LinkTo(zbr)
   zbr.LinkTo(snk)
     
   snk.SetWindow(MediaView1)
    
   pl.Play()
   
   While True
     Wait 0.01
   Wend
 
End
In praeterita spectando dolenter subfero.

flodder
Foriker
Beiträge: 31
Registriert: Di 29. Dez 2009, 10:56
Kontaktdaten:

Re: mediaview und capture

Beitrag von flodder » Mo 21. Jun 2021, 11:41

Hallo vuott
Dein Beispiel funktioniert mit einer "leeren" Form und mit gambas code
Me.show
.
In meinem Projekt funktioniert der Code allerdings nicht.
I

flodder
Foriker
Beiträge: 31
Registriert: Di 29. Dez 2009, 10:56
Kontaktdaten:

Re: mediaview und capture

Beitrag von flodder » Di 22. Jun 2021, 10:29

Hallo vuott
Nachdem ich noch so einiges ausprobiert habe, funktioniert es jetzt. Allerdings wird das Programm nach dem Start des MediaControl etwas ausgebremst. Ein pl.Stop() oder pl.Close() hilft auch nicht. Gibt es eine Möglichkeit, MediaControl komplett zu beenden?

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste