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


9

Eu não sou muito bem versado na linha de comando, então espero que isso não seja uma pergunta 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 eu poderia fazer isso?

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

Respostas:


10

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

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

Saída (por exemplo):

640 x 480

A resposta de muru foi certamente mais do que suficiente, mas esta responde especificamente à minha pergunta conforme solicitado (ou seja, usando ffmpeg). Não sei qual é o protocolo aqui para escolher uma resposta. Nesse caso, acho que a resposta de Muru é mais útil, enquanto a de Cyrus é mais importante. Desculpe, não tenho certeza qual o caminho a percorrer, mas agora eu estou selecionando Cyrus', pois é muito especificamente o que eu pedi (mas eu estou usando o lol do Muru)
bcsteeve

1
Tenha cuidado, porém. O exemplo mostrado na pergunta resultaria no grep produzindo duas correspondências (a primeira 0x44...e a segunda sendo a resolução).
muru

Se a entrada contiver vários fluxos de vídeo, como uma entrada de um DVD, essa resposta produzirá um width x heightfluxo por vídeo em várias linhas. Isso pode ser evitado se desejado com ffprobe, ou adicionando head -n 1ao comando na resposta.
llogan 16/05


4
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

faça o trabalho sem nenhum greps

Uma linha é semelhante a:

exiftool -b metavideo.mp4 -ImageSize

Isso retorna a string WxH que você estava procurando.


Tecnicamente, isso não é uma linha.
David Foerster

Eu não percebi que é solicitado por uma linha, de qualquer maneira, fazer o mesmo parâmetro width -ImageSize retorna a string WxH.
Alex Dolgov

Veja o título da pergunta novamente! ;-) Enfim +1
David Foerster 16/05

3

Eu só vejo aqui exemplos de uso exiftoole análise de sua saída, o que parece ser uma escolha estranha. exiftoolpode ser usado de maneira direta para obter a resolução (e quase todos os outros metadados):

exiftool -ImageSize -s3 filename

Será que resulta em uma saída em um formulário WIDTHxHEIGHT(eq: 1280×720)

NOTA: -s3instrui o exiftool a produzir o formato de saída mais curto (sem nomes de tags, aspas, etc.)


2

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

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

Por que exiftool?

  • Os utilitários ffmpeg/ avprobeimprimem linhas do formulário em Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480que um ou mais valores do formulário AAAxBBBsã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. Portanto, é mais fácil obter o campo exato, a saber Image Size. Além disso, dada a maneira como os campos são especificados (separados por dois pontos e espaços em branco), é possível extrair facilmente o valor.

O que o awkcomando faz é:

  • Defina o separador de campo como ' *: *'- dois pontos :cercado por qualquer número de espaços.
  • Verifique se o primeiro campo ( $1) estáImage Size
  • E imprima o segundo campo ( print $2).

Uma versão alternativa seria:

awk '/^Image Size/{print $4}'
  • Por padrão, o awk usos espaço em branco para dividir campos, então Image, Size, :e 1242x480são todos os campos diferentes.
  • Ao corresponder o início da linha ( ^) a Image Size, obtemos a linha correta.
  • E imprimimos o quarto campo (desde então Image, Sizee :são os três primeiros).

Obrigado! Eu sugiro que você edite seu exemplo para alterar "Ubuntu_Free_Culture_Showcase / How \ fast.ogg" para algo mais genérico. No começo, eu estava usando literalmente porque não o reconhecia como um nome de arquivo. Obviamente, vi meu erro 2 segundos depois e sua solução funciona muito bem!
precisa saber é

@bcsteeve Eu usei porque é parte do exemplo de conteúdo instalado na área de trabalho do Ubuntu (consulte /usr/share/example). : D
muru

1

Um uso levemente esotérico de mediainfoextrai facilmente a largura e a altura no formato desejado após o uso de uma linha simples. 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, mediainfo --Info-Parametersmas talvez esse simples uso por si só seja suficiente para você ...


0

Eu fiz um forloop de 1 liner 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;

3
Análise lsnão vai acabar bem ... citando não vai corrigir a bagunça
Zanna

não me falhou ainda após 100.000 codifica
Kevin Dollabillz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.