Como obter a 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.

Lesenger
fonte

Respostas:

5

Você precisa usar o scale2ref filtro.

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. Se não, e você sabe a proporção do segundo vídeo, use [1][0]scale2ref=iw:iw*(H/W)[2nd][ref] onde (H / W) deve ser substituído com a relação entre a altura e a largura do segundo vídeo.


Com a construçã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.

Gyan
fonte
1
Como desta escrita, você pode referenciar a relação de aspecto do segundo vídeo usando estas novas variáveis: ffmpeg.org/ffmpeg-filters.html#scale2ref , se você tiver uma compilação personalizada do ffmpeg a partir do branch master. Isso significa que você não precisa executar outro comando para descobrir a taxa de proporção explicitamente primeiro (no momento em que escrevo, ela ainda não está disponível nos ramos de lançamento)
bhh1988
comando demo adicionado.
Gyan
0
  1. você pode obter as dimensões por:

ffprobe -v error -show_entries stream = largura, altura - de   padrão = noprint_wrappers = 1 -of json input_video

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

width = ffprobe_output ['fluxos'] [0] ['largura']

para arquivos m4v, você deve obtê-los na segunda matriz:

width = ffprobe_output ['fluxos'] [1] ['largura']

  1. escala com essa largura:

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

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

3.b) escala com largura dada, manter a relação de aspecto, mas tornar a altura divisível por 2 (exigido por muitos formatos de pixel):

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

Agile Bean
fonte