Um forro ffmpeg (ou outro) para obter apenas resolução?

5

Eu não sou muito versado na linha de comando, então espero que isso não seja uma pergunta muito estúpida.

Se eu correr:

ffmpeg -i videofile.avi

Eu recebo uma saída como esta:

ffmpeg version git-2013-11-21-6a7980e Copyright (c) 2000-2013 the FFmpeg develop    ers
  built on Nov 21 2013 12:06:32 with gcc 4.6 (Ubuntu/Linaro 4.6.3-1ubuntu5)
  configuration: --prefix=/home/user/ffmpeg_build --extra-cflags=-I/home/user/ffmpeg_build/include --extra-ldflags=-L/home/user/ffmpeg_build/lib --b        indir=/home/user/bin --extra-libs=-ldl --enable-gpl --enable-libass --enable    -libfdk-    aac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-l    ibx264 --enable-    nonfree
  libavutil      52. 53.100 / 52. 53.100
  libavcodec     55. 44.100 / 55. 44.100
  libavformat    55. 21.100 / 55. 21.100
  libavdevice    55.  5.100 / 55.  5.100
  libavfilter     3. 91.100 /  3. 91.100
  libswscale      2.  5.101 /  2.  5.101
  libswresample   0. 17.104 /  0. 17.104
  libpostproc    52.  3.100 / 52.  3.100
Input #0, avi, from 'videofile.avi':
  Metadata:
    encoder         : Lavf52.68.0
  Duration: 00:23:07.68, start: 0.000000, bitrate: 2390 kb/s
    Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480     [SAR 1:1 DAR 4:3], 23.98 fps, 23.98 tbr, 23.98 tbn, 1199 tbc
    Stream #0:1: Audio: mp3 (U[0][0][0] / 0x0055), 44100 Hz, stereo, s16p, 128 k    b/s

Se eu estivesse interessado apenas no comando "640x480", como posso fazer isso?

Eu imagino que tenho que canalizar a saída e executar uma expressão regular? Não faço ideia de como fazer isso. Obrigado!

    
por bcsteeve 23.01.2015 / 21:59

7 respostas

7

Obtenha resolução de vídeo com o ffmpeg:

ffmpeg -i filename 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+'

Saída (por exemplo):

640x480
    
por Cyrus 24.01.2015 / 15:56
7

Usando ffprobe do pacote ffmpeg:

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

Veja a documentação do ffprobe e FFmpeg Wiki: dicas do ffprobe para mais informações.

    
por LordNeckbeard 24.01.2015 / 22:28
3
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

faça o trabalho sem grep s

Uma linha parece:

exiftool -b metavideo.mp4 -ImageSize

Isso retorna a string WxH que você estava procurando.

    
por Alex Dolgov 16.05.2016 / 10:58
2

Você pode fazer isso usando expressões regulares e ffmpeg , mas eu prefiro usar exiftool , parte do libimage-exiftool-perl pacote:

$ exiftool some/video.ogv | awk -F' *: *' ' == "Image Size"{print }'
1242x480

Por que exiftool ?

  • Os utilitários ffmpeg / avprobe imprimem linhas do formulário Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480 , em que um ou mais valores do formulário AAAxBBB são possíveis (como você pode ver no seu exemplo). Determinar qual é a resolução pode ser difícil.
  • exiftool , por outro lado, gera dados do formulário Type : Value . Por isso, é mais fácil obter o campo exato, ou seja, Image Size . Além disso, dada a maneira como os campos são especificados (separados por dois pontos e espaço em branco), você pode facilmente extrair o valor.

O que o comando awk faz é:

  • Defina o separador de campo como ' *: *' - dois-pontos : em qualquer número de espaços.
  • Verifique se o primeiro campo ( ) é Image Size
  • E imprima o segundo campo ( print ).

Uma versão alternativa seria:

awk '/^Image Size/{print }'
  • Por padrão, o awk usa espaço em branco para dividir os campos, portanto, Image , Size , : e 1242x480 são todos campos diferentes.
  • Ao corresponder o início da linha ( ^ ) a Image Size , obtemos a linha correta.
  • E imprimimos o quarto campo (pois Image , Size e : são os três primeiros campos).
por muru 23.01.2015 / 22:46
2

Eu só vejo aqui amostras usando exiftool e analisando sua saída, o que parece ser uma escolha estranha. exiftool pode ser usado de maneira direta para obter a resolução (e quase todos os outros metadados):

exiftool -ImageSize -s3 filename

Resultará na saída em um formato WIDTHxHEIGHT (eq: 1280×720 )

NOTA: -s3 instrui o exiftool a produzir o formato de saída mais curto (sem nomes de tags, citações, etc)

    
por Juicy Scripter 01.02.2017 / 12:35
1

Um uso ligeiramente esotérico de mediainfo extrairá facilmente a largura e a altura no formato em que você está usando um simples one-liner. Observe o seguinte exemplo no meu sistema:

andrew@illium~$ mediainfo --Inform="Video;%Width%x%Height%" test.mp4
1920x1080

Os vários parâmetros adicionais que podem ser usados dessa maneira podem ser vistos com mediainfo --Info-Parameters , mas talvez esse simples uso por si só seja suficiente para você ...

    
por andrew.46 11.04.2018 / 00:48
0

Eu fiz um loop de 1 liner for para extrair a resolução do diretório de arquivos.

for i in $(ls "/root/vidz/dollabillz/"*); do eval $(ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "$i"); size=${streams_stream_0_width}x${streams_stream_0_height}; echo $i $size; done;
    
por Kevin Dollabillz 10.04.2018 / 22:26