ffmpeg para dividir o arquivo mp4 em segmentos ... após o primeiro segmento, o áudio não sincronizado

1

Nb: incorretamente fez esta pergunta em stackoverflow

Eu usei a linha de comando ffmpeg exibida em esta pergunta para Dividir arquivos MKV perfeitamente por um longo tempo. Agora eu tenho alguns arquivos MP4 que eu gostaria de dividir e no início parecia funcionar, mas cada segmento subseqüente após o primeiro tem o áudio não sincronizado! E por vários segundos.

Eu tentei forçar quadros-chave (conselhos que encontrei em outros sites) e isso não ajudou.

Eu tentei um programa completamente diferente (Avidemux) e ele foi capaz de dividir o arquivo com a saída adequada, mas foi MUITO mais lento, levando mais de 3 minutos contra menos de 2 segundos com o ffmpeg. Com o Avidemux eu fui capaz de determinar a posição exata do i-frame onde eu queria dividir, então pensando que talvez fosse o problema de sincronização eu tentei essa posição exata (ou seja, 00: 12: 17.111 em vez de 00:12:16 ou seja o que for), mas isso também não ajudou.

Existe uma opção que está faltando no ffmpeg para sincronizá-lo corretamente com o vídeo ao dividir?

Apenas uma nota: eu estava usando uma versão 2013 do ffmpeg. Acabei de atualizar isso para o mais recente 2.6, mas a questão permanece.

    
por bcsteeve 11.03.2015 / 21:34

2 respostas

1

Na documentação, o sinalizador -ss faz coisas diferentes dependendo de onde está no comando

-ss position (input/output) When used as an input option (before -i), seeks in this input file to position. Note the in most formats it is not possible to seek exactly, so ffmpeg will seek to the closest seek point before position. When transcoding and -accurate_seek is enabled (the default), this extra segment between the seek point and position will be decoded and discarded. When doing stream copy or when -noaccurate_seek is used, it will be preserved.

When used as an output option (before an output filename), decodes but discards input until the timestamps reach position.

position may be either in seconds or in hh:mm:ss[.xxx] form.

Então, a partir de sua própria resposta, o primeiro comando aplica a lógica na saída e o segundo comando a aplica na entrada

    
por 09.07.2015 / 19:14
1

Não sei se entendi POR QUE, mas o problema era a ordem dos parâmetros.

No exemplo vinculado, o comando é o seguinte:

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:30:00 -t 00:30:00 output2.avi

Claro, estou usando mp4 ao invés de avi, mas senão eu estava digitando o comando exatamente como acima e (com mp4) eu estava recebendo um resultado de áudio fora de sincronia. Eu acidentalmente tropecei nessa "correção" ... se eu, ao invés disso, digitar o comando:

ffmpeg -ss 00:30:00 -i input.mp4 -vcoded copy -acodec copy -t 00:30:00 output2.mp4

Eu não entendo os problemas de sincronização. Por quê? Nenhuma idéia. Mas isso funciona. Eu tentei algumas vezes para confirmar ... fazendo apenas que a ordem de parâmetros de alteração corrige o problema.

    
por 11.03.2015 / 23:39