в
может ли ffmpeg различить отличить видео где десятки frames, от видео картинки где единственный frame со звуком

о
FFmpeg может легко различить эти видео. Для решения этой задачи используются встроенные фильтры оценки видеопотока, которые проверяют количество уникальных кадров или наличие изменений между ними. [1, 2]

Вот 3 основных метода, от проверки метаданных до детального разбора:

Метод 1: Быстрый подсчет количества кадров (ffprobe)

Самый быстрый способ - запросить утилиту ffprobe (входит в комплект) посчитать общее количество видеокадров (nb_read_frames) или уникальных кадров (nb_frames):

ffprobe -v error -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4

Если на экран выводится 1 (или число, равное 1 за вычетом служебных) - это видео-картинка. Если выводятся десятки или тысячи - это полноценное видео.

Метод 2: Автоматическое детектирование статики (freezedetect)

Фильтр freezedetect анализирует видео на наличие неподвижных (статичных) сцен.

ffmpeg -i input.mp4 -vf "freezedetect=n=-60dB:d=1" -f null -

Если видео состоит из единственного кадра, фильтр мгновенно выдаст сообщение о том, что весь видеоряд статичен, указав точную длительность этого.

Метод 3: Сравнение пикселей (mpdecimate)

Фильтр mpdecimate стирает дублирующиеся кадры. Вы можете отфильтровать видео так, чтобы оно сохраняло только те кадры, где есть хоть какие-то изменения. [1]

ffmpeg -i input.mp4 -vf mpdecimate -f null -

В результатах (обычно в самом конце отчета) будет строка вида dropped:X, где X - количество стертых (повторяющихся) кадров. Если количество таких кадров близко к общему числу кадров, значит, видео статично.

Официальная документация и полные описания всех параметров доступны для изучения на страницах FFmpeg Filters.