Jedna linijka ffmpeg (lub inna), aby uzyskać tylko rozdzielczość?

9

Nie jestem zbyt dobrze zorientowany w linii poleceń, więc mam nadzieję, że nie jest to zbyt głupie pytanie.

Jeśli uruchomię:

ffmpeg -i videofile.avi

Otrzymuję dane wyjściowe takie jak to:

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

Gdybym był zainteresowany tylko poleceniem wypisującym „640x480”, jak mogę to zrobić?

Wyobrażam sobie, że muszę przesłać dane wyjściowe i wykonać wyrażenie regularne? Nie mam pojęcia, jak to zrobić. Dzięki!

bcsteeve
źródło

Odpowiedzi:

10

Uzyskaj rozdzielczość wideo za pomocą ffmpeg:

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

Wyjście (np.):

640x480
Cyrus
źródło
odpowiedź muru z pewnością była więcej niż wystarczająca, ale ta konkretnie odpowiada na moje pytanie, jakie zostało zadane (tj. przy użyciu ffmpeg). Nie wiem, jaki jest tu protokół wyboru odpowiedzi. W tym przypadku myślę, że odpowiedź Muru jest bardziej pomocna, podczas gdy odpowiedź Cyrusa jest bardziej trafna. Przepraszam, nie wiem, którą drogą wybrać, ale teraz
wybieram
1
Bądź jednak ostrożny. Przykład pokazany w pytaniu spowoduje, że grep wygeneruje dwa dopasowania (pierwszy 0x44...i drugi to rozdzielczość).
muru
Jeśli dane wejściowe zawierają wiele strumieni wideo, takich jak dane wejściowe z dysku DVD, ta odpowiedź spowoduje wygenerowanie width x heightstrumienia wideo na wiele linii. Można tego uniknąć w razie potrzeby za pomocą ffprobelub poprzez dodanie head -n 1do polecenia w odpowiedzi.
llogan
9

Korzystanie ffprobez pakietu ffmpeg:

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

Zobacz dokumentację ffprobe i Wiki FFmpeg: porady ffprobe, aby uzyskać więcej informacji.

Llogan
źródło
Dzięki. Nie był świadomy ffprobe. Tyle pomocy tutaj! Dziękuję wszystkim.
bcsteeve,
4
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

wykonuj pracę bez żadnych greps

One-liner wygląda jak:

exiftool -b metavideo.mp4 -ImageSize

Zwraca szukany ciąg WxH.

Alex Dolgov
źródło
Z technicznego punktu widzenia nie jest to jedna linijka.
David Foerster
Nie zauważyłem, że jest to jedna linijka, w każdym razie ta sama szerokość - parametr ImageSize zwraca łańcuch WxH.
Alex Dolgov
Spójrz ponownie na tytuł pytania! ;-) W każdym razie +1
David Foerster
3

Widzę tu tylko przykłady użycia exiftooli analizy jego wyników, co wydaje się dziwnym wyborem. exiftoolmożna użyć w bezpośredni sposób, aby uzyskać rozdzielczość (i prawie dowolne inne metadane):

exiftool -ImageSize -s3 filename

Da w rezultacie na wyjściu w postaci WIDTHxHEIGHT(równanie: 1280×720)

UWAGA: -s3instruuje exiftool, aby utworzył najkrótszy format wyjściowy (bez nazw znaczników, cudzysłowów itp.)

Juicy Scripter
źródło
2

Możesz to zrobić za pomocą wyrażeń regularnych i ffmpeg, ale wolałbym użyć exiftool, części pakietu libimage-exiftool-perlZainstaluj libimage-exiftool-perl :

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

Dlaczego exiftool?

  • W ffmpeg/ avprobemedia drukować linie postaci Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480, gdzie jeden lub więcej wartości formularza AAAxBBBmożliwe są (jak widać w przykładzie). Określenie rozdzielczości może być trudne.
  • exiftool, z drugiej strony, dane wyjściowe formularza Type : Value. Łatwiej więc uzyskać dokładne pole, a mianowicie Image Size. Ponadto, biorąc pod uwagę sposób, w jaki pola są określone (oddzielone dwukropkiem i białymi spacjami), możesz łatwo wyodrębnić wartość.

Jaka awkkomenda nie jest:

  • Ustaw separator pól na ' *: *'- dwukropek :otoczony dowolną liczbą spacji.
  • Sprawdź, czy pierwsze pole ( $1) toImage Size
  • I wydrukuj drugie pole ( print $2).

Alternatywna wersja to:

awk '/^Image Size/{print $4}'
  • Domyślnie awk zastosowań spacji aby podzielić pola, tak Image, Size, :i1242x480 są różne pola.
  • Dopasowując początek linii ( ^) doImage Size , otrzymujemy poprawną linię.
  • I drukujemy czwartym polu (ponieważ Image, Sizei :są pierwsze trzy pola).
muru
źródło
Dzięki! Mogę zasugerować edycję przykładu, aby zmienić „Ubuntu_Free_Culture_Showcase / How \ fast.ogg” na coś bardziej ogólnego. Początkowo używałem go dosłownie, ponieważ nie rozpoznałem go jako nazwy pliku. Oczywiście, zobaczyłem mój błąd 2 sekundy później i twoje rozwiązanie działa świetnie!
bcsteeve
@bcsteeve Użyłem go, ponieważ jest to część przykładowej zawartości zainstalowanej na pulpicie Ubuntu (patrz /usr/share/example). : D
muru
1

Nieco ezoteryczne użycie z mediainfołatwością wyodrębni szerokość i wysokość w formacie, w którym jesteś po użyciu prostej jednowarstwowej. Obserwuj następujący przykład w moim systemie:

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

Różne dalsze parametry, które można wykorzystać w ten sposób, są widoczne, mediainfo --Info-Parametersale być może wystarczy to samo proste użycie ...

andrew.46
źródło
0

Zrobiłem 1 liniową forpętlę, aby wyodrębnić rozdzielczość z katalogu plików.

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
źródło
3
Analiza lsnie zakończy się dobrze ... cytowanie nie naprawi bałaganu
Zanna
jeszcze mnie nie zawiodło po 100 000
kodach