Dividir vídeo MPEG da linha de comando?

5

Eu tenho um DVD caseiro que estou efetivamente tentando inserir capítulos e reorganizar - o autor original o gravou como um longo capítulo, e eu gostaria de copiá-lo em partes menores e recodificá-lo em um novo DVD. Eu rasguei o DVD com o seguinte comando:

mplayer dvd:// -dvd-device /dev/sr2 -dumpstream -dumpfile raw.vob

Estou executando o Gentoo Linux com o mplayer versão 1.0-rc2_p20090731 (o mais recente disponível no Portage).

Eu tenho uma lista de vezes que os capítulos devem abranger (por exemplo, 30: 11-33: 25), por isso o meu primeiro pensamento foi para rasgar todo o DVD e usar mpgtx para cortar certas partes do arquivo. Meu problema é que executar mpgtx -i no arquivo relata alguns saltos de timestamp:

Time stamps jumped from 59.753789 to 0.001622 at position 1d29800
Time stamps jumped from 204963823030450.343750 to 31.165900 at position 2d4f800
Time stamps jumped from 60.077878 to 0.001622 at position 43cc000 
Time stamps jumped from 60.024233 to 0.001622 at position 65c5000
Time stamps jumped from 204963823068631.718750 to 52.549244 at position 7fd1000

Eu tentei corrigir os índices usando:

mencoder raw.vob -oac copy -ovc copy -forceidx -o fixed.vob -of mpeg

Mas o mpgtx ainda relatará problemas de timestamp. Minha pergunta imediata: existe uma maneira de tirar o filme que eu tenho e corrigir seus timestamps para que eu possa cortá-lo com o mpgtx? Se eu conseguir tirar esse problema, construir o resto do DVD será tranquilo.

Se não for possível corrigir os timestamps neste arquivo: existe uma maneira melhor de extrair pequenos trechos do DVD em arquivos separados para recompilação posterior? Eu gostaria muito que isso fosse feito no Linux, e seria ainda melhor se eu pudesse escrevê-lo de alguma forma (inserir uma lista de posições iniciais e finais, ou iniciar horas e durações, e obter uma série de rasgos arquivos). Se necessário, também tenho uma máquina Mac OS X disponível, mas não Windows.

Editar: acabei encontrando outra solução que envolva HandBrake e ffmpeg (com a ajuda de esta questão ), mas a questão permanece.

Edite novamente: Acontece que minha outra solução não funcionou - o áudio foi dessincronizado em cerca de cinco segundos, em cerca de metade dos meus mpgs de corte - então estou de volta à estaca zero. Alguém?

    
por Tim 28.08.2009 / 06:29

2 respostas

7

O FFmpeg fará isso por você.

Seu comando pode ser algo assim:

Código: ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ss é o ponto inicial em hh: mm: ss desde o início do seu arquivo de vídeo

-t é o período de tempo em hh: mm: ss do seu novo segmento.

Assim, no exemplo acima, você está iniciando 10 segundos do início do arquivo original e terminando 30 segundos depois.

Se você deseja criar várias partes em um único passe, o seguinte deve funcionar:

Código: ffmpeg -i input.mpg -ss 00:00:10 -t 00:00:30 out1.mpg -ss 00:00:35 -t 00:00:30 out2.mpg Neste exemplo, o primeiro segmento é o mesmo do primeiro exemplo, mas você também está criando um segundo arquivo a partir de 35 segundos e com 30 segundos de duração.

.

    
por 09.09.2009 / 17:26
1

Uma vez eu invadi isso para obter um vídeo de um 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 variável a toma os valores de posição onde o salto ocorre e depois usa apenas dd para dividir o arquivo em pedaços nessas posições. O resultado são, então, arquivos mpeg separados para cada capítulo, já que o salto ocorreu sempre que a gravação foi interrompida e reiniciada. Os arquivos mpeg resultantes são liberados e podem ser processados normalmente.

O próprio script na verdade não chama dd , ele apenas exibe os comandos dd necessários para dividir o arquivo em partes.

    
por 09.09.2009 / 17:21