
Я пытаюсь использовать фильтр обнаружения заморозки в ffmpeg.
ffmpeg -i Trial.mp4 -vf "freezedetect=n=-60dB:d=0.5,metadata=mode=print:file=freeze.txt" -map 0:v:0 -f null -
Использовал указанную выше команду и вывод говорит, что заморозки нет. Но видео - это видео без движения, снятое на мобильном телефоне.
Если я установлю уровень шума на 0,05, будут наблюдаться зависания.
Как определить это значение?
решение1
Определить это можно только методом проб и ошибок.
Фильтр вычисляет разницу между двумя кадрами как отношение их суммы абсолютных разностей (ГРУСТНЫЙ). В псевдокоде:
is_frozen(reference, frame) {
sad = 0
count = 0
for plane in planes[frame] {
sad += sad_of_plane(plane, reference, frame)
count += width[plane] * height[plane]
}
ratio = sad / count
return ratio <= noise
}
Поскольку фактическая разница между двумя кадрами определяется их шумностью, она будет очень зависимой от контента. Обратите внимание, что даже если объект не изменился, «шум» может означать шум камеры/сенсора, который всегда будет отличаться между двумя захваченными кадрами.
Только для контента, созданного на компьютере, разница между кадрами с одним и тем же сюжетом будет равна нулю (или очень близка к нулю).