Como uso o ffmpeg para obter a resolução de vídeo?

6

Estou tentando obter a resolução do vídeo com o seguinte comando:

ffmpeg -i filename.mp4

Eu recebo uma saída longa, mas preciso apenas da largura e da altura do meu script bash. Como devo filtrar esses parâmetros? Talvez exista uma maneira melhor de fazer isso.

    
por Vladimir Stazhilov 17.11.2014 / 13:21

6 respostas

18

Use ffprobe

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 input.mp4
  1280x720

Exemplos de outras opções de formatação de saída

Veja a documentação da opção -of para mais opções e opções. Veja também Dicas da FFprobe para outros exemplos, incluindo duração e taxa de quadros.

Padrão

Sem invólucro [STREAM] :

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1 input.mp4
  width=1280
  height=720

sem chave:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1:nk=1 input.mp4
  1280
  720

CSV

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4
  1280,720

JSON

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4
{
    "programs": [

    ],
    "streams": [
        {
            "width": 1280,
            "height": 720
        }
    ]
}

XML

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of xml input.mp4
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
    <programs>
    </programs>

    <streams>
        <stream width="1280" height="720"/>
    </streams>
</ffprobe>
    
por 17.11.2014 / 19:07
2

A saída de ffprobe é assim:

streams_stream_0_width=1280
streams_stream_0_height=720

Tecnicamente, você pode usar eval para atribuir esses valores a bash variables, mas isso não é necessário e pode ser inseguro; veja aqui para mais:

link

Em vez disso, como você está usando bash , aproveite as matrizes integradas e a manipulação de strings:

filepath="filename.mp4"
width_prefix='streams_stream_0_width='
height_prefix='streams_stream_0_height='
declare -a dimensions
while read -r line
do
    dimensions+=( "${line}" )
done < <( ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "${filepath}" )
width_with_prefix=${dimensions[0]}
height_with_prefix=${dimensions[1]}
width=${width_with_prefix#${width_prefix}}
height=${height_with_prefix#${height_prefix}}
printf "%s\t%sx%s\n" "${filepath}" "${width}" "${height}"
    
por 12.10.2016 / 20:01
2

Os comandos a seguir dependem exclusivamente de ffmpeg (e grep e cut ) para obter a altura ou largura conforme necessário:

Altura:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f1

1280

Largura:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f2

720

A diferença entre os dois é apenas o parâmetro -f para cut .

Se você preferir a string de resolução completa, não precisará de cut :

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}'

1280x720

Veja o que estamos fazendo com esses comandos:

  1. executando ffmpeg -i para obter as informações do arquivo.
  2. Extraindo a linha que contém apenas Video: information.
  3. Extraindo apenas uma string parecida com digitsxdigits , com entre 3 e 5 caracteres.
  4. Para os dois primeiros, recorte o texto antes ou depois do x .
por 14.03.2018 / 14:16
1

Eu finalmente encontrei a resposta:

Eu usei este pacote chamado Informações de mídia

E então eu ordenei:

mediainfo mediainfo --Inform="Video;%Width%" midhand.mp4

Para ver a lista de parâmetros:

mediainfo --Info-Parameters

Melhor ferramenta para extrair metadados de vídeo!

    
por 17.11.2014 / 14:55
1

Use o grep para selecionar apenas as linhas que você está procurando. Redirecione a saída de STDERR para STDOUT, pois o ffmpeg exibirá todas as informações lá.

ffmpeg -i filename.mp4 2>&1 | grep <keyword>

Edit: Um exemplo completo de trabalho usando perl:

$ ffmpeg -i MVI_7372.AVI 2>&1 | grep Video | perl -wle 'while(<>){ $_ =~ /.*?(\d+x\d+).*/; print $1 }'
640x480
    
por 17.11.2014 / 14:01
0

Eu sei que a questão é sobre o bash mas, apenas no caso de alguém terminar aqui procurando uma solução para um lote do Windows, como eu mesmo antes de descobri-lo.

for /f "delims=" %%a in ('ffprobe -hide_banner -show_streams filename.mp4 2^>nul ^| findstr "^width= ^height="') do set "myvideo_%%a"

Não há mensagens do console e você termina com as boas variáveis de ambiente myvideo_width e myvideo_height . Você pode verificar com:

C:\>set myvideo_
myvideo_height=720
myvideo_width=1280

Se a resolução do seu vídeo for 1280x720, é claro.

    
por 16.07.2018 / 00:27