Як використовувати ffmpeg для отримання роздільної здатності відео?

Я намагаюся отримати дозвіл відео з такою командою:

ffmpeg -i filename.mp4

Я отримую довгий вихід, але мені потрібно тільки ширину і висоту для мого bash сценарію. Як відфільтрувати ці параметри? Можливо, є кращий спосіб зробити це.

5

6 Відповіді

Use ffprobe

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

Приклади інших варіантів форматування виводу

See -of option documentation for more choices and options. Also see FFprobe Tips for other examples including duration and frame rate.

За замовчуванням

Без пакунка [STREAM] :

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of За замовчуванням=nw=1 input.mp4
  width=1280
  height=720

Без ключа:

$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of За замовчуванням=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"?>

    
    

    
        
    

18
додано
@bariumbitmap Дякуємо. eval у відповіді було скасовано для дуже простого рішення, яке я якось пропустив, незважаючи на те, що багато років дивився на документацію.
додано Автор Chris Zelenak, джерело
@SalemF Додати | sort -nur | head -n 1 . Це повертає дозвіл з найбільшою шириною. Якщо говорити, у всіх випадках, які я коли-небудь бачив, існує лише одна резолюція, але вона може дублюватися.
додано Автор Öne Östberg, джерело
Використання eval є ризикованим і не є необхідним для цього. stackoverflow.com/questions/17529220/…
додано Автор Rafael, джерело
Я отримав два результати з командою {"programs": [{"потоки": [{"ширина": 640, "height": 360}]}], "потоки": [{"width": 640 , "height": 360}]}
додано Автор Salem F, джерело

Вихід даних ffprobe виглядає так:

streams_stream_0_width=1280
streams_stream_0_height=720

Технічно можна використовувати eval призначити їх змінним bash , але це не є необхідним і може бути небезпечним; див. тут докладніше:

https://stackoverflow. com/questions/17529220/чому-слід-eval-бути-уникнути-в-Баш-і-що-слід-я-використовувати-замість

Замість цього, оскільки ви використовуєте 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}"
2
додано

Наступні команди покладаються виключно на ffmpeggrep і 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. Вилучення рядка, який містить інформацію про Відео: .
  3. Вилучення всього рядка, який має вигляд цифри xdigits , які складають від 3 до 5 символів.
  4. Для перших двох, вирізавши текст до чи після x .
1
додано
Висновок ffmpeg призначений тільки для людських очей, а не призначений для аналізу за допомогою скриптів або інших інструментів. Вихідні дані не є стандартизованими, тому він не гарантовано буде однаковим форматом для всіх файлів, тому це крихкий випадок використання. Замість цього використовуйте ffprobe. Багато прикладів тут у цьому потоці.
додано Автор Chris Zelenak, джерело

Я нарешті знайшов відповідь:

I used this package called Media info

І тоді я наказав:

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

Щоб переглянути список параметрів:

mediainfo --Info-Parameters

Кращий інструмент для вилучення метаданих відео!

1
додано

Використовуйте grep , щоб вибрати лише ті рядки, які ви шукаєте. Перенаправляйте вихід STDERR на STDOUT, оскільки ffmpeg виведе всю інформацію.

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

Редагувати: повний робочий приклад з використанням perl:

$ ffmpeg -i MVI_7372.AVI 2>&1 | grep Video | perl -wle 'while(<>){ $_ =~ /.*?(\d+x\d+).*/; print $1 }'
640x480
1
додано
Також потрібно використовувати STDERR. Я зафіксував цю частину.
додано Автор slhck, джерело

Я знаю, що питання стосується 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

Якщо роздільна здатність вашого відео становить 1280x720, звичайно.

0
додано