Autore Topic: problema in MediaPipeline  (Letto 661 volte)

Offline nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
problema in MediaPipeline
« il: 06 Ottobre 2021, 18:01:27 »
Ciao, ho un problema nell'utilizzo di una MediaPipeline.
Ho il seguente codice:

Codice: [Seleziona]
 f.src = New MediaControl(f.pl, "v4l2src")
    'Troviamo il percorso del device!
    Dim pDev As String = Utility.GetPercorsoDevice(ModuloGenerale.settaggioCorrente.FriendlyName, ModuloGenerale.settaggioCorrente.DevPath)
    f.src["device"] = pDev   '"/dev/video2"
 
    'creiamo il MediaFilter usando il formato associato al settaggio
    Dim strFrmt As String = ModuloGenerale.settaggioCorrente.MajorType1
    Dim strWidth As String = Str(ModuloGenerale.settaggioCorrente.Width1)
    Dim strHeight As String = Str(ModuloGenerale.settaggioCorrente.Height1)
    Dim strFramerate As String = Str(ModuloGenerale.settaggioCorrente.BitRate1)
    Dim stringaMediaFilter As String = "video/x-raw, format=" & strFrmt & ", width=" & strWidth & ", height=" & strHeight & ", framerate=" & strFramerate & "/1"
    f.ftr = New MediaFilter(f.pl, stringaMediaFilter)

omissis

Codice: [Seleziona]
f.src.LinkTo(f.ftr) 'here the error!!!

In pratica, all'istruzione "linkTo" ottengo un errore se il formato è diverso da "UYVY" (quindi con MJPEG e YUYV ad esempio).
Cosa sbaglio? Non credo dipenda dalla mancata installazione di codec su ubuntu.

Grazie

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #1 il: 06 Ottobre 2021, 22:53:17 »
In pratica, all'istruzione "linkTo" ottengo un errore se il formato è diverso da "UYVY" (quindi con MJPEG e YUYV ad esempio).
Cosa sbaglio?
Una cosa che raccomandiamo agli iscritti al forum, che vogliono porre domande per risolvere problemi di codice, è quella di inserire - se possibile - un breve ed essenziale codice che riproduce il problema, affinché sia possibile fare le prove direttamente.
Riguardo al problema da te posto volevo domandarti di specificare quale messaggio di errore ricevi.
Ad ogni modo potrebbe darsi che alcuni parametri passati attraverso la stringa "stringaMediaFilter" non siano compatibili con i formati  MJPEG e YUYV.
Ad esempio per MJPEG vedi qua:
   https://www.technomancy.org/gstreamer/mjpeg-gstreamer-encoding/
« Ultima modifica: 06 Ottobre 2021, 23:19:20 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #2 il: 07 Ottobre 2021, 10:26:16 »
Citazione
Una cosa che raccomandiamo agli iscritti al forum, che vogliono porre domande per risolvere problemi di codice, è quella di inserire - se possibile - un breve ed essenziale codice che riproduce il problema, affinché sia possibile fare le prove direttamente.
Riguardo al problema da te posto volevo domandarti di specificare quale messaggio di errore ricevi.

Ciao, in pratica il codice l'ho postato, anche se non completo (ma è lungo!).
Avrei dovuto creare uno script più corto, appositamente per mostrare un codice completo.
L'errore che ottengo è il seguente:  "Unable to link controls"

Citazione
Ad ogni modo potrebbe darsi che alcuni parametri passati attraverso la stringa "stringaMediaFilter" non siano compatibili con i formati  MJPEG e YUYV.

Tutto quello che passo lo leggo direttamente dalla camera, tramite comandi shell v42l-ctl, per cui dovrebbero essere tutte informazioni coerenti tra loro.

mmm ho visto il link. Lì per lì mi ero illuminato, salvo poi sprofondare nella frustrazione che..... non funziona proprio nulla :-/

Offline nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #3 il: 07 Ottobre 2021, 11:52:37 »
Ho una funzione, che viene chiamata all'interno di un ciclo:

Codice: [Seleziona]
Private Function TestaRisoluzione(frndName As String, dPath As String, formato As String, w As Integer, h As Integer, fps As Integer) As Boolean
  Dim tmpPL As New MediaPipeline
  Dim tmpSRC As New MediaControl(tmpPL, "v4l2src")
  Dim tmpDEV As String = Utility.GetPercorsoDevice(frndName, dPath)
  tmpSRC["device"] = tmpDEV     
   
  'creiamo il MediaFilter usando il formato associato al settaggio
  Dim strFrmt As String = formato
  Dim strWidth As String = Str(w)
  Dim strHeight As String = Str(h)
  Dim strFramerate As String = Str(fps)
  Dim stringaMediaFilter As String = "video/x-raw, format=" & strFrmt & ", width=" & strWidth & ", height=" & strHeight & ", framerate=" & strFramerate & "/1"
  Dim tmpFTR As New MediaFilter(tmpPL, stringaMediaFilter)
  Dim tmpCNV As New MediaControl(tmpPL, "videoconvert")
  Dim tmpSNK As New MediaControl(tmpPL, "xvimagesink")
  Debug stringaMediaFilter
  tmpSRC.LinkTo(tmpFTR)
  tmpFTR.LinkTo(tmpCNV)
  tmpCNV.LinkTo(tmpSNK)
  'se siamo arrivati qui, non abbiamo rilevato errori ===> "buttiamo tutto" e ritorniamo True
  tmpPL.Close
  Return True
 
  Catch
    Debug Error.Text
    Return False
End


L'esecuzione porta i seguenti messaggi (ho aggiunto di proposito le istruzioni "Debug"):

Citazione
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=640, height=480, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=640, height=360, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=320, height=240, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=1024, height=768, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=1280, height=720, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=1920, height=1080, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=2048, height=1536, framerate=20/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=2592, height=1944, framerate=10/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=MJPG, width=1280, height=960, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=640, height=480, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=640, height=360, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=320, height=240, framerate=30/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=1024, height=768, framerate=10/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=1280, height=720, framerate=10/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=1920, height=1080, framerate=5/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=2048, height=1536, framerate=4/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=2592, height=1944, framerate=2/1
Utility.TestaRisoluzione.176: Unable to link controls
Utility.TestaRisoluzione.167: video/x-raw, format=YUYV, width=1280, height=960, framerate=5/1
Utility.TestaRisoluzione.176: Unable to link controls

Ritengo il problema sia nel collegare opportunamente i filtri. Ma come si fa a sapere COSA e COME collegare? la documentazione GStreamer sui Pad? (nella quale ad esempio il formato MJPG non viene mai citato)... Io proprio non capisco!!  :hatecomputer: :hard:


EDIT: ho provato a togliere il set di "format", ad esempio:
video/x-raw, width=1280, height=960, framerate=30/1

funziona, ma così non ho controllo di quale formato venga utilizzato...
« Ultima modifica: 07 Ottobre 2021, 12:01:56 da nino83 »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #4 il: 07 Ottobre 2021, 15:55:35 »
L'errore che ottengo è il seguente:  "Unable to link controls"
Nel caso di tale errore sollevato, molte volte si risolve sostituendo il Metodo ".LinkTo()" con il Metodo:
 
Codice: [Seleziona]
.LinkToLater()
« Ultima modifica: 07 Ottobre 2021, 16:53:15 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #5 il: 07 Ottobre 2021, 16:26:48 »
Scusa... hai testato la tua intenzione su Terminale usando il comando "gst-launch-1.0" ?
Se lancio questa riga di comando:
  ~$ gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw, format=mjpg, width=640, height=360, framerate=30/1 ! videoconvert ! ximagesink

io ottengo questo avviso:

ATTENZIONE: pipeline errata: impossibile collegare v4l2src0 a videoconvert0, entrambi gli elementi non sono in grado di gestire caps video/x-raw, format=(string)mjpg, width=(int)640, height=(int)360, framerate=(fraction)30/1.
« Ultima modifica: 07 Ottobre 2021, 16:31:25 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #6 il: 07 Ottobre 2021, 16:58:09 »
si, avevo provato anche "LinkLaterTo", ma praticamente funzionava un formato, ma non più quello precedente  :rotfl:

Offline nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #7 il: 07 Ottobre 2021, 17:00:25 »
Sì, ho testato con gst-launch e ottengo lo stesso errore, appunto.

Difatti la domanda era proprio quella: come faccio ad usare altri formati? devo mettere nel mezzo altri convertitori/filtri? E come faccio a sapere/scoprire queste cose?  :-\

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #8 il: 07 Ottobre 2021, 17:10:18 »
Devi fare una ricerca su internet e provare gli esempi, in primo luogo in terminale usando il comando "gst-launch-1.0".
Per esempio riguardo a MJPG noto che il filtro è "image/jpeg,width=...etc...etc."
https://stackoverflow.com/questions/61887211/using-v4l2loopback-and-gstreamer-with-mjpeg-cameras
https://stackoverflow.com/questions/51740966/gstreamer-capture-and-store-mjpeg-from-webcam

Se io uso questo codice, funziona sostanzialmente, ma il video è lentissimo:
Codice: [Seleziona]
Public Sub Main()

  Dim pl As New MediaPipeline
  Dim src As New MediaControl(pl, "v4l2src")
  Dim ftr As New MediaFilter(pl, "image/jpeg, width=640, height=360, framerate=30/1")
  Dim par As New MediaControl(pl, "jpegparse")
  Dim jdc As New MediaControl(pl, "jpegdec")
  Dim snk As New MediaControl(pl, "xvimagesink")
 
  src["device"] = "/dev/video0"

  src.LinkTo(ftr)
  ftr.LinkTo(par)
  par.LinkTo(jdc)
  jdc.LinkTo(snk)
 
  pl.play()
 
  While True
    Wait 0.01
  Wend

End

Se lo provo in terminale, infatti, mi dice:
There may be a timestamping problem, or this computer is too slow.



E come faccio a sapere/scoprire queste cose?
Oltre agli esempi in giro per internet devi anche dare uno sguardo alla risorsa GStreamer, sulla quale ovviamente si base il Componente gb.media di Gambas, e studiarla:
https://gstreamer.freedesktop.org/documentation/tutorials/index.html?gi-language=c
« Ultima modifica: 07 Ottobre 2021, 17:23:56 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #9 il: 07 Ottobre 2021, 17:47:30 »
Grazie mille vuott.
Si, conosco già tutti i link che mi hai inviato.  Probabilmente si tratta di tempo. Io ho messo piede su linux e gambas da nemmeno una settimana!  ;D

Vedremo cosa verrà fuori. grazie ancora

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #10 il: 07 Ottobre 2021, 17:56:30 »
Probabilmente si tratta di tempo. Io ho messo piede su linux e gambas da nemmeno una settimana!
Be'..comunque complimenti.
Ad ogni modo GStreamer è una risorsa, sì, molto potente, ma è una bestiaccia.
In casi estremi, ossia qualora tu non dovessi risolvere con il Componente gb.media ed hai assolutamente bisogno di avere la funzionalità desiderata, ricorda che puoi sempre sfruttare in Gambas direttamente le funzioni esterne di GStreamer.
« Ultima modifica: 07 Ottobre 2021, 17:57:34 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline nino83

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #11 il: 08 Ottobre 2021, 11:30:09 »
Citazione
Be'..comunque complimenti.

Grazie mille!  ;D
diciamo che devo "rifare" un sistema di acquisizione che ho già fatto sotto windows con un linguaggio di programmazione diverso, anche se simile (xojo).


Citazione
In casi estremi, ossia qualora tu non dovessi risolvere con il Componente gb.media ed hai assolutamente bisogno di avere la funzionalità desiderata, ricorda che puoi sempre sfruttare in Gambas direttamente le funzioni esterne di GStreamer.

cioè? fare tutto via shell intendi?
ho trovato abbastanza comodo gb.media finora, soprattutto per una cosa per me fondamentale: legare il flusso live a una drawing area.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:problema in MediaPipeline
« Risposta #12 il: 08 Ottobre 2021, 13:34:09 »
cioè? fare tutto via shell intendi?
No, non tramite il comando "Shell".
Io uso rarissimamente questo comando e tendenzialmente sono contrario al suo utilizzo.
No, sto parlando dell'uso diretto delle funzioni esterne delle librerie condivise shared library - come le DLL in Winzoz - mediante la risorsa Extern di Gambas:
   https://www.gambas-it.org/wiki/index.php?title=Extern:_richiamare_funzioni_esterne_a_Gambas

Un esempio pratico proprio con GStreamer lo puoi vedere qui:
   https://www.gambas-it.org/wiki/index.php?title=Eseguire_un_file_audio_usando_una_linea_di_pipeline_con_la_funzione_%27gst_parse_launch()%27


ho trovato abbastanza comodo gb.media finora
E vai bene così.  :ok:
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »