MPEG-Video von der Befehlszeile trennen?

7911
Tim

Ich habe eine selbstgemachte DVD, auf der ich effektiv versuche, Kapitel einzufügen und neu anzuordnen - der ursprüngliche Autor hat es als ein langes Kapitel gebrannt, und ich möchte es in kleinere Stücke zerlegen und in eine neue DVD umcodieren. Ich habe die DVD mit folgendem Befehl gerippt:

mplayer dvd: // -dvd-device / dev / sr2 -dumpstream -dumpfile raw.vob

Ich verwende Gentoo Linux mit mplayer Version 1.0-rc2_p20090731 (die neueste in Portage verfügbare Version).

Ich habe eine Liste von Zeiten, die die Kapitel umfassen sollen (z. B. 30: 11-33: 25). Mein erster Gedanke war, die gesamte DVD zu rippen und mit mpgtx bestimmte Teile der Datei auszuschneiden. Mein Problem ist, dass das Laufen mpgtx -iin der Datei einige Zeitstempelsprünge anzeigt:

Die Zeitmarken sprangen von 59,753789 auf 0,001622 an Position 1d29800 Die Zeitmarken sprangen von 204963823030450.343750 auf 31.165900 an Position 2d4f800 Die Zeitmarken sprangen von 60.077878 an die Position 43cc000 von 0,001622  Zeitstempel sprangen von 60,024233 auf 0,001622 an Position 65c5000 Zeitstempel sprangen von 204963823068631.718750 auf 52.549244 an Position 7fd1000

Ich habe versucht, die Indizes zu korrigieren mit:

mencoder raw.vob -oac kopiert -ovc kopiert -forceidx -o fixed.vob -of mpeg

Mpgtx wird jedoch weiterhin Probleme mit dem Zeitstempel melden. Meine unmittelbare Frage: Gibt es eine Möglichkeit, den zerrissenen Film, den ich habe, zu nehmen und seine Zeitstempel zu korrigieren, damit ich ihn mit mpgtx schneiden kann? Wenn ich das eine Problem aus dem Weg räumen kann, wird der Rest der DVD reibungslos segeln.

Wenn es nicht möglich ist, die Zeitstempel in dieser Datei zu korrigieren: Gibt es eine bessere Möglichkeit, kleine Stücke der DVD in separate Dateien zu zerlegen, um sie später neu zu kompilieren? Ich würde mir sehr wünschen, dass dies unter Linux gemacht wird, und es wäre noch besser, wenn ich es irgendwie schreiben könnte (füttern Sie eine Liste von Start- und Endpositionen oder starten Sie Zeiten und Dauern, und holen Sie sich eine Reihe von gerissenen Bildern heraus Dateien). Bei Bedarf steht mir auch eine Mac OS X-Maschine zur Verfügung, jedoch kein Windows.

Edit: Ich fand eine andere Lösung mit HandBrake und ffmpeg (mit Hilfe dieser Frage ), aber die Frage steht.

Nochmal editieren : Es hat sich herausgestellt, dass meine andere Lösung nicht ganz funktioniert hat - das Audio wurde um etwa fünf Sekunden in etwa der Hälfte meiner ausgeschnittenen mpgs desynchronisiert - also bin ich wieder auf Platz eins. Jemand?

6

2 Antworten auf die Frage

8
TomB

FFmpeg erledigt das für Sie.

Ihr Befehl könnte ungefähr so ​​aussehen:

Code: ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ss ist der Startpunkt in hh: mm: ss vom Anfang Ihrer Videodatei

-t ist die Zeitdauer in hh: mm: ss Ihres neuen Segments.

Im obigen Beispiel beginnen Sie also 10 Sekunden vom Anfang der Originaldatei und enden 30 Sekunden später.

Wenn Sie mehrere Teile in einem Durchgang erstellen möchten, sollte Folgendes funktionieren:

Code: ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ss 00:00:35 -t 00:00:30 out2.mpg In diesem Beispiel ist das erste Segment Das gleiche wie im ersten Beispiel, aber Sie erstellen auch eine zweite Datei, die bei 35 Sekunden beginnt und 30 Sekunden lang ist.

.

Ja, ffmpeg hat sich für mich als stabiler als Mencoder zum Aufteilen von Streams erwiesen. Wenn Sie jeden Frame zu einem i-Frame machen, können Sie ganz genau teilen: ref: http://en.wikibooks.org/wiki/Mplayer#Split.2Fsub-section_videos Hier ist auch eine lange Liste hier: https: //spreadsheets.google.com/ccc?key=0AjWmZ0umsuZHdHNzZVhuMTkxTHdYbUdCQzF3cE51Snc&hl=de rogerdpack vor 13 Jahren 0
1
Grumbel

Ich habe dies einmal zusammen gehackt, um Video von einer DVD-RAM zu erhalten:

#! /usr/bin/ruby -w  a = [0, 0x37f9800, 0xf3e1800]  filename = "input.vob"  a.each_with_index{|seq_start, i| if seq_start % 1024 != 0 then puts "Error: Blocksize doesn't match 1024" end  seq_end = a[i+1]  if seq_end then puts "dd if=# of=chapter#.mpeg bs=1024 skip=# count=#{(seq_end - seq_start)/1024}" else puts "dd if=# of=chapter#.mpeg bs=1024 skip=#" end } 

Die aVariable nimmt die Positionswerte an, bei denen der Sprung auftritt, und verwendet ddsie nur, um die Datei an diesen Positionen in Stücke zu schneiden. Das Ergebnis sind separate mpeg-Dateien für jedes Kapitel, da der Sprung immer dann erfolgte, wenn die Aufnahme gestoppt und erneut gestartet wurde. Die entstandenen mpeg-Dateien waren sprungfrei und konnten dann wie gewohnt verarbeitet werden.

Das Skript selbst ruft tatsächlich nicht auf dd, es gibt nur die ddBefehle aus, die zum Teilen der Datei erforderlich sind.