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
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!
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
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.
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.
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
?
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 é:
' *: *'
- dois-pontos :
em qualquer número de espaços.
) é Image Size
print
). Uma versão alternativa seria:
awk '/^Image Size/{print }'
Image
, Size
, :
e 1242x480
são todos campos diferentes. ^
) a Image Size
, obtemos a linha correta. Image
, Size
e :
são os três primeiros campos). 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)
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ê ...
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;