
У меня есть самодельный DVD, в который я фактически пытаюсь вставить главы и переставить их местами - оригинальный автор записал его как одну длинную главу, и я хотел бы разорвать его на более мелкие части и перекодировать в новый DVD. Я разорвал DVD с помощью следующей команды:
mplayer dvd:// -dvd-device /dev/sr2 -dumpstream -dumpfile raw.vob
Я использую Gentoo Linux с mplayer версии 1.0-rc2_p20090731 (последняя доступная в Portage).
У меня есть список временных интервалов, которые должны охватывать главы (например, 30:11-33:25), поэтому моей первой мыслью было скопировать весь DVD и использоватьmpgtxчтобы вырезать определенные части файла. Моя проблема в том, что запуск mpgtx -i
файла сообщает о довольно большом количестве скачков временных меток:
Временные метки подскочили с 59,753789 до 0,001622 в позиции 1d29800 Временные метки изменились с 204963823030450.343750 до 31.165900 в позиции 2d4f800 Временные метки подскочили с 60,077878 до 0,001622 в позиции 43cc000 Временные метки подскочили с 60,024233 до 0,001622 в позиции 65c5000 Временные метки изменились с 204963823068631.718750 до 52.549244 в позиции 7fd1000
Я попытался исправить индексы с помощью:
mencoder raw.vob -oac копия -ovc копия -forceidx -o исправлено.vob -of mpeg
Но mpgtx все равно будет сообщать о проблемах с временными метками. Мой первоочередной вопрос: есть ли способ взять рипнутый фильм, который у меня есть, и исправить его временные метки, чтобы я мог вырезать его с помощью mpgtx? Если я смогу решить эту проблему, создание остальной части DVD пройдет гладко.
Если невозможно исправить временные метки в этом файле: есть ли лучший способ риповать небольшие куски DVD в отдельные файлы для последующей перекомпиляции? Я бы очень хотел, чтобы это было сделано на Linux, и было бы еще лучше, если бы я мог как-то написать скрипт (ввести список начальных и конечных позиций или начальных времен и длительностей и получить серию рипованных файлов). Если понадобится, у меня также есть машина Mac OS X, но нет Windows.
Редактировать:В итоге я нашел другое решение, включающееРучной тормозиffmpeg(с помощьюэтот вопрос), но вопрос остается.
Редактировать еще раз:Оказалось, что мое другое решение не совсем сработало — звук рассинхронизировался примерно на пять секунд, примерно на половине отрезанных миль на галлон — так что мне пришлось вернуться к исходной точке. Кто-нибудь?
решение1
FFmpeg сделает это за вас.
Ваша команда может выглядеть примерно так:
Код: ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ss — это начальная точка в формате чч:мм:сс от начала вашего видеофайла.
-t — это продолжительность нового сегмента в формате чч:мм:сс.
Итак, в приведенном выше примере вы начинаете через 10 секунд после начала исходного файла и заканчиваете через 30 секунд.
Если вы хотите создать несколько деталей за один проход, то вам подойдет следующее:
Код: ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ss 00:00:35 -t 00:00:30 out2.mpg В этом примере первый сегмент такой же, как и в первом примере, но вы также создаете второй файл, начинающийся с 35 секунды и имеющий длину 30 секунд.
.
решение2
Однажды я придумал вот такую штуку для извлечения видео с DVD-RAM:
#! /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
}
Переменная a
берет значения позиции, где происходит прыжок, а затем просто использует их dd
для нарезки файла на части в этих позициях. Результатом являются отдельные файлы mpeg для каждой главы, поскольку прыжок происходил всякий раз, когда запись останавливалась и возобновлялась. Полученные файлы mpeg были свободны от прыжок и затем могли обрабатываться как обычно.
Сам скрипт на самом деле не вызывает dd
, он просто выводит dd
команды, необходимые для разрезания файла на части.
решение3
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