DVD/IFO - Kapitelmarken auslesen mit VB .NET

  • Hallo zusammen!

    Ich muss aus einer IFO-Datei die gesetzten Kapitelmarken auslesen. Da scheint es ja viele verschiedene Ansätze zu geben.

    Hier http://forums.kustompcs.co.uk/archive/index.php/t-32987.html findet man z.B. eine Diskussion über das parsen einer IFO-File mit Link zu einer VB-Klasse. Diese in VB .NET zu verwenden habe ich aber nicht geschafft.

    Dann bin ich auf vstrip gestoßen. Gibt es ja als exe und dll.
    http://forum.doom9.org/archive/index.php/t-103449.html Dort wird über das Problem diskutiert, diese DLL in VB zu nutzen. Ich bin dort auch nicht weitergekommen und stoße auf das selbe Problem.

    Die vstrip.exe habe ich inzwischen auch. Kann man damit auf Kommandozeilenebene eine IFO-Datei als Parameter übergeben und die Kapitel anzeigen lassen?
    Also ähnlich wie beim ChapterXtractor?

    Im Prinzip brauche ich nur die Anzahl und Zeiten der einzelnen Chapter. Ein komplettes Parsen der IFO-Datei ist nicht nötig, mir reichen diese Infos. Daher könnte ich auch z.B. vstrip.exe aus VB aufrufen und die Rückgabe analysieren wenn dort die Kapitelmarken drin stehen.

    Hat jemand eine Idee wie ich an die Kapitelmarken herankomme?

    Vielen Dank schon mal!

  • Dann müsste er aber ChapterXtractor mitliefern.

    borax - was hast du dagegen, dass jemand IFO-Dateien mit einem eigenen Programm lesen will? Thema des Beitrags ist doch eher "wie" als "warum".

    Dass es allerdings nicht trivial ist, darüber sind wir uns sicher einig. Und leicht sind die dazu nötigen Spezifikationen wohl auch nicht zu finden. Vielleicht lohnt sich dafür ein Zugang zu "DVD Replica".

  • Ich wusste garnicht, dass man ChapterXtractor auch per Command Line nutzen kann...hab das jetzt mal getestet und es würde theoretisch schon funktionieren.

    Allerdings stimmt es, was LigH meint...ich will nicht unbedingt ChapterXtractor mitliefern müssen...klar, wenn es anders viel zu komplex ist dann wäre das sozusagen die Notlösung.

    Lieber wäre es mir, dass ich kein externes Programm brauche sondern selbst in VB .NET die IFO-Datei parse. Spezifikationen habe ich sogar...aber einen kompletten IFO-Parser anhand der Spezifikationen zu erstellen hatte ich nicht vor, weil ich eben auch nur die Kapitel brauche, das wäre meine Meinung nach Overkill. Und was noch entscheidender ist: ich glaube nicht dass ich es schaffe :)

    Unter dem ersten Link findet man z.B. eine VB6-Klasse...nach Portierung auf VB NET gibt es aber leider Overflows und ich finde nicht heraus, an welcher Stelle im Code die Ursache dafür liegt.

    Ich weiß nicht ob man den Code hier posten darf...und ob jmd diese Klasse auf .NET portieren könnte? Vielleicht braucht ja noch jemand so ein Feature und würde sich da mal durcharbeiten? :)

  • Damit hatte ich mich auch schon Beschäftigt, geht mir nicht anders.
    Für VB.NET finde ich nur Bruchstücke mit denen ich auch nicht wirklich was anfangen kann, da müßte
    man sich wirklich intensiver mit beschäftigen aber dafür fehlt mir die Ausdauer.

  • Hi!

    Da bin ich ja beruhigt dass ich nicht der einzige bin, der nicht weiterkommt.
    Vielleicht kriegen wir das ja zusammen hin...

    Ich hab inzwischen eine Klasse für das IFO-Parsing. Weiß allerdings nicht, ob ich die auch verwenden darf...ich habe sie zu Lehrzwecken dekompiliert aus clad DVD...:so-nicht:

    Allerdings ist in dieser Klasse keine Funktion enthalten, um die einzelnen Zeiten der Kapitel auszulesen. Es wird nur die Gesamtlänge des Titles angezeigt und wie viele Kapitel enthalten sind...Details zu den Kapiteln gibt es leider nicht...

    Vielleicht kann jmd der die Spezifikationen kennt und versteht die Klasse um diese Funktion erweitern?

  • Fr_An

    danke für die Links. Hab mir die Projekte mal angeschaut...aber der pal-ntsv Konverter verwendet z.B. auch den ChapterXtractor...der Entwickler ist wohl auch nicht weitergekommen und auf die selbe Probleme gestoßen ;)

  • Kapitelmarken will ich Garnicht auslesen mir reicht eigentlich Spielzeit und ein Paar andere Sachen
    ich bin da etwas anspruchsloser. Perfekt währe wenn man sowas mit der MediaInfo.dll auslesen könnte.

    Ich wußte Garnicht das man VB.NET Überhaupt decompilieren kann, zumindest vermute ich das der Code
    dann nicht dem original entspricht.
    Sowas ist für einen Hobbyprogramierer wie mich ja Peinlich. Zwischen den Code eines Profi und meinen liegen Welten,
    jetzt weiß ich auch warum ich immer glaube ein lachen zu hören :D

    Ich suche mal noch etwas, ich hatte mal auf einer Portugiesischen Seite ? interesannten leider auch unvollständigen
    Code gefunden hat mir auch nicht wirklich geholfen.

  • Das Dekompilieren geht leider - oder in diesem Fall zum Glück - erschreckend gut. Ich habe die komplette Klasse in VB-Quellcode, lesbar, mit allen Funktionsnamen, Variablen etc.

    Kannst Du ja mal mit der EXE eines eigenen VB-Projekts probieren. Hier der Link zum Decompiler, ist sogar in einer Community Version momentan noch Freeware:

    http://www.red-gate.com/products/reflector/

    Kleiner Tipp: Wenn der Reflector beim Starten erstmal scheinbar nichts macht, dann einfach ein paar Minuten warten...irgendwann geht's los ;)

  • Für den Download wollen die meine Email-Adresse das disqualifiziert den Download für mich, so genau will ich das nicht wissen :)
    Wenn man Quellcode derart leicht Decompilieren kann dann kann man sich ja vorstellen was passiert wenn man
    den unerlaubt benutzt ;)

  • zu früh gefreut...

    Was sind denn das bitte für Zeiten? Seit wann gibt's mehr als 25 Frames bei PAL?
    Hat jemand eine Ahnung wie ich an ordentliche Zeiten komme??

    Danke nochmal!

  • Hi,

    das am Ende sind keine Framenummern sondern Millisekunden. Wenn Du die jeweilige Angabe durch 4 teilst, erhältst Du die Framenummer.

    Grüße

    darkframe

  • Zitat

    Wenn Du die jeweilige Angabe durch 4 teilst, erhältst Du die Framenummer.


    Solange es 25fps sind. Bei NTSC wird es 'grausam' (drop frame/non drop frame, pulldown flags...). Aber AFAIRC kann man beim chapterXtractor das erwünschte Format angeben. Sollte also auch gleich hh:mm:ss.ff ausgeben können.

  • Danke Euch, mit einem Preset in der ini-Datei vom Chapterxtractor geht's. Beim Aufruf über die Kommandozeile kann man dann die Nummer des Presets angeben.

    Grüße!

  • Und hier ist nun meine VB-Klasse mit der die Chapter extrahiert werden, vielleicht bringt's jemandem was:

    Code
    Public Class ClassDVDChapter    Public ChapterCount As Long    Public ChapterTimes As List(Of String)    Private MyProcess As Process    Private chapterXtractor As String    Private Const vbQuote = """"    Public Sub New(Optional ByVal chapterpath As String = "")        If chapterpath = "" Then chapterpath = Application.StartupPath        chapterXtractor = chapterpath + "\ChapterXtractor.exe"    End Sub    Public Sub GetChapters(ByVal IFO As String)        ChapterCount = 0        ChapterTimes = New List(Of String)        If My.Computer.FileSystem.FileExists(IFO) Then            Dim TargetFile As String = Application.StartupPath + "\cxtempoutput.txt"            If My.Computer.FileSystem.FileExists(TargetFile) Then My.Computer.FileSystem.DeleteFile(TargetFile)            'Prozess starten            Dim clsStartInfo As New System.Diagnostics.ProcessStartInfo            clsStartInfo.FileName = vbQuote + chapterXtractor + vbQuote            clsStartInfo.Arguments = vbQuote + IFO + vbQuote + " " + vbQuote + TargetFile + vbQuote + " -p1"            clsStartInfo.UseShellExecute = False            clsStartInfo.CreateNoWindow = True            clsStartInfo.WindowStyle = ProcessWindowStyle.Hidden            MyProcess = Diagnostics.Process.Start(clsStartInfo)            MyProcess.WaitForExit()            If My.Computer.FileSystem.FileExists(TargetFile) Then                'Datei einlesen                Dim content() As String = My.Computer.FileSystem.ReadAllText(TargetFile).Split(vbCrLf)                My.Computer.FileSystem.DeleteFile(TargetFile)                For Each line As String In content                    If line.Trim <> "" Then                        ChapterCount += 1                        ChapterTimes.Add(line.Trim)                    End If                Next            Else                Return            End If        End If    End SubEnd Class

    Im chapterpath muss die exe-Datei, die vstrip.dll-Datei und eine ChapterXtractor.INI Datei mit folgendem Inhalt liegen:

    Code
    [Presets]Preset 1=Preset 1Format 1=%hh:%mm:%ss:%ff\nHeader 1=Footer 1=

    Aufgerufen wird die Klasse z.B. so:

    Code
    Chapters = New ClassDVDChapter("Path\to\chapterxtractor")
    Chapters.GetChapters("E:\VIDEO_TS\VTS_01_0.IFO")
    
    
    If Chapters.ChapterCount > 1 Then
       'Kapitel gefunden
       'Kapitelzeiten stehen in der Liste Chapters.ChapterTimes
    End If

    Viel Spaß damit ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!