2012-03-02 1 views
2

Я делаю видео из последовательности графиков, используя VideoWriter. Он работает в основном ОК (после следующего совета в this SO answer). Тем не менее, похоже, что Matlab пытается отобразить все 3000 кадров на экране последовательно после того, как это сделало анимацию, из-за чего мой оконный менеджер выкапывается, и компьютер замораживается в течение нескольких минут.Запись видеокадров непосредственно в файл, минуя показ экрана

Есть ли способ записать видеокадры непосредственно на диск, минуя экранирование экрана? Кажется, что getframe в writeVideo(vid, getframe(f)) обязательно делает фигуру видимой; есть ли способ избежать этого?

+1

К сожалению, я не думаю, что это так, хотя это было бы неплохо. С http://www.mathworks.com/help/techdoc/ref/getframe.html: «Примечание. В ситуациях, когда программное обеспечение MATLAB работает на виртуальном рабочем столе, который в настоящее время не отображается на вашем мониторе, вызовы getframe будут завершены, но захватит область на вашем мониторе, которая соответствует позиции, занимаемой фигурой или осями на скрытом рабочем столе. Поэтому убедитесь, что окно, которое будет захвачено с помощью getframe, существует на текущем рабочем столе ». Это похоже на довольно сложное поведение. – tmpearce

+0

Мой опыт тот же, я бы тоже приветствовал любые недокументированные функции, которые позволили бы эту функциональность. – macduff

ответ

2

Если у вас есть только 3000 кадров, вы можете сохранить их как изображения и сделать видео из изображений с помощью чего-то вроде ffmpeg. Не забудьте использовать формат без потерь для изображений, например PNG.

0

Использование avifile и addframe позволит вам создать видео и не отображать его на экране. Это, кажется, более медленный способ делать что-то.

Вот пример, основанный на упомянутой должности:

mov = avifile('myPeaks2.avi','fps',15); 
set(gcf, 'visible', 'off') 

for k=1:20 
    surf(sin(2*pi*k/20)*Z,Z); 
    mov = addframe(mov, gcf); 
end 
mov = close(mov); 

Конечно, этот метод не рекомендуется, поэтому в конце концов, вы не сможете его использовать.

+0

Так как этот метод устарел, что является предпочтительным способом делать то, что, надеюсь, не пожертвует временем? – hyiltiz

1

Не используйте получить кадр, но использовать im2frame вместо

writerObj = VideoWriter('awesomeMovie.mp4', 'MPEG-4'); 
open(writerObj); 
masterFrame = rand(10,10,3); 
f = im2frame(masterFrame); 
writeVideo(writerObj,f); 
Смежные вопросы