Como concatenar dois ou mais vídeos com dimensões diferentes no FFMpeg?

5

Eu tenho dois vídeos que gostaria de concatenar.

  1. Dimensões do primeiro vídeo = 480x640
  2. Dimensões do segundo vídeo = 640 x 480

Tentei concatená-los e recebi um erro. Incluí o erro completo abaixo.

ffmpeg -i 682_segment_0.mp4 -i 682_segment_1.mp4 -filter_complex \
        "[0:v:0] [0:a:0] [1:v:0] [1:a:0] concat=n=2:v=1:a=1 [v] [a]" \
       -map "[v]" -map "[a]" -ar 44100 -vcodec libx264 \
       -strict -2 -acodec aac 682.mp4

ffmpeg version 2.8.8-0ubuntu0.16.04.1 Copyright (c) 2000-2016 the FFmpeg developers
  built with gcc 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.2) 20160609
  configuration: --prefix=/usr --extra-version=0ubuntu0.16.04.1 --build-suffix=-ffmpeg --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --cc=cc --cxx=g++ --enable-gpl --enable-shared --disable-stripping --disable-decoder=libopenjpeg --disable-decoder=libschroedinger --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-librtmp --enable-libschroedinger --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzvbi --enable-openal --enable-opengl --enable-x11grab --enable-libdc1394 --enable-libiec61883 --enable-libzmq --enable-frei0r --enable-libx264 --enable-libopencv
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '682_segment_0.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.40.101
  Duration: 00:00:19.30, start: 0.000000, bitrate: 335 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 480x640 [SAR 1:1 DAR 3:4], 219 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 120 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '682_segment_1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf56.40.101
  Duration: 00:00:09.97, start: 0.000000, bitrate: 568 kb/s
    Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 640x480 [SAR 1:1 DAR 4:3], 460 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, 3.0, fltp, 104 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
[Parsed_concat_0 @ 0x202dea0] Input link in1:v0 parameters (size 640x480, SAR 1:1) do not match the corresponding output link in0:v0 parameters (480x640, SAR 1:1)
[Parsed_concat_0 @ 0x202dea0] Failed to configure output pad on Parsed_concat_0
Error configuring complex filters.
Invalid argument

Verifiquei um pouco e parece que preciso redimensionar um dos vídeos para ter o mesmo tamanho do outro vídeo antes de concatená-lo. Não tenho certeza se isso está correto, mas o redimensionei usando ffmpeg.

ffmpeg -i 682_segment_0.mp4 -vf scale=640:480 -strict -2 682_segment_0b.mp4

Depois de redimensionar o vídeo de 480x640 para 640x480, tentei o comando concat novamente. E recebi outro erro. (Incluí o erro final aqui, mas não toda a saída.)

Input #0 Video Stream: 640x480 [SAR 9:16 DAR 3:4]
Input #1 Video Stream: 640x480 [SAR 1:1 DAR 4:3]

[Parsed_concat_0 @ 0x22cefe0] Input link in1:v0 parameters (size 640x480, SAR 1:1) do not match the corresponding output link in0:v0 parameters (640x480, SAR 9:16)
[Parsed_concat_0 @ 0x22cefe0] Failed to configure output pad on Parsed_concat_0

Descobri que o redimensionamento do DAR me permitiu concatinar os dois vídeos, mas a parte redimensionada do vídeo concluído agora tem a proporção errada. Eu esperava ter basicamente "preto" nas laterais com o meu redimensionamento sem cortar o vídeo.

Anexei um exemplo aqui:

Exemplo de imagem redimensionada

Redimensione o comando DAR que funcionou, mas fez as proporções erradas:

ffmpeg -i 682_segment_0.mp4 -ar 44100 -vcodec libx264 \ 
       -strict -2 -acodec aac -s 360x480 682_segment_0e.mp4

Pergunto-me se devo tentar fazer a concat e redimensionar ao mesmo tempo, mas não tenho certeza de como fazê-lo.

Daryl
fonte

Respostas:

9

Na documentação do filtro concat :

Todos os fluxos correspondentes devem ter os mesmos parâmetros em todos os segmentos; o sistema de filtragem selecionará automaticamente um formato de pixel comum para fluxos de vídeo e um formato de amostra comum, taxa de amostragem e layout de canal para fluxos de áudio, mas outras configurações, como resolução , devem ser convertidas explicitamente pelo usuário.

Você precisará dimensionar e ajustar (ou cortar) para ajustar 480x640 a 640x480:

ffmpeg -i 480.mp4 -i 640.mp4 -filter_complex \
"[0:v]scale=640:480:force_original_aspect_ratio=decrease,pad=640:480:(ow-iw)/2:(oh-ih)/2[v0]; \
 [v0][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -c:a aac -movflags +faststart output.mp4
  • Você ffmpegé velho: você realmente deve considerar a atualização para uma compilação a partir do ramo principal do git atual. A maneira mais fácil de fazer isso é apenas baixar um binário .

  • Se você estiver escrevendo isso, deve "conformar" cada entrada com parâmetros comuns usando filtros de fps, formato / formato e escala para evitar que o ffmpeg escolha "formatos comuns" inesperados e indesejados.

  • Consulte também Redimensionando vídeos ffmpegpara caber no player de tamanho estático .

llogan
fonte
Obrigado pela sugestão sobre a atualização do ffmpeg. Eu não sabia que estava em uma versão antiga. Eu usei o apt-get no Ubuntu para fazer a versão mais recente. Fui em frente e construí a partir da fonte. Também obrigado pelo link para os vídeos de redimensionamento. O exemplo da caixa de correio era exatamente o que eu procurava. Não estou claro o que você quer dizer com "conformar cada entrada". Você tem uma referência ao que você quis dizer com isso? E obrigado novamente pelo link da documentação em concat. Eu li muita documentação, mas é difícil saber exatamente o que estou procurando.
Daryl
@ Daryl Sim, há muito para ler. Ao "conformar cada entrada", quis dizer que você deve definir explicitamente cada parâmetro "comum" mencionado na citação da concat doc na resposta. Como se suas entradas para um comando em comparação com o próximo comando variarem na taxa de amostragem, no layout do canal, no formato de pixel, etc., o concat escolherá um conjunto "comum" diferente de parâmetros para cada saída por comando.
Llogan