Como obter largura do vídeo e dimensionar outro vídeo para essa largura usando o ffmpeg?

2

Estou usando o ffmpeg para empilhar dois vídeos verticalmente. Eles podem ter tamanhos diferentes, então eu preciso escalá-los para o mesmo tamanho. Eu encontrei os seguintes comandos.

O primeiro funciona para tamanhos diferentes (mas não é dimensionado para o tamanho adequado):

ffmpeg -i input1 -i input2 -filter_complex '[0:v]pad=iw:ih*2[int];[int][1:v]overlay=0:H/2[vid]' -map [vid] -c:v libx264 -crf 23 -preset veryfast output

O segundo funciona se os vídeos tiverem a mesma largura e o mesmo formato de pixel:

ffmpeg -i input1 -i input2 -filter_complex vstack output

Como obter largura da primeira entrada dentro do argumento do filtro complexo para que a segunda entrada possa ser dimensionada para a mesma largura? Qual seria o comando para fazer isso? Eu preferiria o filtro vstack, já que deveria ser mais rápido que a combinação de pad e overlay.

    
por Lesenger 13.07.2016 / 15:25

2 respostas

4

Você precisa usar o filtro scale2ref .

ffmpeg -i input1 -i input2
 -filter_complex '[1][0]scale2ref[2nd][ref];[ref][2nd]vstack'
 -map [vid] -c:v libx264 -crf 23 -preset veryfast output

Observe que isso só funciona bem se as proporções de ambos os vídeos forem as mesmas. Caso contrário, e você conhece a proporção do segundo vídeo, use [1][0]scale2ref=iw:iw*(H/W)[2nd][ref] onde (H / W) deve ser substituído pela proporção da altura para a largura do segundo vídeo.

Com uma compilação de uma versão git recente do ffmpeg, uma versão simplificada é possível,

ffmpeg -i input1 -i input2
 -filter_complex '[1][0]scale2ref=oh*mdar:ih[2nd][ref];[ref][2nd]vstack'
 -map [vid] -c:v libx264 -crf 23 -preset veryfast output

Isso preservará automaticamente a proporção da segunda entrada.

    
por 13.07.2016 / 17:16
0
  1. você pode obter as dimensões por:

ffprobe -v error -show_entries stream=width,height -of default=noprint_wrappers=1 -of json input_video

  1. armazena a saída em uma variável, por exemplo ffprobe_output. então pegue a largura:

width = ffprobe_output['streams'][0]['width']

para arquivos m4v, você deve obtê-los no segundo array:

width = ffprobe_output['streams'][1]['width']

  1. escala com essa largura:

3.a) escala com largura dada e manter relação de aspecto

ffmpeg -i input_movie -vf scale=width:-1 output_movie

3.b) dimensione com largura determinada, mantenha a proporção, mas torne a altura divisível por 2 (exigida por muitos formatos de pixel):

ffmpeg -i input_movie -vf scale=width:-2 output_movie

    
por 29.07.2018 / 06:46

Tags