Un ffmpeg (o altro) per ottenere solo una risoluzione?


9

Non sono molto esperto nella riga di comando, quindi spero che questa non sia una domanda troppo stupida.

Se corro:

ffmpeg -i videofile.avi

Ottengo un output come questo:

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 fossi interessato solo al comando di emissione "640x480", come potrei farlo?

Immagino di dover convogliare l'output a, ed eseguire, un'espressione regolare? Non ho idea di come farlo. Grazie!

Risposte:


10

Ottieni la risoluzione video con ffmpeg:

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

Uscita (ad es.):

640x480

La risposta di Muru è stata certamente più che sufficiente, ma questa risponde specificamente alla mia domanda come richiesto (cioè usando ffmpeg). Non so quale sia il protocollo qui con la scelta di una risposta. In questo caso, penso che la risposta di Muru sia più utile mentre quella di Cyrus è più puntuale. Siamo spiacenti, non sono sicuro di quale strada fare, ma in questo momento sto selezionando Cyrus 'in quanto è esattamente quello che ho chiesto (ma sto usando Murol's lol)
bcsteeve

1
Stai attento però. L'esempio mostrato nella domanda comporterebbe che grep produca due corrispondenze (la prima 0x44...e la seconda sono la risoluzione).
Muru,

Se l'ingresso contiene più flussi video, ad esempio un ingresso da un DVD, questa risposta genererà un width x heightflusso per video su più righe. Questo può essere evitato se lo si desidera con ffprobeo aggiungendo head -n 1al comando nella risposta.
Llogan,


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

fare il lavoro senza alcun greps

One-liner si presenta come:

exiftool -b metavideo.mp4 -ImageSize

Ciò restituisce la stringa WxH che stavi cercando.


Questo non è tecnicamente un liner.
David Foerster,

Non ho notato che è richiesto un solo liner, facendo comunque la stessa larghezza - Il parametro ImageSize restituisce la stringa WxH.
Alex Dolgov,

Guarda di nuovo il titolo della domanda! ;-) Comunque +1
David Foerster,

3

Vedo solo qui esempi di utilizzo exiftoole analisi dell'output, che sembra essere una scelta strana. exiftoolpuò essere utilizzato in modo diretto per ottenere la risoluzione (e quasi tutti gli altri metadati):

exiftool -ImageSize -s3 filename

Will risultati in uscita in una forma WIDTHxHEIGHT(eq: 1280×720)

NOTA: -s3indica a exiftool di produrre il formato di output più breve (senza nomi di tag, virgolette, ecc.)


2

Puoi farlo usando espressioni regolari e ffmpeg, ma preferirei usare exiftool, parte del pacchetto libimage-exiftool-perlInstalla libimage-exiftool-perl :

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

Perché exiftool?

  • Le ffmpeg/ avprobeutility stampano le linee del modulo in Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480cui AAAxBBBsono possibili uno o più valori del modulo (come puoi vedere nel tuo esempio). Determinare quale sia la risoluzione potrebbe essere difficile.
  • exiftoold'altra parte, genera i dati del modulo Type : Value. Quindi è più facile ottenere il campo esatto, vale a dire Image Size. Inoltre, dato il modo in cui i campi sono specificati (separati da due punti e spazi), è possibile estrarre facilmente il valore.

Quello che fa il awkcomando è:

  • Impostare il separatore di campo su ' *: *'- due punti :circondati da un numero qualsiasi di spazi.
  • Controlla se il primo campo ( $1) èImage Size
  • E stampa il secondo campo ( print $2).

Una versione alternativa sarebbe:

awk '/^Image Size/{print $4}'
  • Per impostazione predefinita, awk usi spazi splittare i campi, quindi Image, Size, :e 1242x480sono tutti i campi differenti.
  • Abbinando l'inizio della riga ( ^) a Image Size, otteniamo la riga corretta.
  • E stampiamo il quarto campo (poiché Image, Sizee :sono i primi tre campi).

Grazie! Potrei suggerirti di modificare il tuo esempio per cambiare "Ubuntu_Free_Culture_Showcase / How \ fast.ogg" in qualcosa di più generico. All'inizio lo usavo letteralmente perché non lo riconoscevo come un nome di file. Certo, ho visto il mio errore 2 secondi dopo e la tua soluzione funziona alla grande!
bcsteeve,

@bcsteeve L'ho usato perché fa parte del contenuto di esempio installato sul desktop Ubuntu (vedi /usr/share/example). : D
muru,

1

Un uso leggermente esotericomediainfo estrarrà facilmente la larghezza e l'altezza nel formato in cui ti trovi dopo aver usato una semplice fodera. Osservare il seguente esempio sul mio sistema:

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

I vari altri parametri che possono essere utilizzati in questo modo possono essere visti con, mediainfo --Info-Parametersma forse questo semplice utilizzo da solo ti basterà ...


0

Ho creato un forciclo 1 liner per estrarre la risoluzione dalla directory dei file.

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
L'analisi lsnon finirà bene ... la citazione non risolverà il problema
Zanna,

non mi ha ancora
deluso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.