这一定是一件非常愚蠢的事情--如果是这样的话,很抱歉:) --但我在这个简单的问题上被困了很长时间,我似乎无法理解它。在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()不是每秒调用一次,而是更多,因此,当前的视频帧也不是每秒都被绘制,即使我已经显式地将电影的帧设置为1 1fps.
为什么会这样呢?我是不是漏掉了什么?
谢谢!)
发布于 2020-03-30 15:48:09
我能够重现你的问题,但没有纠正它。在根据处理文档中的示例尝试了非常简化的代码之后,我仍然无法使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的速度播放它会“花栗鼠”的声音,举个例子。
如果我能帮忙的话请告诉我。玩得开心!
https://stackoverflow.com/questions/60886105
复制相似问题