0
Answer

Getting output from Process

Ask a question
Matthew Bevan

Matthew Bevan

13y
2.3k
1
I load a film clip, use FFmpeg to convert it. That all works but I want to show the Process output within a RichTextBox on my Form. I can output the text to a msgBox but don't get any output to the RichTextBox.
I have attached the code used and would be grateful for any help.

Public MediaFolder As String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\"
    Delegate Sub SetTextCallback(ByVal [text] As String)

    'openfiledialog to load film clip for conversion
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            If OpenFileDialog1.FileName <> "" Then
                'takes the film, file, and concerts to avi and places in media tmp_videos folder
                Dim ffmpegProg As String = Application.StartupPath & "\ffmpeg.exe"
                Dim FilmSource As String
                Dim FilmDestination As String
                FilmSource = Replace(OpenFileDialog1.FileName, "\", "\\")
                FilmSource = Chr(34) & FilmSource & Chr(34)
                FilmDestination = Chr(34) & MediaFolder & "test.avi" & Chr(34)
                FilmDestination = Replace(FilmDestination, "\", "\\")

                Dim myProcess As System.Diagnostics.Process = New System.Diagnostics.Process()
                myProcess.StartInfo.UseShellExecute = False
                myProcess.StartInfo.CreateNoWindow = True
                myProcess.StartInfo.FileName = ffmpegProg
                myProcess.StartInfo.Arguments = " -i " & FilmSource & " -target pal-dvd -y " & FilmDestination
                myProcess.StartInfo.RedirectStandardOutput = True
                myProcess.StartInfo.RedirectStandardInput = True
                myProcess.StartInfo.RedirectStandardError = True
                myProcess.EnableRaisingEvents = True
                AddHandler myProcess.OutputDataReceived, AddressOf Me.HandleProcessOutput
                AddHandler myProcess.ErrorDataReceived, AddressOf Me.StandardErrorHandler

                ' myProcess.OutputDataReceived += New DataReceivedEvent.Handler(myProcess_OutputDataReceived)
                myProcess.Start()
                myProcess.BeginOutputReadLine()
                myProcess.BeginErrorReadLine()
                    myProcess.WaitForExit()
                    myProcess.Close()
                    RichTextBox1.Text = "finished"
            End If
        End If
    End Sub

    'Output sub
    Private Sub HandleProcessOutput(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs)
        SetText(e.Data)
    End Sub
    'Error handling
    Private Sub StandardErrorHandler(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs)
        SetText(e.Data)
    End Sub
    'check which threads 
    Private Sub SetText(ByVal [text] As String)
        If Me.RichTextBox1.InvokeRequired Then
            Dim d As New SetTextCallback(AddressOf SetText)
            Me.Invoke(d, New Object() {[text]})
        Else
            Me.RichTextBox1.Text = [text]
        End If
    End Sub