Кодирайте видео чрез елиминиране на повтарящи се кадри - Matlab

Искам да намеря метод за премахване на повтарящите се кадри от видеоклип. Ако разглеждам видеоклип, който многократно ще показва един и същ кадър за 5 секунди, искам да включа само един кадър от него във видеото и да го направя видим за 5 секунди. Тук с нетърпение очаквам да минимизирам размера на файла чрез елиминиране на дублиращи се кадри. Има ли метод да направите това с помощта на Matlab?


person Asanga Ranasinghe    schedule 19.10.2014    source източник
comment
Погледнете кръстосаната корелация или разликите в интензитета на сума-квадрат като средство за сравняването им може би.   -  person Benoit_11    schedule 19.10.2014
comment
Трудна част ще бъде, когато възпроизвеждате файла. Не можете да използвате произволен плейър, който играе с постоянна честота на fps. Ще трябва да прикачите for how long to display this frame метаданни към всеки кадър и плейър, който може да се справи с това.   -  person Hoki    schedule 19.10.2014
comment
Създавате ли видеото в Matlab или вече съществува? Дали това е въпрос на просто откриване кои кадри се повтарят или не кодиране на тези кадри като начало? Моля, редактирайте въпроса си, за да изясните.   -  person horchler    schedule 19.10.2014
comment
@horchler Да, опитвам се да създам видео с помощта на Matlab. Искам помощ при създаването на видеоклипа, който предоставя начин за споменаване на продължителността на всеки кадър и начин за повторното му възпроизвеждане.   -  person Asanga Ranasinghe    schedule 20.10.2014
comment
@Hoki Можете ли да ме насочите със солиден метод за промяна на данните за метаданни на видеокадър?   -  person Asanga Ranasinghe    schedule 20.10.2014
comment
Съжалявам, обработката на видео е далеч от моята област на експертиза. Когато създавам видео или анимации с Matlab, те наистина са доста големи, тогава обикновено използвам ръчна спирачка за конвертиране (и компресиране ) тях. В зависимост от това колко движение има във видеото, крайният размер на файла е между 10% и 30% от оригиналния размер на файла, без значителна загуба на качество. Това е достатъчно добре за моите нужди. Ако трябва да проучите повече енкодери/декодери, отговорът от @horchler е пълен с интересни връзки (повече, отколкото мога да ви насоча).   -  person Hoki    schedule 20.10.2014
comment
@Asanga Ranasinghe: промяната на метаданните ще зависи до голяма степен от това какъв кодек (и дори каква реализация) използвате. Мисля, че като цяло това е лоша идея (по-добре просто да създадете видеото правилно на първо място) и това всъщност не е правилният форум. Няма много директни инструменти за това, за които знам, освен двете крайности на повторно кодиране на видеоклипа или гледане на необработения шестнадесетичен код на горния/долния колонтитул на видеоклипа. Неправилното редактиране на метаданните също може да повреди целия или част от вашия видео файл. Ако даден формат не поддържа променлива честота на кадрите, редактирането на файла няма да ви даде това.   -  person horchler    schedule 21.10.2014
comment
За специфични кодеци, започнете от тук. Опитайте форумите Doom9 за въпроси относно кодеците и хакването на метаданните.   -  person horchler    schedule 21.10.2014


Отговори (1)


Ако вашият филм е просто поредица от снимки, които искате да покажете като слайдшоу/презентация с фиксирано закъснение от пет секунди, тогава трябва да можете да използвате 'FrameRate' свойството за VideoWriter клас. Опитайте нещо като този пример:

writerObj = VideoWriter('peaks.mp4','MPEG-4');
writerObj.FrameRate = 0.2; % One frame every 5 seconds
open(writerObj);

Z = peaks;
surf(Z);
for k = 1:4:20 
   surf(sin(2*pi*k/20)*Z,Z);
   writeVideo(writerObj,getframe);
end
close(writerObj);

Свойството за кадрова честота обаче не може да се променя в хода на вашия филм, така че по-общата форма на вашия въпрос е основно проблем с поддръжката на енкодер за кодиране с променлива кадрова честота. Повечето съвременни енкодери (напр. реализации на H.264) не са проектирани да се справят изрично с това, а по-скоро имат евристика, която може да открие кога съдържанието не се променя и ефективно да кодира данните (особено ако се използва многопроходно кодиране). За съжаление, Matlab (предполагам, че сте използвали класа VideoWriter) всъщност не осигурява много вярност в това отношение. Дори не съм сигурен какви настройки за междукадрово кодиране се използват за MPEG-4 с H.264 видеоклипове.

Ако MPEG-4 с H.264 видеоклипове създаде от VideoWriter са неприемливи, бих препоръчал да експортирате видеоклипа си с възможно най-високо качество (или без загуба) и след това да се научите да използвате пълноценна рамка/библиотека за кодиране (ffmpeg, libav, x264) или приложение за кодиране до желаното от вас качество и размер. Очевидно Handbrake има поддръжка за кодиране с променлива честота на кадрите, въпреки че не е непременно проектирано за това, което може да искате, не съм го тествал. Или експортирайте вашите индивидуални неподвижни кадри и използвайте действително софтуер за редактиране на видео (напр. iMovie на OS X). Вероятно има и специални приложения, които могат да създават филм от слайдшоу/презентация (и PowerPoint, и Keynote могат да направят това).

Друга алтернатива в Matlab е да се използва кодек, който изрично поддържа променлива честота на кадрите – кодеци, базирани на изображения: Photo JPEG (да не се бърка с Motion-JPEG), Photo PNG (известен още като Apple PNG) и Photo TIFF (известен още като Apple Tiff). Можете да кодирате съдържание директно с помощта на тези кодеци с моя QTWriter, който е наличен в Github. Обърнете внимание обаче, че на OS X 10.9+, QuickTime Player преобразува без загуби променлива кадрова честота на Photo PNG и Photo TIFF филми в H.264 с фиксирана кадрова честота на загуби (JPEG филмите на снимки не се конвертират). Вижте моята бележка в долната част на тази страница за допълнителни подробности и заобиколно решение.

person horchler    schedule 19.10.2014