Сплит 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
Другие вопросы по тегам