Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Importare testo da una Console CMD a una listView su Form C#
Forum - C# / VB.NET - Importare testo da una Console CMD a una listView su Form C#

Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 15:58
Venerdì, 02/06/2023
Avrei bisogno di catturare le info che ffmpeg visualizza su Console, dopo essere stato lanciato da codice C# WinForm.

Allego un progetto con un pulsante [  vai  ] che manda in esecuzione ffmpeg per strimmare un file in locale (solo per capire cosa mi serve).

https://www.dropbox.com/s/8t8q7dn7scpucw6/FFMPEG1.ZIP?dl=0
  
(si può scaricare senza registrarsi)

Nel progetto è incluso ffmpeg e un file video da 5''. Questo per ricevere aiuti anche da chi non conosce ffmpeg.

Praticamente il programma lancia ffmpeg con:
Codice sorgente - presumibilmente Plain Text

  1. System.Diagnostics.Process.Start(@"cmd.exe", "/c ffmpeg -re -i test.mp4.....


si apre la finestra CMD e vorrei copiare i messaggi che si susseguono in una listView.

Ho provato con [  vai2  ] (incluso nel progetto):
Codice sorgente - presumibilmente C#

  1. private void button2_Click(object sender, EventArgs e)
  2. {
  3. System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c ffmpeg -re -i test.mp4 -c:v libx264 -preset veryfast -maxrate 500k -bufsize 1000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv udp://127.0.0.1:23000");
  4.  
  5.     procStartInfo.RedirectStandardOutput = true;
  6.     procStartInfo.UseShellExecute = false;
  7.     procStartInfo.CreateNoWindow = false;
  8.     System.Diagnostics.Process proc = new System.Diagnostics.Process();
  9.     proc.StartInfo = procStartInfo;
  10.     proc.OutputDataReceived += cmd_DataReceived;
  11.     proc.EnableRaisingEvents = true;
  12.     proc.Start();
  13.  
  14.     proc.BeginOutputReadLine();
  15.     // string result = proc.StandardOutput.ReadLine(); // errore sincrono asincrono
  16.     // string result = proc.StandardOutput.ReadToEnd(); // errore sincrono asincrono
  17.     // Console.WriteLine(result);
  18. }
  19.  
  20. public void cmd_DataReceived(object sender, DataReceivedEventArgs e)
  21. {
  22.     Console.WriteLine("dati in arrivo"); // controllo preliminare sull'output di VS
  23.     Console.WriteLine(e.Data);  // controllo preliminare sull'output di VS
  24. }



la console resta nera e l'evento si scatena solo alla fine e comunque non ricevo i dati.
Sulla finestra output di VS i dati compaiono ma solo alla fine del filmato che dura soli 5 secondi, serve solo per provare.

Qualsiasi metodo per intercettare cosa viene mostrato sulla finestra di ffmpeg mi va bene.

Grazie a chiunque si interesserà al problema.

Ultima modifica effettuata da Carlo il 02/06/2023 alle 16:22


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:43
Venerdì, 02/06/2023
Codice sorgente - presumibilmente C# / VB.NET

  1. private void button2_Click(object sender, EventArgs e)
  2.         {
  3.             Process process = new Process();
  4.  
  5.             process.StartInfo.FileName = "ffmpeg.exe";            
  6.             process.StartInfo.Arguments = "-re -i test.mp4 -c:v libx264 -preset veryfast -maxrate 500k -bufsize 1000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv udp://127.0.0.1:23000";
  7.  
  8.             process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  9.             process.StartInfo.UseShellExecute = false;
  10.             process.StartInfo.CreateNoWindow = true;
  11.  
  12.             process.StartInfo.RedirectStandardInput = false;    
  13.             process.StartInfo.RedirectStandardOutput = true;
  14.             process.StartInfo.RedirectStandardError = true;
  15.  
  16.             process.OutputDataReceived += cmd_DataReceived;
  17.             process.ErrorDataReceived += cmd_DataReceived;
  18.             process.EnableRaisingEvents = true;
  19.             process.Start();
  20.  
  21.             process.BeginErrorReadLine();
  22.             process.BeginOutputReadLine();
  23.  
  24.             process.WaitForExit();
  25.         }
  26.  
  27.         public void cmd_DataReceived(object sender, DataReceivedEventArgs e)
  28.         {
  29.             listBox1.Items.Add(e.Data);
  30.         }




Ciao


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 19:20
Venerdì, 02/06/2023
@nessuno :k:

Sono senza parole, grazie. :asd:


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 1:03
Sabato, 03/06/2023
Di nulla, ciao

(naturalmente tu potrai usare una listview, come da titolo, io per il test ho usato una listbox)

Ultima modifica effettuata da nessuno il 03/06/2023 alle 18:07


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote