首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Framerate()似乎不影响电影处理。

Framerate()似乎不影响电影处理。
EN

Stack Overflow用户
提问于 2020-03-27 12:33:05
回答 1查看 190关注 0票数 1

这一定是一件非常愚蠢的事情--如果是这样的话,很抱歉:) --但我在这个简单的问题上被困了很长时间,我似乎无法理解它。在processing.org文档或论坛上找不到任何东西。

基本上,我所做的就是加载一个.mp4 Movie,设置framerate,并将其设置为loop()。所有的事情都是应该的,但唯一的问题是,.framerate()似乎并没有影响到电影本身。以下是我理解的简化代码:

代码语言:javascript
复制
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()不是每秒调用一次,而是更多,因此,当前的视频帧也不是每秒都被绘制,即使我已经显式地将电影的帧设置为1 1fps.

为什么会这样呢?我是不是漏掉了什么?

谢谢!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 15:48:09

我能够重现你的问题,但没有纠正它。在根据处理文档中的示例尝试了非常简化的代码之后,我仍然无法使frameRate()工作。我甚至尝试了不同的渲染器,没有明显的结果。

您仍然可以通过简单的技术获得类似的结果。有一次,您可以计算帧数,以便每隔几个帧更新一次电影:

代码语言:javascript
复制
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();
}

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

如果您要使用“网络摄像头”效果,您可以随机设置帧计数,而不是让它定期更新:

代码语言:javascript
复制
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的速度播放它会“花栗鼠”的声音,举个例子。

如果我能帮忙的话请告诉我。玩得开心!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60886105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档