【问题标题】:Framerate() doesn't seem to affect Movie - ProcessingFramerate() 似乎不影响电影 - 处理
【发布时间】:2020-03-27 12:33:05
【问题描述】:

这一定是一件非常愚蠢的事情——如果是这样的话,我很抱歉:)——但我确实已经被这个简单的问题困扰了很长时间,而且我似乎无法理解它。在 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...

这是为什么呢?我在这里遗漏了什么吗?

提前致谢! :)

【问题讨论】:

  • 我能够重现此问题。我没有看到代码有任何问题。我发现了一个 hack 来重现预期的结果,但没有解决真正的问题。让我知道您是否想要 hack(即,如果您只想要视觉效果而没有较低帧速率的好处)。
  • 感谢@laancelot 的评论。在尝试了很长时间之后,我决定使用 speed() 来代替它,它得到了我想要的结果,基本上只是视频的帧速率变慢了。但是,如果您无法重现该问题,则 framerate() 必须有效,所以我一定是在这里做错了...虽然它的精确度要低得多,因为它需要速度的倍数而不是速度本身。但我会管理的,谢谢:) 另外,你知道 framerate() 和 speed() 之间的区别吗?谢谢!
  • 我能够重现该问题。我什至用 Processing Foundation 展示的示例代码来解释 framerate()。函数本身可能有问题,或者我们可能共享了错误的设置。
  • framerate 不会改变视频的速度,它只会减少每秒显示的帧数。半速 10 秒的视频将持续 20 秒。半帧率的同一视频仍将持续 10 秒。
  • 哦,谢谢@laancelot!我虽然这两个功能基本上做同样的事情,但你的解释澄清了事情。当我想到它时,这很合乎逻辑。我想一定让我感到困惑的是,草图 framerate() 函数会改变草图的速度。但是,是的, speed() 是我正在寻找的,但是 framerate() 似乎并没有像你解释的那样工作。再次感谢你!如果你愿意,你可以发布这个评论作为答案,我会接受它:)

标签: video processing frame-rate


【解决方案1】:

我能够重现您的问题,但无法纠正它。在根据 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();
}

这里有趣的是声音不会受到影响,因为电影仍然以相同的速度阅读,只是不是每一帧都以图形方式显示。

如果你想要“网络摄像头”效果,你可以随机化帧数而不是让它定期更新:

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 的速度播放会“花栗鼠”声音。

如果我能提供帮助,请告诉我。玩得开心!

【讨论】:

    猜你喜欢
    • 2013-08-12
    • 2013-06-28
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2012-10-22
    相关资源
    最近更新 更多