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

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

8
задан 23 January 2015 в 23:59

7 ответов

Получите разрешение видео с ffmpeg:

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

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

640x480
8
ответ дан 23 January 2015 в 23:59

Можно сделать это использование регулярные выражения и ffmpeg, но я предпочел бы использовать exiftool, часть libimage-exiftool-perlInstall 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 и : первые три поля).
2
ответ дан 23 January 2015 в 23:59

Используя ffprobe от ffmpeg пакета:

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

Посмотрите ffprobe документация и Wiki FFmpeg: подсказки по ffprobe для большего количества информации

9
ответ дан 23 January 2015 в 23:59
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight

делают задание без любого grep, острота s

похожа:

exiftool -b metavideo.mp4 -ImageSize

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

4
ответ дан 23 January 2015 в 23:59

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

exiftool -ImageSize -s3 filename

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

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

3
ответ дан 23 January 2015 в 23:59

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

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

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

1
ответ дан 16 November 2019 в 06:43

Я сделал 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;
0
ответ дан 16 November 2019 в 06:43

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

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