Один вкладыш ffmpeg (или другой), чтобы получить только разрешение?

Я не очень хорошо разбираюсь в командной строке, поэтому, надеюсь, это не слишком глупо вопрос.

Если я запустил:

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», как я могу это сделать?

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

1
задан 24 January 2015 в 00:59

6 ответов

Использование 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 для получения дополнительной информации.

7
ответ дан 23 May 2018 в 23:55
  • 1
    Благодарю. Не знал о ffprobe. Так много помощи здесь! Всем спасибо. – bcsteeve 25 January 2015 в 10:12
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

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

Однострочный выглядит следующим образом:

exiftool -b metavideo.mp4 -ImageSize

Это возвращает строку WxH, которую вы искали.

3
ответ дан 23 May 2018 в 23:55
  • 1
    Это не технически однострочный. – David Foerster 16 May 2016 в 14:00
  • 2
    Я не заметил, что это запрос с одним лайнером, в любом случае с той же шириной параметр -ImageSize возвращает строку WxH. – Alex Dolgov 16 May 2016 в 16:09
  • 3
    Посмотрите на заголовок вопроса еще раз! ;-) Во всяком случае +1 – David Foerster 16 May 2016 в 16:27

Вы можете сделать это с помощью регулярных выражений и ffmpeg, но я предпочел бы использовать exiftool, часть пакета 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. Кроме того, с учетом того, как указаны поля (разделенные двоеточием и пробелами), вы можете легко извлечь значение.

Что делает команда exiftool :

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

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

awk '/^Image Size/{print $4}'
Проверить, является ли первое поле ($1) Image Size . Сопоставляя начало линии (^) на Image Size, мы получаем правильную строку. И мы печатаем четвертое поле (поскольку Image, Size и : - первые три поля).
2
ответ дан 23 May 2018 в 23:55
  • 1
    Благодаря! Я мог бы предложить вам отредактировать свой пример для изменения " Ubuntu_Free_Culture_Showcase / How \ fast.ogg " на нечто более общее. Сначала я использовал его буквально, потому что я не узнал его как имя файла. Конечно, я видел свою ошибку через 2 секунды, и ваше решение отлично работает! – bcsteeve 24 January 2015 в 06:09
  • 2
    @bcsteeve Я использовал его, потому что это часть примера содержимого, установленного на рабочем столе Ubuntu (см. /usr/share/example). : D – muru 24 January 2015 в 07:51

Я вижу здесь только примеры использования exiftool и разбора его вывода, что кажется странным выбором. exiftool можно использовать напрямую, чтобы получить разрешение (и почти любые другие метаданные):

exiftool -ImageSize -s3 filename

Будет выводить вывод в форме WIDTHxHEIGHT ( eq: 1280×720)

ПРИМЕЧАНИЕ: -s3 инструктирует exiftool для создания кратчайшего формата вывода (без имен тегов, кавычек и т. д.)

2
ответ дан 23 May 2018 в 23:55

Немного эзотерическое использование mediainfo будет легко извлекать ширину и высоту в формате, который вы используете с помощью простой однострочной линии. Обратите внимание на следующий пример в моей системе:

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

Различные дополнительные параметры, которые можно использовать таким образом, можно увидеть с помощью mediainfo --Info-Parameters, но, возможно, это простое использование само по себе будет достаточно для вас ...

1
ответ дан 23 May 2018 в 23:55

Я сделал цикл 1 liner 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;
0
ответ дан 23 May 2018 в 23:55

Другие вопросы по тегам:

Похожие вопросы: