Dividir vídeo MPEG na linha de comando?

Dividir vídeo MPEG na linha de comando?

Eu tenho um DVD caseiro no qual estou efetivamente tentando inserir capítulos e reorganizá-lo - o autor original o gravou como um capítulo longo e gostaria de rasgá-lo em pedaços menores e recodificá-lo em um novo DVD. Eu copiei o DVD com o seguinte comando:

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

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

Eu tenho uma lista de horários em que os capítulos devem se estender (por exemplo, 30:11-33:25), então meu primeiro pensamento foi copiar o DVD inteiro e usarmpgtxpara cortar certas partes do arquivo. Meu problema é que a execução mpgtx -ino arquivo relata alguns saltos no carimbo de data/hora:

Os carimbos de data/hora saltaram de 59,753789 para 0,001622 na posição 1d29800
Os carimbos de data/hora saltaram de 204963823030450.343750 para 31.165900 na posição 2d4f800
Os carimbos de hora saltaram de 60,077878 para 0,001622 na posição 43cc000
Os carimbos de data/hora saltaram de 60,024233 para 0,001622 na posição 65c5000
Os carimbos de data e hora saltaram de 204963823068631,718750 para 52,549244 na posição 7fd1000

Tentei corrigir os índices usando:

mencoder raw.vob -oac copiar -ovc copiar -forceidx -o fixo.vob -of mpeg

Mas o mpgtx ainda reportará problemas de carimbo de data/hora. Minha pergunta imediata: existe uma maneira de pegar o filme copiado que tenho e corrigir seus carimbos de data e hora para poder cortá-lo com mpgtx? Se eu conseguir resolver esse problema, construir o resto do DVD será tranquilo.

Se não for possível corrigir os carimbos de data e hora neste arquivo: existe uma maneira melhor de copiar pequenos pedaços 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 criar um script de alguma forma (alimentar uma lista de posições iniciais e finais, ou horários de início e durações, e obter uma série de arquivos rasgados arquivos). Se necessário, também tenho uma máquina Mac OS X disponível, mas não tenho Windows.

Editar:Acabei encontrando outra solução envolvendoFreio de mãoeffmpeg(com ajuda deessa questão), mas a questão permanece.

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

Responder1

O FFmpeg fará isso por você.

Seu comando pode ser parecido com isto:

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 em hh:mm:ss do seu novo segmento.

Portanto, no exemplo acima, você começa 10 segundos desde o início do arquivo original e termina 30 segundos depois.

Se você deseja criar várias peças em uma passagem, 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 que o primeiro exemplo, mas você também está criando um segundo arquivo começando em 35 segundos e com 30 segundos de duração.

.

Responder2

Certa vez, hackeei isso para obter o 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 avariável pega os valores da posição onde ocorre o salto e depois apenas usa ddpara dividir o arquivo em pedaços nessas posições. O resultado são arquivos mpeg separados para cada capítulo, já que o salto ocorria sempre que a gravação era interrompida e reiniciada. Os arquivos mpeg resultantes foram liberados e puderam ser processados ​​normalmente.

Na verdade, o script em si não chama dd, apenas gera os ddcomandos necessários para dividir o arquivo em pedaços.

Responder3

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

informação relacionada