
Ich habe eine selbstgemachte DVD, in die ich im Grunde Kapitel einfügen und sie neu anordnen möchte. Der ursprüngliche Autor hat sie als ein langes Kapitel gebrannt und ich möchte sie in kleinere Stücke zerlegen und sie dann in eine neue DVD neu kodieren. Ich habe die DVD mit dem folgenden 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 mit den Kapitelzeiten (z. B. 30:11-33:25), also war mein erster Gedanke, die gesamte DVD zu rippen und zu verwendenmpgtxum bestimmte Teile der Datei auszuschneiden. Mein Problem ist, dass mpgtx -i
beim Ausführen der Datei einige Zeitstempelsprünge gemeldet werden:
Die Zeitstempel sprangen von 59,753789 auf 0,001622 an Position 1d29800 Zeitstempel sprangen von 204963823030450.343750 auf 31.165900 an Position 2d4f800 Die Zeitstempel sprangen von 60,077878 auf 0,001622 an Position 43cc000 Die Zeitstempel sprangen von 60,024233 auf 0,001622 an Position 65c5000 Die Zeitstempel sprangen von 204963823068631.718750 auf 52.549244 an Position 7fd1000
Ich habe versucht, die Indizes mit Folgendem zu reparieren:
mencoder raw.vob -oac kopieren -ovc kopieren -forceidx -o fixed.vob -of mpeg
Aber mpgtx meldet immer noch Zeitstempelprobleme. Meine unmittelbare Frage: Gibt es eine Möglichkeit, den gerippten Film, den ich habe, zu nehmen und seine Zeitstempel zu korrigieren, damit ich ihn mit mpgtx schneiden kann? Wenn ich dieses eine Problem aus dem Weg räumen kann, wird das Erstellen des Rests der DVD ein Kinderspiel sein.
Wenn es nicht möglich ist, die Zeitstempel dieser Datei zu korrigieren: Gibt es eine bessere Möglichkeit, kleine Teile der DVD in separate Dateien zu rippen, um sie später neu zu kompilieren? Ich würde das sehr gerne unter Linux machen, und es wäre noch besser, wenn ich es irgendwie skripten könnte (eine Liste mit Start- und Endpositionen oder Startzeiten und -dauern eingeben und eine Reihe gerippter Dateien erhalten). Bei Bedarf habe ich auch einen Mac OS X-Rechner zur Verfügung, aber kein Windows.
Bearbeiten:Ich habe schließlich eine andere Lösung gefunden, dieHandbremseUndffmpeg(mit Hilfe vondiese Frage), aber die Frage bleibt bestehen.
Nochmals bearbeiten:Es stellte sich heraus, dass meine andere Lösung nicht richtig funktionierte – bei etwa der Hälfte meiner geschnittenen MPGs war der Ton um etwa fünf Sekunden desynchronisiert – ich bin also wieder am Anfang. Hat jemand Lust darauf?
Antwort1
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 dasselbe wie im ersten Beispiel, aber Sie erstellen auch eine zweite Datei, die bei 35 Sekunden beginnt und 30 Sekunden lang ist.
.
Antwort2
Ich habe das hier mal zusammengehackt, um ein Video von einer DVD-RAM zu bekommen:
#! /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=#{filename} of=chapter#{i+1}.mpeg bs=1024 skip=#{seq_start/1024} count=#{(seq_end - seq_start)/1024}"
else
puts "dd if=#{filename} of=chapter#{i+1}.mpeg bs=1024 skip=#{seq_start/1024}"
end
}
Die a
Variable nimmt die Positionswerte, an denen der Sprung auftritt, und verwendet sie dann einfach, dd
um die Datei an diesen Positionen in Stücke zu schneiden. Das Ergebnis sind dann separate MPEG-Dateien für jedes Kapitel, da der Sprung jedes Mal auftrat, wenn die Aufnahme gestoppt und neu gestartet wurde. Die resultierenden MPEG-Dateien waren sprungfrei und konnten dann wie gewohnt verarbeitet werden.
Das Skript selbst ruft nicht auf dd
, sondern gibt nur die dd
Befehle aus, die zum Aufteilen der Datei in Stücke erforderlich sind.
Antwort3
num=1
offset=0
divide="Title:"
divide="Chapter:"
input="VTS_01_1.VOB|VTS_01_2.VOB|VTS_01_3.VOB|VTS_01_4.VOB|VTS_01_5.VOB|VTS_01_6.VOB"
#|VTS_01_7.VOB|VTS_01_8.VOB|VTS_01_9.VOB"
for len in $(lsdvd -c VIDEO_TS | grep "$divide" | awk -F' +|,' '/Length:/ { print $5 }')
do
ss=$(date -u -d "@$offset" +%T.%3N)
echo $num $ss $len
cd VIDEO_TS
#ffmpeg -ss $ss -i "concat:$input" -t $len -c copy ../$(printf "%02d" $num).VOB 2>/dev/null
ffmpeg -ss $ss -i "concat:$input" -map 0:1 -map 0:3 -t $len -acodec copy -vcodec libx264 ../$(printf "%02d" $num).mp4 2>/dev/null
cd ..
len=$(date -u -d "1970-01-01 $len" +%s.%3N)
offset=$( echo "$offset + $len" | bc )
num=$((num+1))
done