2013-07-17 44 views
1

我在处理一个简单的视频延迟时遇到了很多麻烦。我在互联网上环顾四周,不断找到相同的代码,我根本无法工作。当我第一次尝试时,它什么也没做(根本)。这是我的修改版本(至少似乎是将帧加载到缓冲区中),我真的不知道为什么它不起作用,我真的很厌烦拔出我的头发。请...请为上帝的爱请别人指出我在这里犯的愚蠢错误。 而现在,毫不拖延地(哈,明白了吗?),代码:处理中的视频延迟/缓冲区2.0

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; 
    } 
    } 
} 

回答

3

这个作品在处理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 -Method里面有问题。您只需存储对PImage对象的引用,该对象的像素始终会被覆盖。您必须使用buffer[inputFrame] = frame.get()而不是buffer[inputFrame] = frame。方法get()返回图像的副本。