Bonsoir à tous,
J'ai écris un programme pour convertir des vidéos avec ffmpeg.exe et j'ai enfin réussi à lire les messages de sorties de ce processus. Le but est d'afficher la progression sur un formulaire "frmProgress" spécialement dédié à cet usage.
Problème :
1- J'arrive à afficher les messages de sorties dans la fenêtre Debug de Visual Studio mais je n'ai rien qui s'affiche dans mon formulaire frmProgress qui contient un RichTextBox.
2- Quelle est la méthode la plus propre pour passer les paramètres de progression à mon formulaire ?. Pour l'instant j'ecrits directement dans le RichTextBox pour faire des essais, par la suite je ferais une barre de progression + un label calculé à partir de la chaine de caractére retournée (voir ci-dessous).
3- Le processus me retourne un string toute les secondes environ du style :
"frame= 4169 fps= 81 q=39.0 size= 10513kB time=00:01:22.74 bitrate=1040.8kbits/s dup=2134 drop=0". Je pense faire une analyse cette chaine de caractère pour extraire la valeur 'frame' ou 'time' qui me servira d'indication de progression, la sortie se compose egalement d'autres chaines de caractères qui retourne par exemple quelques lignes d'erreurs (je vais devoir ignorer les chaines qui commence par Error:.....) est ce que c'est bien comme cela que l'on procède habituellement concernant ce principe d'extraction des infos de progression ?
Le code exécuté dés que je lance la conversion depuis le formulaire principal :
Les évenements pour capturer la sortie du processus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 Private Sub ShellExecute(ByVal ExeFile As String, CommandLine As String) Dim MonProcess As New Process AddHandler MonProcess.OutputDataReceived, AddressOf OutputDataReceived AddHandler MonProcess.ErrorDataReceived, AddressOf ErrortDataReceived MonProcess.StartInfo.FileName = ExeFile MonProcess.StartInfo.Arguments = CommandLine 'MonProcess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized MonProcess.StartInfo.CreateNoWindow = True ' True MonProcess.StartInfo.UseShellExecute = False ' False MonProcess.StartInfo.RedirectStandardOutput = True MonProcess.StartInfo.RedirectStandardInput = True MonProcess.StartInfo.RedirectStandardError = True MonProcess.Start() frmProgress.Show() MonProcess.BeginOutputReadLine() MonProcess.BeginErrorReadLine() MonProcess.WaitForExit() MonProcess.Close() End Sub
Merci à tous pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Private Sub OutputDataReceived(sender As Object, e As System.Diagnostics.DataReceivedEventArgs) Try frmProgress.RichTextBox1.Text += e.Data.ToString frmProgress.RichTextBox1.Text += Environment.NewLine Debug.Print(e.Data.ToString) Catch ex As Exception End Try End Sub Private Sub ErrortDataReceived(sender As Object, e As System.Diagnostics.DataReceivedEventArgs) Try frmProgress.RichTextBox1.Text += e.Data.ToString frmProgress.RichTextBox1.Text += Environment.NewLine Debug.Print(e.Data.ToString) Catch ex As Exception End Try End Sub
Partager