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" 声音。

如果我能帮上忙,请告诉我。玩得开心!