Один вкладиш ffmpeg (чи інший), щоб отримати лише дозвіл?


9

Я не дуже добре розбираюся в командному рядку, тому, сподіваюся, це не надто дурне питання.

Якщо я біжу:

ffmpeg -i videofile.avi

Я отримую такий результат:

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

Якщо мене цікавила лише команда, що виводить "640x480", як я можу це зробити?

Я уявляю, що мені доведеться передавати вихідний результат і виконувати регулярний вираз? Не знаю, як це зробити. Дякую!

Відповіді:


10

Отримайте роздільну здатність відео за допомогою ffmpeg:

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

Вихід (наприклад):

640x480

Відповідь Муру була, безумовно, більш ніж достатньою, але ця конкретно відповідає на моє запитання як запитання (тобто, використовуючи ffmpeg). Я не знаю, який тут протокол із вибором відповіді. У цьому випадку я думаю, що відповідь Муру є більш корисною, тоді як Сайрус більше суттєвий. Вибачте, не знаю, яким шляхом рухатись, але зараз я вибираю Сайрус ', оскільки це конкретно те, про що я попросив (але я використовую
лору

1
Будьте обережні, хоча. Приклад, показаний у запитанні, призведе до того, що греп дасть дві збіги (перша 0x44...і друга - резолюція).
муру

Якщо вхід містить декілька відеопотоків, наприклад, вхід з DVD, то ця відповідь буде виводити width x heightна відеопотік у декількох рядках. Цього можна уникнути за бажанням ffprobe, або додавши head -n 1команду у відповіді.
llogan


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

виконувати роботу без жодних greps

Однопластовий виглядає так:

exiftool -b metavideo.mp4 -ImageSize

Це повертає рядок WxH, яку ви шукали.


Технічно це не однолінійний.
Девід Фоерстер

Я не помічав, що це запитується один вкладиш, так чи інакше виконуючи ту ж ширину -ImageSize параметр повертає рядок WxH.
Олексій Долгов

Подивіться заголовок питання ще раз! ;-) У будь-якому разі +1
Девід Фоерстер

3

Я бачу тут лише зразки використання exiftoolта аналізу його вихідних даних, що здається дивним вибором. exiftoolможна безпосередньо використовувати для отримання роздільної здатності (і майже будь-яких інших метаданих):

exiftool -ImageSize -s3 filename

Буде чи призводить до виходу в формі WIDTHxHEIGHT(екв: 1280×720)

ПРИМІТКА: -s3інструктує exiftool створювати найкоротший вихідний формат (без імен тегів, лапок тощо)


2

Ви можете зробити це за допомогою регулярних виразів ffmpeg, але я вважаю за краще використовувати exiftoolчастину пакету libimage-exiftool-perlВстановіть libimage-exiftool-perl :

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

Чому exiftool?

  • В ffmpeg/ avprobeутиліти друк рядка в формі , Stream #0:0: Video: mpeg4 (Simple Profile) (XVID / 0x44495658), yuv420p, 640x480де один або кілька значень форм AAAxBBBможливі (як ви можете бачити в вашому прикладі). Визначити, яка саме роздільна здатність, може бути складно.
  • exiftool, з іншого боку, виводить дані форми Type : Value. Так простіше дістати точне поле, а саме Image Size. Крім того, враховуючи спосіб вказання полів (розділений двокрапкою та пробілом), ви можете легко отримати значення.

Що awkробить команда:

  • Встановіть роздільник поля на ' *: *'- двокрапка, :оточена будь-якою кількістю пробілів.
  • Перевірте, чи є перше поле ( $1)Image Size
  • І друкуємо друге поле ( print $2).

Альтернативною версією буде:

awk '/^Image Size/{print $4}'
  • За замовчуванням, AWK використовує прогалини розколоти поля, так Image, Size, :і 1242x480всі різні поля.
  • Зіставляючи рядок від початку ( ^) до Image Size, ми отримуємо правильний рядок.
  • І ми виводимо четверте поле (так як Image, Sizeі :перші три поля).

Дякую! Я можу запропонувати вам відредагувати свій приклад, щоб змінити "Ubuntu_Free_Culture_Showcase / How \ fast.ogg" на щось більш загальне. Спочатку я використовував його буквально, тому що не розпізнав його як ім'я файлу. Звичайно, я помітив свою помилку через 2 секунди і ваше рішення чудово працює!
bcsteeve

@bcsteeve Я використовував це, оскільки це частина прикладу вмісту, встановленого на робочому столі Ubuntu (див. /usr/share/example). : D
муру

1

Злегка езотеричне використання mediainfoлегко дозволить отримати ширину та висоту у тому форматі, який ви використовуєте, коли ви користуєтеся простим однолінійним вкладишем. Дотримуйтесь наступного прикладу в моїй системі:

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

Різні подальші параметри, які можна використовувати таким чином, можна побачити, mediainfo --Info-Parametersале, можливо, цього простого використання саме по собі буде достатньо для вас ...


0

Я зробив forцикл з 1 вкладиша, щоб витягти роздільну здатність з каталогу файлів.

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
Розбір lsне закінчиться добре ... котирування не виправлять безлад
Zanna

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.