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

7518
Tim

У меня есть самодельный 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 (с помощью этого вопроса ), но вопрос остается.

Редактирование еще раз: оказывается, мое другое решение не совсем сработало - звук десинхронизировался примерно на пять секунд, примерно в половине моих обрезанных миль на галлон - так что я вернулся к исходной точке. Кто-нибудь?

6

2 ответа на вопрос

8
TomB

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 секунд.

,

да, ffmpeg оказался более стабильным для меня, чем mencoder для разделения потоков. Также обратите внимание, что если вы делаете каждый кадр i-frame, вы можете разделить его довольно точно: ref: http://en.wikibooks.org/wiki/Mplayer#Split.2Fsub-section_videos, здесь также длинный список: https: //spreadsheets.google.com/ccc?key=0AjWmZ0umsuZHdHNzZVhuMTkxTHdYbUdCQzF3cE51Snc&hl=en rogerdpack 13 лет назад 0
1
Grumbel

Однажды я взломал это вместе для получения видео с 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=# of=chapter#.mpeg bs=1024 skip=# count=#{(seq_end - seq_start)/1024}" else puts "dd if=# of=chapter#.mpeg bs=1024 skip=#" end } 

aПеременная принимает значения позиции, где происходит скачок, а затем просто использует ddразрезать файл на части в этих положениях. Результатом являются отдельные файлы mpeg для каждой главы, так как переход происходил всякий раз, когда запись была остановлена ​​и перезапущена. Получающиеся в результате файлы mpeg освобождаются и могут затем обрабатываться как обычно.

Сам скрипт фактически не вызывает dd, он просто выводит ddкоманды, необходимые для разбиения файла на части.