Разделить видео MPEG из командной строки?

Разделить видео 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 в позиции 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

Связанный контент