O FFMpeg não pode concatir certos vídeos

2

Eu tenho alguns vídeos gravados com o meu telefone Android. Eles são bem parecidos. Por exemplo:

  • original0.mp4
  • original1.mp4
  • original2.mp4 ( este está quebrado )

Eu aplico este filtro a cada um deles:

ffmpeg -i original0.mp4 -filter_complex "crop=720:720:280:0, scale=640:640, transpose=1" -threads 3 -preset ultrafast -strict -2 -y processed0.mp4'

Resultados:

  • processed0.mp4
  • processed1.mp4
  • processed2.mp4 ( este está quebrado )

Os vídeos resultantes estão ok. Então eu quero concatenciá-los em diferentes combinações, como: original0 -> original1 -> original2 , original1 -> original0 -> original2 e assim por diante. Eu uso este comando para isso:

ffmpeg -f concat -i tmp.txt -codec copy -threads 3 -strict -2 -y combination.mp4

Qualquer combinação de processed0.mp4 e processed1.mp4 funciona bem. Mas se eu incluir processed2.mp4 na combinação - o vídeo resultante é quebrado:

  • combination.mp4 ( proccesed0 -> processed1 -> processed2 )

Todos os vídeos são gravados da mesma maneira em intervalos de vários segundos e a mesma combinação de vídeos originais funciona bem. Então, eu estou querendo saber o que há de errado com original2 ou processed2 e como corrigi-lo? Talvez eu precise adicionar alguns sinalizadores ao aplicar filtros? Meu palpite é que isso acontece por causa dos timestamps.

    
por user1049280 03.10.2015 / 21:28

1 resposta

4

O problema

Suas entradas variam em taxas de quadros (consulte as saídas de console ffmpeg ) e acredito que o muxer MP4 não suporta taxas de quadros variáveis.

Algumas soluções

Você pode:

  • use um formato de contêiner diferente, como Matroska (.mkv), para os arquivos processados e a saída final ou

  • adicione o filtro fps aos seus gráficos de filtro para fornecer a cada arquivo processado uma taxa de quadros comum:

    -filter_complex "crop=720:720:280:0, scale=640:640, transpose=1, fps=30"
    

Outro lixo

  • -threads 3 e -strict -2 não fazem nada quando copiam em fluxo ( -c copy ).

  • libx264, o codificador H.264, calcula automaticamente o número ideal de threads por padrão, então forçar um valor específico pode ser sub-ótimo.

  • Se você escolher enviar para MP4, considere adicionar -movflags +faststart ao seu comando de saída final. É útil ao visualizar via download progressivo; caso contrário, o arquivo inteiro deve ser baixado completamente antes que a reprodução possa começar.

  • Em um comentário, você mencionou a filtragem de áudio e vídeo separadamente. Um exemplo simples pode ajudar:

    ffmpeg -i input0 -i input1 -filter_complex \
    "[0:v]hflip,negate[bg]; \
     [1:v]vflip,hue=s=0,scale=120:-1[fg]; \
     [bg][fg]overlay[v]; \
     [0:a]aphaser,flanger[a]" \
    -map "[v]" -map "[a]" -movflags +faststart output.mp4
    
por 04.10.2015 / 08:20