Ein Liner ffmpeg (oder ein anderer), um nur Auflösung zu bekommen?

9

Ich bin nicht wirklich gut mit der Kommandozeile vertraut, also ist dies hoffentlich keine allzu dumme Frage.

Wenn ich renne:

ffmpeg -i videofile.avi

Ich bekomme eine Ausgabe wie diese:

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

Wenn ich nur an dem Befehl "640x480" interessiert wäre, wie könnte ich das tun?

Ich stelle mir vor, ich muss die Ausgabe an einen regulären Ausdruck weiterleiten und ausführen. Keine Ahnung, wie das geht. Vielen Dank!

bcsteeve
quelle

Antworten:

10

Holen Sie sich die Videoauflösung mit ffmpeg:

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

Ausgabe (zB):

640 x 480
Cyrus
quelle
Die Antwort von muru war sicherlich mehr als ausreichend, aber diese beantwortet speziell meine Frage wie gestellt (dh mit ffmpeg). Ich weiß nicht, wie das Protokoll hier bei der Auswahl einer Antwort lautet. In diesem Fall denke ich, dass Murus Antwort hilfreicher ist, während Cyrus mehr auf den Punkt kommt. Tut mir leid, ich bin mir nicht sicher, welchen Weg ich gehen soll, aber im
Moment wähle
1
Sei aber vorsichtig. Das in der Frage gezeigte Beispiel würde dazu führen, dass grep zwei Übereinstimmungen erzeugt (die erste 0x44...und die zweite sind die Auflösung).
Muru
Wenn die Eingabe mehrere Videostreams enthält, z. B. eine Eingabe von einer DVD, gibt diese Antwort einen width x heightPro-Video-Stream in mehreren Zeilen aus. Dies kann auf Wunsch mit ffprobeoder durch Hinzufügen head -n 1zum Befehl in der Antwort vermieden werden .
Llogan
9

Verwenden ffprobeaus dem ffmpeg-Paket:

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

Weitere Informationen finden Sie in der ffprobe-Dokumentation und im FFmpeg-Wiki: ffprobe-Tipps .

llogan
quelle
Vielen Dank. War sich ffprobe nicht bewusst. So viel Hilfe hier! Vielen Dank an alle.
bcsteeve
4
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

mach den Job ohne greps

Einzeiler sieht aus wie:

exiftool -b metavideo.mp4 -ImageSize

Das gibt den gesuchten WxH-String zurück.

Alex Dolgov
quelle
Dies ist technisch gesehen kein Einzeiler.
David Foerster
Ich habe nicht bemerkt, dass ein Einzeiler angefordert wird, trotzdem wird bei gleicher Breite der Parameter -ImageSize eine WxH-Zeichenfolge zurückgegeben.
Alex Dolgov
Schauen Sie sich den Titel der Frage noch einmal an! ;-) Wie auch immer +1
David Foerster
3

Ich sehe hier nur Beispiele für die Verwendung exiftoolund Analyse der Ausgabe, was eine seltsame Wahl zu sein scheint. exiftoolkann direkt verwendet werden, um die Auflösung (und fast alle anderen Metadaten) zu erhalten:

exiftool -ImageSize -s3 filename

Werden Ergebnisse in der Ausgabe in einer Form WIDTHxHEIGHT(eq: 1280×720)

HINWEIS: -s3Weist exiftool an, das kürzeste Ausgabeformat zu erstellen (ohne Tag-Namen, Anführungszeichen usw.).

Juicy Scripter
quelle
2

Sie können dies mit regulären Ausdrücken und ffmpeg, aber ich würde es vorziehen exiftool, einen Teil des libimage-exiftool-perl-Installieren Sie libimage-exiftool-perl Pakets verwenden:

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

Warum exiftool?

  • Die ffmpeg/ avprobeDienstprogramme drucken Zeilen des Formulars, in Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480denen ein oder mehrere Werte des Formulars AAAxBBBmöglich sind (wie Sie in Ihrem Beispiel sehen können). Es kann schwierig sein, die Auflösung zu bestimmen.
  • exiftoolgibt andererseits Daten des Formulars aus Type : Value. Es ist also einfacher, das genaue Feld zu erhalten, nämlich Image Size. Außerdem können Sie den Wert aufgrund der Art und Weise, wie die Felder angegeben sind (durch Doppelpunkt und Leerzeichen getrennt), problemlos extrahieren.

Der awkBefehl bewirkt Folgendes:

  • Setzen Sie das Feldtrennzeichen auf ' *: *'- einen Doppelpunkt, :der von einer beliebigen Anzahl von Leerzeichen umgeben ist.
  • Überprüfen Sie, ob das erste Feld ( $1) istImage Size
  • Und drucken Sie das zweite Feld ( print $2).

Eine alternative Version wäre:

awk '/^Image Size/{print $4}'
  • Standardmäßig awk Anwendungen Leerzeichen Felder aufgeteilt, so Image, Size, :und 1242x480sind alle verschiedenen Bereichen.
  • Durch Abgleichen des Zeilenanfangs ( ^) mit erhalten Image Sizewir die richtige Zeile.
  • Und wir drucken das vierte Feld (da Image, Sizeund :sind die ersten drei Felder).
muru
quelle
Vielen Dank! Ich könnte vorschlagen, dass Sie Ihr Beispiel bearbeiten, um "Ubuntu_Free_Culture_Showcase / How \ fast.ogg" in etwas allgemeineres zu ändern. Zuerst habe ich es buchstäblich verwendet, weil ich es nicht als Dateinamen erkannt habe. Natürlich habe ich meinen Fehler 2 Sekunden später gesehen und Ihre Lösung funktioniert großartig!
bcsteeve
@bcsteeve Ich habe es verwendet, weil es Teil des Beispielinhalts ist, der auf dem Ubuntu-Desktop installiert ist (siehe /usr/share/example). : D
Muru
1

Eine leicht esoterische Verwendung von mediainfoextrahiert leicht Breite und Höhe in dem Format, das Sie nach der Verwendung eines einfachen Einzeilers haben. Beachten Sie das folgende Beispiel auf meinem System:

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

Die verschiedenen weiteren Parameter, die auf diese Weise verwendet werden können, können mit gesehen werden, mediainfo --Info-Parametersaber vielleicht reicht diese einfache Verwendung für Sie aus ...

andrew.46
quelle
0

Ich habe eine 1-Liner- forSchleife erstellt, um die Auflösung aus dem Dateiverzeichnis zu extrahieren.

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;
Kevin Dollabillz
quelle
3
Das Parsen lswird nicht gut enden ... das Zitieren wird das Chaos nicht beheben
Zanna
hat mich nach 100.000
Codierungen