Mehrere .vob-Dateien zu einer .mpg-Datei mit VB 2010

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von lowe.

    Mehrere .vob-Dateien zu einer .mpg-Datei mit VB 2010

    Hallo da draußen,

    als VB 2010 Anfänger habe ich ein kleines (für mich großes) Problem wobei Ihr mir sicher einfach helfen könnt.

    Also hier mein Problem:

    Ich möchte mehrere Dateien vom Typ .vob zu einer einzigen .mpg-Datei zusammenfügen.
    Bisher habe ich dieses in der Konsole durch aufwendiges tippen (komplette Pfadangabe usw.) realisiert.
    z.B.
    copy /b File1.vob + File2.vob + File3.vob ziel.mpg

    In mühsamer kleinarbeit habe ich mir mit VB nun ein kleines Toll "gebastelt" womit ich einen Quellordner wählen kann, Dateien hinzufügen/löschen und die Reihenfolge durch verschieben festlegen kann. Jetzt fehlt mir noch eine Kopierfunktion wie oben, die
    ich durch einen Button-klick ausführen kann.
    Den kompletten Quellpfad habe ich mir durch Schleifen zusammengestellt und in einen String (Quelle) geschrieben.
    Solange der Quellpfad aus nur einer Datei besteht, klappt es wunderbar mit System.IO.File.Copy(Quelle, Ziel).
    Aber dieses + File.vob ... (wie in der Konsole) akzeptiert er halt nicht.

    Ich hoffe sehr das jemand eine Lösung für mich hat!

    Gruß Eyk

    PS: Auch Stundenlanges suchen in verschiedenen Foren und bei Onkel Google hat bisher leider nichts gebracht :S
    Hmm, danke für eure bisherigen Antworten ...

    Versuche mich gerade noch ein wenig zu dem Thema StreamReader und Writer einzulesen.
    Allerdings sind die Dateien von einem DVD-Camcorder und doch relativ groß (je ca. 250 bis 500 MB) und es
    kommen schnell mal 3 bis 4 GB zusammen. Mein TV (über USB-HDD) spielt die einzelnen Dateien aber nie in der richtigen Reihenfolge ab, weshalb ich die Dateien immer zusammengefügt habe (auch wegen des übersichtlicheren Festplatteninhaltes).
    Nun wollte ich es mir mit dem VB Tool leichter machen, aber ....

    Frage:
    Warum klappt das hier nicht?

    Process.Start("cmd.exe", "copy /b" + Quelle + Ziel)

    Quelle und Ziel sind jeweils Strings mit z.B. folgendem Inhalt:
    C:\Dokumente und Einstellungen\Administrator\Desktop\test\test.vob

    Er öffnet zwar die Konsole, aber zeigt den Pfad meines VB Projektes an und startet den Befehl copy nicht.
    Vielen lieben Dank @ Manawyrm

    Er führt nun zwar den Befehl ohne Abbruch aus, aber ich kann das Ergebnis (die Zieldatei) nirgends finden.
    Habe meine Quell und Ziel Strings nochmal überprüft und diese scheinen richtig zu sein.
    Wofür steht das /C ?
    Kann ich die Konsole irgendwie geöffnet halten um den zuletzt ausgeführten Befehl zu überprüfen?

    Naja, nun erstmal Feierabend! Werde Morgen nochmal etwas rumprobieren.

    Gute Nacht und vielen Dank erstmal soweit ...
    Tausend Dank @ Manawyrm :!:

    Hatte ein " (chr(34)) übersehen, aber nun hat es nach unzähligen Versuchen endlich geklappt!

    Muss den Code noch ein wenig aufräumen und dann läuft nun alles ...

    VB.NET-Quellcode

    1. quelle = Chr(34) + zielliste(1) + Chr(34)
    2. ....
    3. - Schleife -
    4. ..
    5. quelle = quelle + " + " + Chr(34) + zielliste(i) + Chr(34)
    6. ....
    7. - Ende Schleife -
    8. ..
    9. ziel = ziel + "\versuch.txt"
    10. ....
    11. ...
    12. ..
    13. quelleziel = quelle + " " + Chr(34) + ziel + Chr(34)
    14. ....
    15. ...
    16. ..
    17. Process.Start("cmd.exe", "/k copy /b " + quellziel)


    Nochmal vielen Dank! :thumbsup:

    Manawyrm schrieb:

    Ich hab die StreamReader Methode überings gerade getestet.
    Ist MEGA langsam. (300KB/s *kotz*)
    Hast du möglicherweise Byte für Byte ausgelesen? Das ist in der Tat langsam, aber normalerweise ließt man mit einem Buffer aus, was wesentlich schneller geht. Da braucht man den copy-Befehl nicht.
    (Ich weiß, dass das Thema schon erledigt ist, aber imho ist das Starten eines externen Programms nicht die optimale Lösung).

    Viele Grüße, Phil.

    Nachtrag: Projekt mit Filestream verwirklicht.

    Das Thema ist zwar schon älter und es ist als abgeschlossen notiert, aber ich habe das Projekt mal mit Filestream Objekten umgesetzt.
    Es handelt sich um eine winform mit 3 Buttons (btnSourcefiles, btnTargetfile, btnMerge), 2 Labels (
    lblSize, lblDuration), 1 OpenFileDialog und einem SaveFileDialog.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Math
    3. Imports System.Windows.Forms
    4. Public Class Main
    5. Private Sub btnSourcefiles_Click(sender As System.Object, _
    6. e As System.EventArgs) Handles btnSourcefiles.Click
    7. If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    8. If SaveFileDialog1.FileName <> "" Then btnMerge.Enabled = True
    9. Dim lngSize As Double
    10. For Each sFile As String In OpenFileDialog1.FileNames()
    11. lngSize += My.Computer.FileSystem.GetFileInfo(sFile).Length
    12. Next sFile
    13. lblSize.Text = CStr(Round(lngSize / (1024 * 1024), 2)) & " MB"
    14. End If
    15. End Sub
    16. Private Sub btnTargetfile_Click(sender As System.Object, _
    17. e As System.EventArgs) Handles btnTargetfile.Click
    18. If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
    19. If OpenFileDialog1.FileName <> "" Then btnMerge.Enabled = True
    20. End If
    21. End Sub
    22. Private Sub Form1_Load(sender As System.Object, _
    23. e As System.EventArgs) Handles MyBase.Load
    24. btnMerge.Enabled = False
    25. End Sub
    26. Private Sub btnMerge_Click(sender As System.Object, _
    27. e As System.EventArgs) Handles btnMerge.Click
    28. Dim fsTarget As FileStream
    29. Dim fsSource As FileStream
    30. Dim sFile As String
    31. Dim ts As TimeSpan
    32. Dim oStart As Date = Now()
    33. Me.Cursor = Cursors.WaitCursor
    34. Try
    35. fsTarget = New FileStream(SaveFileDialog1.FileName, IO.FileMode.OpenOrCreate, _
    36. IO.FileAccess.ReadWrite)
    37. For Each sFile In OpenFileDialog1.FileNames()
    38. Try
    39. fsSource = New FileStream(sFile, IO.FileMode.Open, IO.FileAccess.Read)
    40. fsTarget.Seek(0, IO.SeekOrigin.End)
    41. fsSource.CopyTo(fsTarget)
    42. fsTarget.Flush()
    43. fsSource.Close()
    44. Catch except As Exception
    45. MessageBox.Show(except.Message)
    46. Exit For
    47. End Try
    48. Next sFile
    49. fsTarget.Close()
    50. fsSource.Close()
    51. Catch ex As Exception
    52. MessageBox.Show(ex.Message)
    53. End Try
    54. Me.Cursor = Cursors.Default
    55. ts = Now.Subtract(oStart)
    56. lblDuration.Text = ts.Days.ToString & " Tage " & ts.Hours.ToString & ":" & _
    57. ("00" & ts.Minutes.ToString).Substring(2 - ts.Minutes.ToString.Length, 2) & _
    58. ":" & ("00" & ts.Seconds.ToString).Substring(2 - ts.Seconds.ToString.Length, 2) & _
    59. "," & ts.Milliseconds.ToString & " Stunden"
    60. btnMerge.Enabled = False
    61. End Sub
    62. End Class


    Beim Austesten des Programms war die Geschwindigkeit immer über 33 MB/s. Als Gegentest habe ich auf der Kommandozeile das Zusammenführen mit "copy /B ..." ausgeführt. Die Kommandozeile war meistens nur einen Tick schneller.

    :) Liebe Grüße Lothar