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

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

Nb: Eu incorretamentefiz essa perguntano stackoverflow

Eu usei a linha de comando ffmpeg mostrada emessa questãopara dividir arquivos MKV perfeitamente por um longo tempo. Agora tenho alguns arquivos MP4 que gostaria de dividir e a princípio pareceu funcionar, mas todos os segmentos subsequentes após o primeiro têm o áudio não sincronizado! E por vários segundos.

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

Tentei um programa totalmente diferente (Avidemux) e ele conseguiu dividir o arquivo com saída adequada, mas foi MUITO mais lento, demorando mais de 3 minutos versus menos de 2 segundos com o ffmpeg. Com o Avidemux consegui determinar a posição exata do i-frame onde queria dividir, então pensando que talvez esse fosse o problema de sincronização, tentei essa posição exata (ou seja, 00:12:17.111 em vez de 00:12:16 ou tanto faz), mas isso também não ajudou.

Existe uma opção que está faltando no ffmpeg para sincronizar corretamente o áudio com o vídeo durante a divisão?

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

Responder1

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

-ss posição (entrada/saída) Quando usado como opção de entrada (antes de -i), busca neste arquivo de entrada a posição. Observe que na maioria dos formatos não é possível buscar exatamente, então o ffmpeg buscará o ponto de busca mais próximo antes da posição. Quando a transcodificação e -accurate_seek estão habilitados (o padrão), esse segmento extra entre o ponto de busca e a posição será decodificado e descartado. Ao fazer a cópia do fluxo ou quando -noaccurate_seek for usado, ele será preservado.

Quando usado como uma opção de saída (antes de um nome de arquivo de saída), decodifica, mas descarta a entrada até que os carimbos de data/hora atinjam a posição.

a posição pode ser em segundos ou no formato hh:mm:ss[.xxx].

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

Responder2

Não tenho certeza 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 em vez de avi, mas por outro lado eu estava digitando o comando exatamente como acima e (com mp4) estava obtendo um resultado de áudio fora de sincronia. Eu acidentalmente tropecei nessa "correção"... se eu inserir o comando assim:

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

Não entendo os problemas de sincronização. Por que? Nenhuma idéia. Mas funciona. Eu tentei algumas vezes para confirmar... fazer apenas essa ordem de alteração dos parâmetros corrige o problema.

informação relacionada