FFMPEG Fortschritt anzeigen lassen Problem

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Regular_vb_user.

    FFMPEG Fortschritt anzeigen lassen Problem

    Guten Tag alle,


    Ich wollte einen kleinen Converter erstellen, der es mir erlaubt Videos zu .mp3 zu Konvertieren. Das funktioniert auch schon alles ziehmlich gut nur habe ich ein Problem mit der Fortschrittsanzeige. Ich lese den Fortschritt aus dem ErrorOutput des Prozesses aus, nur weiß ich nicht so ganz, wie ich das tun soll.

    Hier mal mein Code:


    VB.NET-Quellcode

    1. Private Withevents FFMPEG as new Process
    2. Private Sub wc_DownloadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles wc.DownloadFileCompleted
    3. With FFMPEG
    4. .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    5. .StartInfo.FileName = "Content\ffmpeg.exe"
    6. .StartInfo.UseShellExecute = False
    7. .StartInfo.CreateNoWindow = True
    8. .StartInfo.RedirectStandardError = True
    9. .StartInfo.RedirectStandardOutput = True
    10. Dim Input As String = dwnFile
    11. Dim Output As String = "C:\Users\....\Desktop\" & yts.VideoTitle.ToString
    12. .StartInfo.Arguments = ("-i " & Chr(34) & Input & Chr(34) & " -ab 160000 -acodec libmp3lame " & Chr(34) & Output & ".mp3" & Chr(34))
    13. .Start()
    14. .BeginOutputReadLine()
    15. Do Until .HasExited
    16. Loop
    17. End With
    18. Try
    19. IO.File.Delete(dwnFile)
    20. Catch ex As Exception
    21. MsgBox(ex.ToString())
    22. End Try
    23. End Sub
    24. Private Sub FFMPEG_ErrorDataReceived(sender As Object, e As DataReceivedEventArgs) Handles FFMPEG.ErrorDataReceived
    25. ' Und hier wird der ErrorOutput ausgegeben. Nur der sieht ungefähr so aus: (Siehe unten)
    26. End Sub


    Spoiler anzeigen


    FFmpeg version SVN-r18709, Copyright (c) 2000-2009 Fabrice Bellard, et al.
    configuration: --enable-memalign-hack --prefix=/mingw --cross-prefix=i686-mingw32- --cc=ccache-i686-mingw32-gcc --target-os=mingw32 --arch=i686 --cpu=i686 --enable-avisynth --enable-gpl --enable-zlib --enable-bzlib --enable-libgsm --enable-libfaac --enable-libfaad --enable-pthreads --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libmp3lame --enable-libopenjpeg --enable-libxvid --enable-libschroedinger --enable-libx264
    libavutil 50. 3. 0 / 50. 3. 0
    libavcodec 52.27. 0 / 52.27. 0
    libavformat 52.32. 0 / 52.32. 0
    libavdevice 52. 2. 0 / 52. 2. 0
    libswscale 0. 7. 1 / 0. 7. 1
    built on Apr 28 2009 04:04:42, gcc: 4.2.4

    Seems stream 0 codec frame rate differs from container frame rate: 50.00 (50/1) -> 25.00 (25/1)
    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'C:\Users\Mike\Videos\Jessie J - Price Tag (feat. B.o.B).mp4':
    Duration: 00:04:06.32, start: 0.000000, bitrate: 455 kb/s
    Stream #0.0(und): Video: h264, yuv420p, 640x360 [PAR 1:1 DAR 16:9], 25 tbr, 25 tbn, 50 tbc
    Stream #0.1(und): Audio: aac, 44100 Hz, stereo, s16
    Output #0, mp4, to 'C:\Users\Mike\Desktop\test.mp4':
    Stream #0.0(und): Video: mpeg4, yuv420p, 1280x720 [PAR 1:1 DAR 16:9], q=2-31, 1000 kb/s, 99 tbn, 99 tbc
    Stream #0.1(und): Audio: libfaac, 48000 Hz, stereo, s16, 128 kb/s
    Stream mapping:
    Stream #0.0 -> #0.0
    Stream #0.1 -> #0.1
    Press [q] to stop encoding
    frame= 39 fps= 0 q=31.0 size= 226kB time=1.15 bitrate=1608.7kbits/s
    frame= 89 fps= 88 q=12.0 size= 368kB time=2.99 bitrate=1009.6kbits/s
    frame= 138 fps= 91 q=7.4 size= 530kB time=5.08 bitrate= 855.8kbits/s


    Dank an NscMike für die Info. Nun meine Frage, wie kann ich jetzt aus dem Punkt Duration und time die verbleibende "Value" berechnen, um sie in einer Progressbar anzeigen zu lassen ?

    Danke im Voraus ;)

    Gruß OneWorld
    Youtube Info Library 2013 jetzt im Showroom.
    EDIT://


    1. Änder dein .BeginOutputReadLine() in .BeginErrorReadLine()

    2. Füge im Event FFMPEG.ErrorDataReceived dass hinzu :

    VB.NET-Quellcode

    1. If Not e.Data Is Nothing Then
    2. Dim Line As String = e.Data.ToString : Static Duration As Double
    3. If Line.Contains("Duration:") Then
    4. Dim str As String = Line.Substring(Line.IndexOf(":") + 2)
    5. Duration = TimeSpan.Parse(str.Remove(str.IndexOf(","))).TotalSeconds
    6. ElseIf Line.Contains("time=") Then
    7. Dim str As String = Line.Substring(Line.IndexOf(":") - 2)
    8. Dim Percent As Integer = Convert.ToInt32(TimeSpan.Parse(str.Remove(str.IndexOf("b") - 1)).TotalSeconds / Duration * 100) 'percent ist dein Fortschritt in %
    9. If Percent > 0 Then
    10. ProgressBar1.Value = Percent
    11. End If
    12. End If
    13. End If


    MFG Tibiamicus :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tibiamicus“ ()

    Hey, VB-Paradise Com.
    Ich bin ebenfalls an einem kleinen Converter Programm dran (mit Hilfe von FFMPEG.exe)
    Dazu habe ich einige verschiedene Programmiercodes versucht um den Output in einer Textbox auszulesen...
    Ich mache das ganze mit regex und es klappt gut. Aber deine variante sieht auch viel versprechend aus :)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Regular_vb_user“ ()