2017-09-19 3 views
0

Ok donc pour le moment j'ai un programme qui exécute FFmpeg en utilisant un processus dans VB.net. J'envoie les arguments du processus dans startinfo ainsi que d'autres choses comme l'emplacement du fichier. Quand je cours le code il envoie la sortie de console à la console de débogage; c'est probablement parce que j'ai le .UseShellExecute = False et processInfo.RedirectStandardOutput = VraiComment interagir avec la sortie du processus?

Ma question est: Comment puis-je faire quelque chose qui peut interpréter la sortie? Aussi avec FFmpeg, le processus est continu, donc le processus est toujours exécuté pour la plupart et ajoute constamment plus de lignes de sortie dans la console de débogage.

Le code J'utilise:

Dim process As New Process 
     Dim processInfo As New ProcessStartInfo 
     processInfo.FileName = tempPath 
     processInfo.Arguments = ("-r 1/.1 -i " + link + " -c copy " + saveLocation + "\" + streamerName + ".ts") 
     processInfo.UseShellExecute = False 
     processInfo.WindowStyle = ProcessWindowStyle.Hidden 
     processInfo.CreateNoWindow = True 
     processInfo.RedirectStandardOutput = True 
     process.StartInfo = processInfo 
     process.Start() 

J'ai essayé sans succès.

Dim output As String 
     Using StreamReader As System.IO.StreamReader = process.StandardOutput 
      output = StreamReader.ReadToEnd().ToString 
     End Using 

Edit: J'ai maintenant ce code:

Dim process As New Process 
     AddHandler process.OutputDataReceived, AddressOf CallbackProcesoAsync 
     AddHandler process.ErrorDataReceived, AddressOf ErrorDataReceivedAsync 
     Dim processInfo As New ProcessStartInfo 
     processInfo.FileName = tempPath 
     processInfo.Arguments = ("-r 1/.1 -i " + link + " -c copy " + saveLocation + "\" + streamerName + ".ts") 
     processInfo.UseShellExecute = False 
     processInfo.WindowStyle = ProcessWindowStyle.Hidden 
     processInfo.CreateNoWindow = False 
     processInfo.RedirectStandardOutput = True 
     processInfo.RedirectStandardError = True 
     process.StartInfo = processInfo 
     process.Start() 
     processes.Add(Tuple.Create(tempPath, streamerName)) 
     Debug.WriteLine("Attempting to record " + streamerName) 
     Dim output As String 
     Using StreamReader As System.IO.StreamReader = process.StandardOutput 
      output = StreamReader.ReadToEnd().ToString 
     End Using 
    End If 
End Sub 

Private Sub CallbackProcesoAsync(sender As Object, args As System.Diagnostics.DataReceivedEventArgs) 
    If Not args.Data Is Nothing AndAlso Not String.IsNullOrEmpty(args.Data) Then 
     RichTextBox1.Text = args.Data 
    End If 
End Sub 

Private Sub ErrorDataReceivedAsync(sender As Object, args As System.Diagnostics.DataReceivedEventArgs) 
    If Not args.Data Is Nothing AndAlso Not String.IsNullOrEmpty(args.Data) Then 
     RichTextBox2.Text = args.Data 
    End If 
End Sub 

Mais j'ai pas reçu toutes les sorties aux richtextboxes?

J'ai l'impression que cela a quelque chose à voir avec streamReader alors je l'ai supprimé et ça ne fonctionnait toujours pas? Je n'ai plus d'idées de ce que ça pourrait être. Ffmpeg envoie toutes les informations de débogage à StdErr au lieu de StdOut.

+0

Votre application ne plante-t-elle pas sur 'output = StreamReader.ReadToEnd(). ToString'? – BanForFun

+0

Il ne plante pas, mais si je fais RichTextBox1.Text = sortie il se bloque et dit comme le filetage croisé entre les threads, car je multithread le processus principal comme 5 fois. – 1ben99

+0

Je peux simplement invoquer la sortie et tout fonctionne, mais je veux toujours obtenir la sortie en cours en temps réel, car après avoir terminé le flux, il affiche la sortie de ce qui vient de se passer, donc je ne peux pas afficher erreur sortie en direct? – 1ben99

Répondre

0

Utilisez RedirectStandardError sur true et essayez de lire StandardError à partir du processus.

+0

N'y a-t-il pas moyen de voir cette mise à jour? J'ai routé le standarderror pour apparaître dans une zone de texte riche, mais je suppose que le texte n'apparaîtra que lorsqu'une erreur se produit? Est-il impossible de montrer tout le texte de sortie du processus? – 1ben99

+0

Vous pouvez définir un rappel à notifier lorsque de nouvelles données sont disponibles. [Voir cet exemple VB] (https://stackoverflow.com/a/19514271/6347620) – Mike