Oppure

Loading
21/09/21 15:17
fosforo
Ciao

Uso questo codice per visualizzare in un Panel il programma FFPLAY:

private void RunFFmpeg1()
        {    
            ffplay.StartInfo.FileName = "ffplay.exe"; 
            ffplay.StartInfo.Arguments = "-noborder -volume 0 " +  "udp://127.0.0.1:2001";
            ffplay.StartInfo.CreateNoWindow = true;
            ffplay.StartInfo.RedirectStandardOutput = true;
            ffplay.StartInfo.UseShellExecute = false;
            ffplay.EnableRaisingEvents = true;
            ffplay.OutputDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
            ffplay.ErrorDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
            ffplay.Exited += (o, e) => Debug.WriteLine("Exited", "ffplay");
            ffplay.Start();

            Thread.Sleep(6000); 

            SetParent(ffplay.MainWindowHandle, this.pane1RTmonitor.Handle);
            MoveWindow(ffplay.MainWindowHandle, 0, 0, 480, 270, true);
        }




Il problema è che per farlo funzionare correttamente c'è una istruzione che blocca la Form per alcuni secondi:
Thread.Sleep(6000);
Senza questo Sleep FFPALY non va nel Panel correttamente.

Sto cercando di gestire tutto in un Thread separato per non fermare il Form ma non riesco a gestire lo Sleep.

Se conoscete un altro modo di utilizzare FFPLAY incorniciato in un Panel, i consigli sono ben accetti.

Grazie anticipatamente
Ultima modifica effettuata da Thejuster 23/09/21 9:57
aaa
23/09/21 9:52
Thejuster
Lo sleep ferma di saputo il Thread principale del programma.

Non è detto che poi serva per forza attendere quei 6 sec.


//Fai partire il processo
ffplay.Start(); //1

//Attendi 6 sec
Thread.Sleep(6000); //2

//Setti i vari handle
SetParent(ffplay.MainWindowHandle, this.pane1RTmonitor.Handle); //3

//ancori il play all'handle principale del form
MoveWindow(ffplay.MainWindowHandle, 0, 0, 480, 270, true); //4



Se inverti il processo?

Prima di eseguire ffplay.Start();
esegui tutte le altre operazioni?

Mi sembra strano che non ti crashi nemmeno l'applicazione in questo.
Generalmente il tutto và avviato una volta settato ogni parametro e non prima.

prova in questo modo. o altrimenti invia in un'altra void avviata in un processo diverso dal main dove fai attendere 6000ms e imposti i vari handle.


private void RunFFmpeg1()
        {    
            ffplay.StartInfo.FileName = "ffplay.exe";
            ffplay.StartInfo.Arguments = "-noborder -volume 0 " +  "udp://127.0.0.1:2001";
            ffplay.StartInfo.CreateNoWindow = true;
            ffplay.StartInfo.RedirectStandardOutput = true;
            ffplay.StartInfo.UseShellExecute = false;
            ffplay.EnableRaisingEvents = true;
            ffplay.OutputDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
            ffplay.ErrorDataReceived += (o, e) => Debug.WriteLine(e.Data ?? "NULL", "ffplay");
            ffplay.Exited += (o, e) => Debug.WriteLine("Exited", "ffplay");
            
            Thread t = new Thread(Avvia);
            t.start();

}

private void Avvia()
{

    invoke(new Action(delegate{
 
            ffplay.Start(); 
 
            Thread.Sleep(6000);

            SetParent(ffplay.MainWindowHandle, this.pane1RTmonitor.Handle);
            MoveWindow(ffplay.MainWindowHandle, 0, 0, 480, 270, true);
 
   }));

}




Magari prima di testare questa soluzione (spero di averla scritta bene non ho testato)
prova prima a seguire il suggerimento sopra.
mire.forumfree.it/ - Mire Engine
C# UI Designer
29/09/21 6:50
fosforo
Ciao

Purtroppo non ho avuto risultati positivi.
Il programma non crasha, il problema è che FFMPEG non va nel Panel.
Rimane indipendente.

Anche solo cambiando il valore del Thread.Sleep(6000) diventa un problema.
Ho fatto dei test, e cambiando PC devo cambiare il valore del Thread.Sleep.
Diventa ingestibile.
aaa
29/09/21 16:13
Thejuster
Non sò, non dico che sbagli tu fosforo, non avendo mai provato ffmpeg in modalità video,
non posso azzardare conclusioni ma solo provare a dare qualche consiglio.

Ho utilizzato ffmpeg per convertire video, o audio. (le librerie ovviamente intendo)

per i video, ho fatto qualche esperimento con le DirectVideo, ma sono pochi i formati supportati dai codec nativi.

Da come ricordavo, bisognava assegnare un handle ovviamente come hai fatto nel tuo codice al draw,
per permettere alle directX di disegnare su quel determinato controllo, e solo dopo eseguire il play.

La cosa che non mi è chiara, è perché occorre attendere o congelare il thread per quei secondi.
Non sto dicendo che sbagli qualcosa, ma mi sembra un pò insensata come cosa.

Di conseguenza, leggendo:

Ho fatto dei test, e cambiando PC devo cambiare il valore del Thread.Sleep.


Sono ancora più convinto che quel Thread Sleep non vada usato. Ma che bisogna eseguire magari il codice in un modo differente da quello.

Dove posso scaricare questo ffplay? magari provo a darti una mano e capire il problema.
Credo che bisogna in qualche modo comunicare con il processo esterno.
Ultima modifica effettuata da Thejuster 29/09/21 16:20
mire.forumfree.it/ - Mire Engine
C# UI Designer