ffmpeg flv zu mp3 convertiren

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von slice.

    ffmpeg flv zu mp3 convertiren

    Hey,

    ich wollte mit diesen code

    VB.NET-Quellcode

    1. Using ofd As New OpenFileDialog
    2. ofd.ShowDialog()
    3. Dim ffmpeg As New Process
    4. ffmpeg.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    5. ffmpeg.StartInfo.FileName = Application.StartupPath & "\ffmpeg.exe"
    6. ffmpeg.StartInfo.UseShellExecute = False
    7. ffmpeg.StartInfo.CreateNoWindow = True
    8. ffmpeg.StartInfo.RedirectStandardError = True
    9. ffmpeg.StartInfo.RedirectStandardOutput = True
    10. Dim input As String = ofd.FileName & ".flv"
    11. Dim output As String = Application.StartupPath & "\" & My.Computer.FileSystem.GetName(ofd.FileName) & ".mp3"
    12. ffmpeg.StartInfo.Arguments = (" -i """ & input & """ -sameq """ & output & "")
    13. ffmpeg.Start()
    14. Do Until ffmpeg.HasExited
    15. Loop
    16. ffmpeg.Close()
    17. MsgBox("Das Viedo wurde erfolgreich als mp3 konvertiert.", MsgBoxStyle.Information)
    18. End Using


    eine flv datei zu einer mp3 konvertiren aber es geht nicht also es kommt auch kein fehler -_-

    ich hoffe mir kann jemand helfen

    Lg Sinlyu
    :D
    Erstmal würd ich das verwenden:

    Quellcode

    1. ffmpeg -i "video.flv" -ab 160000 -acodec libmp3lame "video.mp3"


    Im FileName steht schon eine Endung also würde dein input so heißen = "test.flv" & ".flv" und die Datei ist logischerweiße nicht vorhanden.

    Grüße
    sowas in die Richtung:

    VB.NET-Quellcode

    1. deinProcess.StartInfo.UseShellExecute = False
    2. deinProcess.StartInfo.RedirectStandardError = True
    3. deinProcess.Start()
    4. Dim reader As StreamReader = myProcess.StandardError
    5. Do
    6. Dim dieZeile As String = reader.ReadLine()'hier natürlich jede Zeile entsprechend auswerten...
    7. Loop Until dieZeile = String.Empty
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Aber ffmpeg liefert dadurch doch nur Infos über aktuelle frame, fps , size, time und bitrate

    Quellcode

    1. frame= 473 fps= 85 q=12.0 size= 3338kB time=19.10 bitrate=1432.2kbits/s


    Wie kann ich dadurch einen Wert für meine Progressbar auslesen?

    mfg Mike

    EDIT:
    ok dumme Frage bin jetzt selber daraufgekommen

    Durch den StreamReader bekommt man ja folgendes

    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
    ...
    ...
    ...



    Damit kann ich auslesen bei welcher Sekunde ffmpeg gerade ist(fettmarkiert, in diesem Fall 5sek) und wie lange das Video Dauert (Duration, in diesem Fall 4min und 6 sek)

    --> Progressbar Maximum = Videolänge in Sekunden

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „NscMike“ ()

    und wer es gerne asynchron mag kann sich ja an "BeginOutputReadLine" + zugehörigem event probieren (e.Data) :)
    nun gut aber das is ja nu nich ganz so schwer :) hab gerade leider nur c# code aber so ähnlich sollts auch in vb gehen
    ne klasse erstellen + n event das getriggert wird sobald sich der wert ändert

    Quellcode

    1. /// <summary>
    2. /// Detailsview
    3. /// </summary>
    4. public class view : INotifyPropertyChanged
    5. {
    6. private int _IndexID;
    7. public event PropertyChangedEventHandler PropertyChanged;
    8. /// <summary>
    9. /// Row-ID in DATALIST
    10. /// </summary>
    11. public int IndexID
    12. {
    13. get { return _IndexID; }
    14. set { _IndexID = value; this.NotifyPropertyChanged("IndexID"); }
    15. }
    16. // some other var's
    17. /// <summary>
    18. /// Change-Event
    19. /// </summary>
    20. /// <param name="name">Sender</param>
    21. private void NotifyPropertyChanged(string name)
    22. {
    23. if (PropertyChanged != null)
    24. PropertyChanged(this, new PropertyChangedEventArgs(name));
    25. }
    26. }

    danach n neues object erzeugen

    Quellcode

    1. private static view _detailsview = new view();
    2. // some more code
    3. public static view DETAILSVIEW
    4. {
    5. get { return _detailsview; }
    6. set { _detailsview = value; }
    7. }

    und wenn man den wert auf ne textbox zB setzten will kann man sich es richtig einfach machen :) da reicht ne einfache bindung

    Quellcode

    1. txt_IndexID.DataBindings.Add(new Binding("Text", DETAILSVIEW, "IndexID"));


    ps: kann sein das da gerade mehr oder weniger n paar schreibfehler drin sind, aber von der logik her müsste es funktionieren :D

    Nachtrag: achja is vll auch in dem fall nich die beste lösung ^^ gibt sicherlich noch andere die schlanker sind

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „slice“ ()

    Also in C# sieht das irgendwie komplizierter aus.

    In VB gehts ja mit Invoke

    VB.NET-Quellcode

    1. Public Delegate Sub AusfuhrenDelegate(ByVal value As Integer)
    2. Public Sub AusfuhrenValue(ByVal value As Integer)
    3. ProgressBar1.Value = value
    4. Label9.Text = Math.Round(CDbl((100 * value) / ProgressBar1.Maximum), 0).ToString & "%"
    5. End Sub
    6. Public Sub ProgressBarSetValue(ByVal value As Integer)
    7. ProgressBar1.Invoke(New AusfuhrenDelegate(AddressOf AusfuhrenValue), New Object() {value})
    8. End Sub


    EDIT:

    Sehe ich das richtig, dass ich bei jedem konvertierungsvorgang meinen Process wieder as New Process deklarieren muss?
    Weil ansonsten BeginErrorReadLine() nicht funktioniert..

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „NscMike“ ()

    NscMike schrieb:

    [...]

    Sehe ich das richtig, dass ich bei jedem konvertierungsvorgang meinen Process wieder as New Process deklarieren muss?
    Weil ansonsten BeginErrorReadLine() nicht funktioniert..
    nach dem ein vorgang durch ist schließt du doch den prozess wieder? und erstellst wieder einen neuen prozess?

    und kompliziert eher weniger, die sache ist die, dass die snippeds die ich gepostet habe nicht allein für sowas gedacht sind, das war mein ansatz aus einem anderen projekt, das wahrscheinlich nicht ganz so passend ist :)