Проблемы с созданием файла фильма в MATLAB - PullRequest
6 голосов
/ 21 декабря 2011

Я пытаюсь создать фильм, просматривая кадры в MATLAB.

Ссылаясь на документацию mathworks.com по адресу http://www.mathworks.com/help/techdoc/ref/movie.html, Мне удалось анимировать сюжет. Однако возникают проблемы при попытке сохранить фильм в файле avi.

Оба метода avifile и VideoWriter из https://stackoverflow.com/a/8038540/818608, привели к одним и тем же ошибкам.

Несмотря на то, что анимация работает нормально, сохраненный фильм состоит только из одного фиксированного кадра, и иногда снимок экрана включает наложение моего фонового веб-браузера.

Заранее спасибо.

Ниже приведен код, который я использовал, и кадр, который заморожен на AVI, связан ниже.

Z = peaks; surf(Z); 
axis tight
set(gca,'nextplot','replacechildren');

vid = VideoWriter('myPeaks2.avi');
vid.Quality = 100;
vid.FrameRate = 15;
open(vid);
for k = 1:20 
    surf(sin(2*pi*k/20)*Z,Z)
    writeVideo(vid, getframe(gcf));
end
close(vid);

winopen('myPeaks2.avi')

The frame that's frozen on the avi is linked below

Ответы [ 6 ]

8 голосов
/ 27 сентября 2012

У меня была эта (ну, тесно связанная) проблема сегодня. Эта тема, посвященная стековому потоку, была одним из лучших результатов поиска, поэтому я подумал, что буду предоставлять будущим поисковикам дополнительную информацию.

Я использовал объект VideoWriter и вызывал frame=getframe(fig_handle), чтобы сохранить каждый кадр в видео. Как и в вопросе к этой теме, был сохранен только 1 кадр. Кроме того, сквозь него можно было видеть фон позади фигуры, как будто фигура была частично прозрачной.

Изменение рендера для художников или Zbuffer работал. (set(gcf,'renderer','zbuffer') например.)

Мне нужен был рендеринг openGL, поскольку в фильме использовалась прозрачность. Ключом к созданию этой работы было использование

opengl('software')

Это обошло проблему, которая, вероятно, была связана с отправкой графики на видеокарту и с нее (я точно не знаю ... это сработало, и я перешел).

3 голосов
/ 23 декабря 2011

Попробуйте следующее:

    f = figure();
    Z = peaks; surf(Z);
    a = axes('Parent',f);
    axis(a,'tight');
    set(a,'nextplot','replacechildren');
    vid = VideoWriter('myPeaks2.avi');
    vid.Quality = 100;
    vid.FrameRate = 15;
    open(vid);
    for k = 1:20
        surf(a,sin(2*pi*k/20)*Z,Z)
        writeVideo(vid, getframe(f));
    end
    close(vid);

    winopen('myPeaks2.avi')

Содержит явные дескрипторы, использующие вместо неявных. Много хаоса вызвано в Matlab, потому что люди склонны использовать неявные, такие как "gcf", "gca", которые должны были быть полностью удалены из языка, ИМХО.

3 голосов
/ 23 декабря 2011

Это прекрасно работает для меня.

Что если вы попытаетесь поместить drawnow в цикл после surf?(Это сбрасывает все события и обновляет вашу графику).

Может быть, это ваш проигрыватель фильмов или кодеки?Не могли бы вы попробовать VLC / Windows Media Player / и т. Д.?

0 голосов
/ 05 апреля 2016

У меня также была проблема с сохранением только одного кадра сегодня. Изменение частоты кадров с:

vid.FrameRate = round(0.2*fps/beatfreq);

, который оценивается как 3, просто:

vid.FrameRate = 10;

Я не могу понять, почему это будет иметь какое-либо значение, но оно быстро сработало после изменения этого.

РЕДАКТИРОВАТЬ: Оказывается, это был VLC, который не может обрабатывать очень низкие частоты кадров. Проигрыватель Windows Media воспроизводил его без проблем.

0 голосов
/ 30 августа 2013

Вы пытались изменить настройки монитора на 16-битный цвет? http://www.mathworks.com/matlabcentral/newsreader/view_thread/257389

0 голосов
/ 31 декабря 2011

Мне удалось заставить его работать, заставив рамки рисунков быть невидимыми, согласно http://www.mathworks.com/support/tech-notes/1200/1204.html:

aviobj=avifile('test.avi'); %creates AVI file, test.avi 
hf= figure('visible','off'); %turns visibility of figure off 
hax=axes; 

for k=1:10
  image(k.*peaks,'parent',hax); %puts image in invisible axes 
  set(gca,'Zlim',[-20 20]);  
  aviobj=addframe(aviobj,hf); %adds frames to the AVI file 
end  

aviobj=close(aviobj); %closes the AVI file  
close(hf); %closes the handle to invisible figure 

В конце дня сжатие не использовалось, так как я этого не делаюесть Indeo5.Правильно ли говорить, что мы можем исключить сжатие как проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...