MPEG-Video über die Befehlszeile aufteilen?

MPEG-Video über die Befehlszeile aufteilen?

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 -ibeim 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 aVariable nimmt die Positionswerte, an denen der Sprung auftritt, und verwendet sie dann einfach, ddum 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 ddBefehle 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

verwandte Informationen