Processing 2.0中的视频延迟/缓冲区

Processing 2.0中的视频延迟/缓冲区,processing,video-capture,Processing,Video Capture,我在处理一个简单的视频延迟时遇到了很多麻烦。我在互联网上四处寻找,我一直在寻找相同的代码,但我根本无法让它工作。当我第一次尝试它时,它什么也没做。这是我修改过的版本(至少看起来是将帧加载到缓冲区中),我真的不知道为什么它不起作用,我真的厌倦了拔头发。请看在上帝的份上,请有人指出我犯的愚蠢错误。 现在,不再拖延(哈,明白了吗?),代码: import processing.video.*; VideoBuffer vb; Movie myMovie; Capture cam; float se

我在处理一个简单的视频延迟时遇到了很多麻烦。我在互联网上四处寻找,我一直在寻找相同的代码,但我根本无法让它工作。当我第一次尝试它时,它什么也没做。这是我修改过的版本(至少看起来是将帧加载到缓冲区中),我真的不知道为什么它不起作用,我真的厌倦了拔头发。请看在上帝的份上,请有人指出我犯的愚蠢错误。 现在,不再拖延(哈,明白了吗?),代码:

import processing.video.*;

VideoBuffer vb;
Movie myMovie;
Capture cam;

float seconds = 1;

void setup() {
  size(320,240, P3D);
  frameRate(30);

  String[] cameras = Capture.list();

  if (cameras.length == 0) {
    println("There are no cameras available for capture.");
    exit();
  } else {
    println("Available cameras:");
    for (int i = 0; i < cameras.length; i++) {
      println(cameras[i]);
    }
  cam = new Capture(this, cameras[3]);
  cam.start(); 

  }

  vb = new VideoBuffer(90, width, height);

}

void draw() {

  if (cam.available() == true) {
    cam.read();
    vb.addFrame(cam);
  }

  image(cam, 0, 0);
  image( vb.getFrame(), 150, 0 );

}  



class VideoBuffer
{
  PImage[] buffer;

  int inputFrame = 0;
  int outputFrame = 0;
  int frameWidth = 0;
  int frameHeight = 0;

  VideoBuffer( int frames, int vWidth, int vHeight )
  {
    buffer = new PImage[frames];
    for(int i = 0; i < frames; i++)
    {
  this.buffer[i] = new PImage(vWidth, vHeight);
    }
    this.inputFrame = 0;
    this.outputFrame = 1;
    this.frameWidth = vWidth;
    this.frameHeight = vHeight;
  }

  // return the current "playback" frame.  
  PImage getFrame()
  {
    return this.buffer[this.outputFrame];
  } 

  // Add a new frame to the buffer.
  void addFrame( PImage frame )
  {
    // copy the new frame into the buffer.
    this.buffer[this.inputFrame] = frame;

    // advance the input and output indexes
    this.inputFrame++;
    this.outputFrame++;
    println(this.inputFrame + " " + this.outputFrame);

    // wrap the values..    
    if(this.inputFrame >= this.buffer.length)
    {
 this.inputFrame = 0;
    }
    if(this.outputFrame >= this.buffer.length)
    {
  this.outputFrame = 0;
    }
  }  
} 
导入处理。视频。*;
视频缓冲区;
电影我的电影;
捕捉凸轮;
浮动秒数=1;
无效设置(){
大小(320240,P3D);
帧率(30);
String[]cameras=Capture.list();
if(cameras.length==0){
println(“没有可供拍摄的摄像机”);
退出();
}否则{
println(“可用摄像机:”);
对于(int i=0;i=this.buffer.length)
{
this.inputFrame=0;
}
if(this.outputFrame>=this.buffer.length)
{
this.outputFrame=0;
}
}  
} 

这在Processing 2.0.1中起作用

import processing.video.*;

Capture cam;
PImage[] buffer;
int w = 640;
int h = 360;
int nFrames = 60;
int iWrite = 0, iRead = 1;

void setup(){
  size(w, h);
  cam = new Capture(this, w, h);
  cam.start();
  buffer = new PImage[nFrames];
}

void draw() {
  if(cam.available()) {
    cam.read();
    buffer[iWrite] = cam.get();
    if(buffer[iRead] != null){
      image(buffer[iRead], 0, 0);
    }
    iWrite++;
    iRead++;
    if(iRead >= nFrames-1){
      iRead = 0;
    }
    if(iWrite >= nFrames-1){
      iWrite = 0;
    }
  }       
}
addFrame
-方法中存在问题。您只需存储对PImage对象的引用,该对象的像素会一直被覆盖。您必须使用
buffer[inputFrame]=frame.get()
而不是
buffer[inputFrame]=frame
get()
方法返回图像的副本