Кодируйте видео, удаляя повторяющиеся кадры — Matlab

Я хочу найти способ устранить повторяющиеся кадры из видео. Если я рассматриваю видео, в котором будет неоднократно отображаться один и тот же кадр в течение 5 секунд, я хочу включить в видео только один кадр и сделать его видимым в течение 5 секунд. Здесь я с нетерпением жду возможности минимизировать размер файла, удалив дубликаты кадров. Есть ли способ сделать это с помощью Matlab?


person Asanga Ranasinghe    schedule 19.10.2014    source источник
comment
Посмотрите на взаимную корреляцию или различия суммы квадратов интенсивности как на средство их сравнения.   -  person Benoit_11    schedule 19.10.2014
comment
Сложная часть будет, когда вы будете воспроизводить файл. Вы не можете использовать любого случайного игрока, который играет с постоянной частотой кадров. Вам нужно будет прикрепить метаданные 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, они действительно довольно большие, тогда я обычно использую handbrake для преобразования (и сжатия ) их. В зависимости от того, насколько много движения в видео, окончательный размер файла составляет от 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, by 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 с фиксированной частотой кадров с потерями (фильмы Photo JPEG не преобразуются). Дополнительные сведения и обходной путь см. в моем примечании внизу этой страницы.

person horchler    schedule 19.10.2014