Сплит MPEG видео из командной строки?
У меня есть самодельный 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 в позиции 43 куб. Отметки времени подскочили с 60.024233 до 0.001622 в позиции 65c5000 Отметки времени подскочили с 204963823068631.718750 до 52,549244 в позиции 7fd1000
Я пытался исправить индексы, используя:
mencoder raw.vob -oac copy -ovc copy -forceidx -o fixed.vob -of mpeg
Но mpgtx по-прежнему будет сообщать о проблемах с отметкой времени. Мой непосредственный вопрос: есть ли способ взять разорванный фильм, который у меня есть, и исправить его временные метки, чтобы я мог вырезать его с помощью mpgtx? Если я смогу устранить эту проблему, создание остальной части DVD будет плавным.
Если невозможно исправить временные метки в этом файле: есть ли лучший способ скопировать небольшие фрагменты DVD-диска в отдельные файлы для последующей перекомпиляции? Мне бы очень хотелось, чтобы это было сделано в Linux, и было бы еще лучше, если бы я мог как-то написать его сценарий (ввести список начальных и конечных позиций или время начала и продолжительность, и вытащить серию разорванных строк). файлы). При необходимости у меня также есть Mac OS X, но нет Windows.
Изменить: я нашел другое решение с участием HandBrake и ffmpeg (с помощью этого вопроса), но вопрос остается.
Редактирование еще раз: Оказывается, мое другое решение не вполне сработало - звук десинхронизировался примерно на пять секунд, примерно на половине моих обрезанных миль на галлон - так что я вернулся к исходной точке. Кто-нибудь?
2 ответа
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 секунд.
,
Однажды я взломал это вместе для получения видео с 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
Команды, необходимые для нарезки файла на части.
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