Concatenação FFmpeg perdendo parte do primeiro vídeo

0

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.

    
por w0f 18.07.2017 / 20:41

1 resposta

1

Você pode usar as sugestões de esta resposta para dimensionar os vídeos, se necessário:

ffmpeg -y -i intro.mp4 -i video.mp4 -filter_complex "\
[0:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v0]; \
[1:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2[v1]; \
[v0][0:a:0][v1][1:a:0]concat=n=2:v=1:a=1[v][a] \
" -map "[v]" -map "[a]" output.mp4

Observe que apliquei isso a todas as entradas, mas é claro que você pode seletivamente fazer isso para os que você sabe que serão diferentes do tamanho da saída. Em caso de SAR diferente, você pode usar o filtro setsar após pad , mas não acho que seja estritamente necessário:

[0:v:0]scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,setsar=sar=1[v0]
    
por 19.07.2017 / 12:03