Я не очень хорошо разбираюсь в командной строке, так что, надеюсь, это не слишком глупый вопрос.
Если я запускаю:
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», как мне это сделать? что?
Я полагаю, мне нужно передать вывод и выполнить регулярное выражение? Не знаю, как это сделать. Спасибо!
Получите разрешение видео с ffmpeg:
ffmpeg -i filename 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+'
Вывод (например).:
640x480
Можно сделать это использование регулярные выражения и 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
. Плюс, учитывая путь указаны поля (разделенный двоеточием и пробелом), можно легко извлечь значение.Что awk
команда делает:
' *: *'
- двоеточие :
окруженный любым количеством пробелов.$1
) Image Size
print $2
).Альтернативная версия была бы:
awk '/^Image Size/{print $4}'
Image
, Size
, :
и 1242x480
все различные поля.^
) к Image Size
, мы получаем корректную строку.Image
, Size
и :
первые три поля). Используя 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 для большего количества информации
exiftool -b metavideo.mp4 -ImageWidth
exiftool -b metavideo.mp4 -ImageHeight
делают задание без любого grep
, острота s
похожа:
exiftool -b metavideo.mp4 -ImageSize
, Который возвращает строку WxH, которую Вы искали.
Я только вижу здесь образцы использования exiftool
и парсинг, это производится, который, кажется, странный выбор. exiftool
может использоваться прямым способом для получения разрешения (и почти любые другие метаданные):
exiftool -ImageSize -s3 filename
Будет результаты в выводе в форме WIDTHxHEIGHT
(eq: 1280×720
)
ПРИМЕЧАНИЕ: -s3
дает exiftool команду производить самый короткий выходной формат (без имен тега, кавычек, и т.д.)
Немного тайное использование mediainfo
легко извлечет ширину и высоту в формате, что Вы после используете простую остроту. Наблюдайте следующий пример относительно моей системы:
andrew@illium~$ mediainfo --Inform="Video;%Width%x%Height%" test.mp4
1920x1080
Различные дальнейшие параметры, которые могут использоваться таким образом, видны с mediainfo --Info-Parameters
но возможно это простое использование отдельно будет достаточно для Вас...
Я сделал 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;