Estou usando ffmpeg.exe
para concatenar dois vídeos juntos. O primeiro vídeo é essencialmente uma introdução de cinco segundos renderizada em 1080p a 25 quadros por segundo, e sempre permanecerá no mesmo formato. O segundo é um vídeo aleatório que pode ser de qualquer tamanho e formato, mas será um arquivo MP4 (h264). Este caso de teste em particular é um vídeo de resolução 400x240 a 30fps.
Então, a partir disso, tenho um vídeo de introdução de 5 segundos em 1080p25 sendo concatenado a um vídeo de 240p30. Como ambos são arquivos MP4, primeiro transcodifico cada um para um arquivo mpegts
usando o seguinte:
ffmpeg -y -i intro.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts intro.mp4.ts
ffmpeg -y -i video.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts video.mp4.ts
Agora que os dois arquivos são convertidos em formatos combináveis, eu corro o seguinte comando para codificar os dois vídeos que estão sendo unidos:
ffmpeg -y -i "concat:intro.mp4.ts|video.mp4.ts" -c:v libx264 -preset ultrafast -crf 20 -vf fps=60 -b:v 8M -minrate 8M -maxrate 12M -bufsize -8M -c:a aac -b:a 256k output.mp4
Isso funciona quase como o esperado, mas uma coisa continua acontecendo: Quando a codificação chega à marca de 5 segundos (o final da introdução ou o início do vídeo real), ele exibe esse aviso: DTS 126000 < 619200 out of order
O restante da conversão é executado corretamente. No entanto, quando reproduzo o arquivo de saída, a introdução é reproduzida e, no final da introdução, ela salta para o início do próximo vídeo. Alguns players de vídeo simplesmente pulam a lacuna. Outros jogadores tocarão o resto da introdução sem o som naquela área específica, levando-me a acreditar que se trata de um problema de áudio.
Como o resto do arquivo está funcionando bem, eu estava experimentando as configurações e fiquei surpreso ao descobrir que quando eu altero a predefinição x264 de ultrafast
para medium
ou slow
, isso piorou o problema: O salto ocorreria mais cedo na introdução, mas deixaria o vídeo real inalterado. Onde ultrafast
faria com que o salto omitisse o último meio segundo de vídeo / áudio, medium
causaria um segundo a um segundo e meio e slow
diminuiria em dois segundos.
O que está causando isso e como posso corrigir esse problema? Eu li sugestões de recodificação dos dois vídeos antes de concatenar, mas gostaria de evitar isso, se possível, já que a introdução permanecerá a mesma o tempo todo. Se essa é a única solução, existe uma maneira de fazer tudo isso com uma única chamada ao FFmpeg? A ferramenta é chamada por um programa em C # que estou escrevendo.