Один лайнер 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», как я мог бы это сделать?

Я полагаю, я должен передать вывод и выполнить регулярное выражение? Не знаю, как это сделать. Спасибо!

bcsteeve
источник

Ответы:

10

Получить разрешение видео с помощью ffmpeg:

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

Выход (например):

640х480
Кир
источник
Ответ Муру был, конечно, более чем достаточен, но этот ответ конкретно отвечает на мой вопрос в том виде, в котором он был задан (т.е. с использованием ffmpeg). Я не знаю, что протокол здесь с выбором ответа. В этом случае, я думаю, что ответ Муру более полезен, в то время как Сайрус более точен. Извините, не знаю, в какую сторону идти, но сейчас я выбираю Сайруса, так как это очень конкретно то, о чем я просил (но я использую
lur
1
Будьте осторожны, хотя. Пример, показанный в вопросе, приведет к тому, что grep выдаст два совпадения (первое 0x44...и второе - это разрешение).
Муру
Если вход содержит несколько видеопотоков, например вход с DVD-диска, этот ответ будет выводить width x heightвидеопоток в несколько строк. Этого можно избежать при желании с помощью ffprobeили добавив head -n 1команду в ответ.
Llogan
9

Использование ffprobeиз пакета ffmpeg:

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

См. Документацию ffprobe и FFmpeg Wiki: советы ffprobe для получения дополнительной информации.

llogan
источник
Спасибо. Не знал о ffprobe. Столько помощи здесь! Спасибо всем.
bcsteeve
4
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

выполнять работу без каких - либо grepс

Однострочник выглядит так:

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но, возможно, вам достаточно этого простого использования ...

andrew.46
источник
0

Я сделал 1 линейный forцикл для извлечения разрешения из каталога файлов.

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
еще не подвел меня после 100 000
кодов