Framerate() 似乎不影响 Movie - Processing
Framerate() doesn't seem to affect Movie - Processing
这一定是非常愚蠢的事情 - 如果是这样的话,我很抱歉 :) - 但我真的已经在这个简单的问题上停留了很长时间,而且我似乎无法理解它。在 processing.org 文档或论坛上找不到任何内容。
所以基本上,我所做的就是加载 .mp4 Movie
,设置 framerate
,然后将其设置为 loop()
。一切都按应有的方式绘制,但唯一的问题是 .framerate()
似乎不会影响电影本身。这是我简化的理解代码:
String urlCam1 = "Something.mp4";
Movie camera1;
Movie currentCam;
boolean drawNextFrame = false;
void setup() {
fullScreen();
camera1 = new Movie(this, urlCam1);
camera1.frameRate(1);
camera1.loop();
background(0);
}
void draw() {
if (drawNextFrame) {
image(currentCam, 0, 0, 100, 100);
drawNextFrame = false;
}
}
void movieEvent(Movie m) {
print("Video Read");
m.read();
drawNextFrame = true;
currentCam = m;
}
您可能想知道为什么我使用如此奇怪的结构(特别是 currentCam
),那是因为我同时绘制了多部电影。但是我只用一部电影尝试了代码(如代码所示),但问题仍然存在。
注意 camera1.framerate
是如何设置为 1 fps 的。出于某种原因,即使没有给出错误,这一行似乎也被忽略了。 movieEvent()
不是每秒调用一次,而是调用更多次,因此,视频的当前帧也不是每秒绘制一次,即使我已明确将电影的帧速率设置为 1fps。 ..
这是为什么?我在这里遗漏了什么吗?
提前致谢! :)
我能够重现您的问题,但无法更正它。在根据 Processing 文档中的示例尝试了非常简化的代码后,我仍然无法使 frameRate()
工作。我什至尝试了不同的渲染器,但没有明显的结果。
您仍然可以通过简单的技术获得类似的结果。这一次,您可以计算帧数,以便每几帧只更新一次影片:
Movie myMovie;
int frameCounter = 0;
int framerate = 30;
int movieFPS = 3; // the movie will be updated only 3 times per second
int updateFrame = 1;
void setup() {
size(200, 200);
frameRate(framerate);
updateFrame = framerate / movieFPS;
myMovie = new Movie(this, "SampleVideo_360x240_30mb.mp4");
myMovie.loop();
}
void draw() {
if (frameCounter++ % updateFrame == 0) {
image(myMovie, 0, 0);
}
}
// Called every time a new frame is available to read
void movieEvent(Movie m) {
m.read();
}
这里有趣的是声音不会受到影响,因为电影仍然以相同的速度阅读,只是不是每一帧都以图形方式显示。
如果你想要 "webcam" 效果,你可以随机化帧数而不是定期更新:
Movie myMovie;
int frameCounter = 0;
int framerate = 30;
int minFramesBetweenUpdate = 10;
int maxFramesBetweenUpdate = 45;
int updateFrame = 1;
void setup() {
size(200, 200);
frameRate(framerate);
myMovie = new Movie(this, "SampleVideo_360x240_30mb.mp4");
myMovie.loop();
}
void draw() {
if (frameCounter++ > updateFrame) {
image(myMovie, 0, 0);
updateFrame = frameCounter + (int)random(minFramesBetweenUpdate, maxFramesBetweenUpdate);
}
}
// Called every time a new frame is available to read
void movieEvent(Movie m) {
m.read();
}
从技术上讲,帧率不会改变电影的显示速度,只会改变特定时间内看到的帧数。具有不同帧率的 10 秒视频将始终在 10 秒内播放。
如果你想改变电影的显示速度,你需要使用类似myMovie.speed(0.5);
的东西。播放电影的速度会改变 运行 播放电影所需的时间。例如,如果您的电影有声音,以超过 1.0 的速度播放会 "chipmunk" 声音。
如果我能帮上忙,请告诉我。玩得开心!
这一定是非常愚蠢的事情 - 如果是这样的话,我很抱歉 :) - 但我真的已经在这个简单的问题上停留了很长时间,而且我似乎无法理解它。在 processing.org 文档或论坛上找不到任何内容。
所以基本上,我所做的就是加载 .mp4 Movie
,设置 framerate
,然后将其设置为 loop()
。一切都按应有的方式绘制,但唯一的问题是 .framerate()
似乎不会影响电影本身。这是我简化的理解代码:
String urlCam1 = "Something.mp4";
Movie camera1;
Movie currentCam;
boolean drawNextFrame = false;
void setup() {
fullScreen();
camera1 = new Movie(this, urlCam1);
camera1.frameRate(1);
camera1.loop();
background(0);
}
void draw() {
if (drawNextFrame) {
image(currentCam, 0, 0, 100, 100);
drawNextFrame = false;
}
}
void movieEvent(Movie m) {
print("Video Read");
m.read();
drawNextFrame = true;
currentCam = m;
}
您可能想知道为什么我使用如此奇怪的结构(特别是 currentCam
),那是因为我同时绘制了多部电影。但是我只用一部电影尝试了代码(如代码所示),但问题仍然存在。
注意 camera1.framerate
是如何设置为 1 fps 的。出于某种原因,即使没有给出错误,这一行似乎也被忽略了。 movieEvent()
不是每秒调用一次,而是调用更多次,因此,视频的当前帧也不是每秒绘制一次,即使我已明确将电影的帧速率设置为 1fps。 ..
这是为什么?我在这里遗漏了什么吗?
提前致谢! :)
我能够重现您的问题,但无法更正它。在根据 Processing 文档中的示例尝试了非常简化的代码后,我仍然无法使 frameRate()
工作。我什至尝试了不同的渲染器,但没有明显的结果。
您仍然可以通过简单的技术获得类似的结果。这一次,您可以计算帧数,以便每几帧只更新一次影片:
Movie myMovie;
int frameCounter = 0;
int framerate = 30;
int movieFPS = 3; // the movie will be updated only 3 times per second
int updateFrame = 1;
void setup() {
size(200, 200);
frameRate(framerate);
updateFrame = framerate / movieFPS;
myMovie = new Movie(this, "SampleVideo_360x240_30mb.mp4");
myMovie.loop();
}
void draw() {
if (frameCounter++ % updateFrame == 0) {
image(myMovie, 0, 0);
}
}
// Called every time a new frame is available to read
void movieEvent(Movie m) {
m.read();
}
这里有趣的是声音不会受到影响,因为电影仍然以相同的速度阅读,只是不是每一帧都以图形方式显示。
如果你想要 "webcam" 效果,你可以随机化帧数而不是定期更新:
Movie myMovie;
int frameCounter = 0;
int framerate = 30;
int minFramesBetweenUpdate = 10;
int maxFramesBetweenUpdate = 45;
int updateFrame = 1;
void setup() {
size(200, 200);
frameRate(framerate);
myMovie = new Movie(this, "SampleVideo_360x240_30mb.mp4");
myMovie.loop();
}
void draw() {
if (frameCounter++ > updateFrame) {
image(myMovie, 0, 0);
updateFrame = frameCounter + (int)random(minFramesBetweenUpdate, maxFramesBetweenUpdate);
}
}
// Called every time a new frame is available to read
void movieEvent(Movie m) {
m.read();
}
从技术上讲,帧率不会改变电影的显示速度,只会改变特定时间内看到的帧数。具有不同帧率的 10 秒视频将始终在 10 秒内播放。
如果你想改变电影的显示速度,你需要使用类似myMovie.speed(0.5);
的东西。播放电影的速度会改变 运行 播放电影所需的时间。例如,如果您的电影有声音,以超过 1.0 的速度播放会 "chipmunk" 声音。
如果我能帮上忙,请告诉我。玩得开心!