8

Я пытаюсь получить разрешение видео с помощью следующей команды:

ffmpeg -i filename.mp4

Я получаю длинный вывод, но мне нужны только ширина и высота для моего скрипта bash. Как мне отфильтровать эти параметры? Может быть, есть лучший способ сделать это.

6 ответов6

21

Используйте ffprobe

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

Примеры других вариантов форматирования вывода

См -of вариант документации для более широкого выбора и вариантов. Также см. FFprobe Tips для других примеров, включая длительность и частоту кадров.

По умолчанию

Без оболочки [STREAM] :

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1 input.mp4
  width=1280
  height=720

Без ключа:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of default=nw=1:nk=1 input.mp4
  1280
  720

CSV

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

JSON

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of json input.mp4
{
    "programs": [

    ],
    "streams": [
        {
            "width": 1280,
            "height": 720
        }
    ]
}

XML

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of xml input.mp4
<?xml version="1.0" encoding="UTF-8"?>
<ffprobe>
    <programs>
    </programs>

    <streams>
        <stream width="1280" height="720"/>
    </streams>
</ffprobe>
2

Следующие команды полагаются исключительно на ffmpeggrep and cut), чтобы получить необходимую вам высоту или ширину:

Рост:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f1

1280

Ширина:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}' | cut -d'x' -f2

720

Разница между ними заключается только в параметре -f нужно cut .

Если вы предпочитаете строку с полным разрешением, вам не нужно cut:

$ ffmpeg -i video.mp4 2>&1 | grep Video: | grep -Po '\d{3,5}x\d{3,5}'

1280x720

Вот что мы делаем с этими командами:

  1. Запуск ffmpeg -i для получения информации о файле.
  2. Извлечение строки, которая просто содержит Video: информация.
  3. Извлечение только строки, которая выглядит как digitsxdigits длиной от 3 до 5 символов.
  4. Для первых двух вырезать текст до или после x .
2

Вывод ffprobe выглядит следующим образом:

streams_stream_0_width=1280
streams_stream_0_height=720

Технически, вы можете использовать eval для назначения их переменным bash , но это не обязательно и может быть небезопасно; смотрите здесь для большего:

https://stackoverflow.com/questions/17529220/why-should-eval-be-avoided-in-bash-and-what-should-i-use-instead

Вместо этого, поскольку вы используете bash , воспользуйтесь его встроенными массивами и обработкой строк:

filepath="filename.mp4"
width_prefix='streams_stream_0_width='
height_prefix='streams_stream_0_height='
declare -a dimensions
while read -r line
do
    dimensions+=( "${line}" )
done < <( ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=width,height "${filepath}" )
width_with_prefix=${dimensions[0]}
height_with_prefix=${dimensions[1]}
width=${width_with_prefix#${width_prefix}}
height=${height_with_prefix#${height_prefix}}
printf "%s\t%sx%s\n" "${filepath}" "${width}" "${height}"
1

Используйте grep, чтобы выбрать только те строки, которые вы ищете. Перенаправьте вывод из STDERR в STDOUT, так как ffmpeg выведет всю информацию там.

ffmpeg -i filename.mp4 2>&1 | grep <keyword>

Редактировать: полный рабочий пример с использованием Perl:

$ ffmpeg -i MVI_7372.AVI 2>&1 | grep Video | perl -wle 'while(<>){ $_ =~ /.*?(\d+x\d+).*/; print $1 }'
640x480
1

Я наконец нашел ответ:

Я использовал этот пакет под названием Media Info

И тогда я приказал:

mediainfo mediainfo --Inform="Video;%Width%" midhand.mp4

Для просмотра списка параметров:

mediainfo --Info-Parameters

Лучший инструмент для извлечения метаданных видео!

0

Я знаю, что вопрос касается bash, но, на всякий случай, кто-то заканчивает здесь поиском решения для пакета Windows, как и я, прежде чем я узнал об этом.

for /f "delims=" %%a in ('ffprobe -hide_banner -show_streams filename.mp4 2^>nul ^| findstr "^width= ^height="') do set "myvideo_%%a"

Нет консольных сообщений, и вы получите приятные переменные окружения myvideo_width и myvideo_height . Вы можете проверить это с:

C:\>set myvideo_
myvideo_height=720
myvideo_width=1280

Если разрешение вашего видео 1280х720, конечно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .