2013-07-09 7 views
3

В MATLAB, если у меня есть массив, а именно матрица, первый столбец время и другие две координаты, и если я сюжет его:переменная частота кадров анимация в Matlab

ti=myarray(:,1); 
xi=myarray(:,2); 
yi=myarray(:,3); 

for i=1:length(ti) 
    plot(xi(i),yi(i));hold on; 
    Mov(i)=getframe; 
end 

Это записывает мой фильм равномерно , Когда я играю

movie(Mov,1,20) 

Предполагается, что фреймы равнохронологически распределены.

Могу ли я сделать сюжет, чтобы фильм воспроизводился в указанное время?

Обратите внимание, что pause если возможно, возможно, не вариант для меня. Системное время медленное (10ms точность). И сочетание медленной обработки Matlab и низкой точности системного времени даст нежелательные результаты. Также обратите внимание, что мой fps может идти выше 100. Но если это можно реализовать, я приветствую это.

+1

Как только я захотел сделать это (напишите такой фильм в файл), но я не думаю, что есть формат фильма для * переменной частоты кадров *. Если это просто для представления результата человеческому глазу, вы можете найти приблизительный минимальный шаг времени и умножить кадры с более длительным временем показа соответственно. Это приведет к созданию фильма большего размера, так как вы увеличиваете количество кадров. Рад услышать реальное решение! – pm89

+2

@ pm89: не очень уверен в этом: смотрю [эту страницу вики] (http://en.wikipedia.org/wiki/Variable_frame_rate), а затем список контейнеров, которые его поддерживают [здесь] (http: // en.wikipedia.org/wiki/Comparison_of_container_formats), это должно быть возможно, по крайней мере теоретически. Не знаю, как это сделать в MATLAB хотя :) –

+1

@RodyOldenhuis: Спасибо за хорошие новости! Но, к сожалению, «AVI» относится к числу немногих, которые на самом деле не поддерживают его; в вашем [списке ссылок на контейнеры] (http://en.wikipedia.org/wiki/Comparison_of_container_formats) о 'AVI' он говорит:« Хотя AVI не предназначен для переменных фреймов, их можно использовать без создания -стандартный файл с использованием 0-байтовых фрагментов для пропущенных кадров. Однако для этого требуется, чтобы частота кадров была установлена ​​на минимальное общее кратное всех используемых фреймов, и дает небольшие накладные расходы по сравнению с истинным VFR ». – pm89

ответ

3

Чтобы создать фильмы с переменной частотой кадров, вы можете использовать класс QTWriter. Это один простой в использовании файл класса, вдохновленный классом Matlab VideoWriter, который позволяет нативный экспорт видео в формате QuickTime в нескольких форматах, подходящих для графики в стиле Matlab. Больше ничего не требуется, даже QuickTime (если вы не хотите воспроизводить выходные файлы). Примечательно, что он поддерживает способность Quicktime постоянно изменять частоту кадров.

Вот пример кода, который производит фильм, похожий на this QuickTime movie:

% Prepare new movie file using the default PNG compression 
movObj = QTWriter('peaks.mov'); 

% Create an animation 
hf = figure; Z = peaks; surfc(Z); frames = 100; 
axis tight; set(gca,'nextplot','replacechildren'); 

% Animate plot and write movie 
for k = 0:frames 
    surfc(sin(2*pi*k/frames)*Z,Z); 

    % Vary the frame-rate 
    movObj.FrameRate = k; 

    % Write each frame to the file 
    writeMovie(movObj,getframe(hf)); 
end 

% Finish writing movie and close file 
close(movObj); 

В пределах Matlab, переменная частота кадров QuickTime фильмы могут быть воспроизведены с VideoReader класса от Matlab (я не уверен, что это на Windows/Linux) путем передачи readerobj.FrameRate функции movie. Если вы конвертируете выходные видеоролики в другой формат контейнера (например, AVI) или кодек, который не поддерживает переменные framerates (или если ваше программное обеспечение для преобразования не работает), вам нужно установить частоту кадров преобразованного фильма на самый высокий частота кадров в файле QuickTime. Это может привести к большим файлам - можно думать или изменять фильмы с частотой кадров как временно сжатые (немного похоже на межкадровое сжатие).

Параметр frameerate не имеет бесконечного разрешения и диапазона, поэтому, возможно, потребуется также настроить параметр 'TimeScale'. Любой фильм может испытывать трудности с воспроизведением в высоких кадрах в зависимости от оборудования пользователя, вычислительной стоимости декодирования и скорости передачи данных. Обычно игроки просто бросают кадры. QTWriter также имеет опцию 'PlayAllFrames', которая заставляет QuickTime Player отображать каждый кадр - это может привести к воспроизведению в режиме реального времени. В качестве альтернативы можно выбрать тип сжатия «Photo TIFF», который быстрее декодирует за счет немного больших размеров файлов.

Код с открытым исходным кодом (BSD), размещенный на Github, и я приветствую участников. Существует еще много возможностей для оптимизации и улучшения. Вы можете увидеть другой пример и результирующий фильм на project webpage.

+1

Спасибо! Очень хорошо! :) – pm89

Смежные вопросы