2016-04-19 12 views
0

ビデオを読み込んでピクセル化して表示しようとしています。それは非常に長い時間の読み込み後に一度働いたが、それは動作を停止 - ちょうど黒い画面と何も来るとエラーメッセージなし何がうまくいかないのだろうか。ありがとう。あなたがここで間違った場所から採取することができる処理済みピクセルビデオ

import processing.video.*; 
Movie movie; 

int videoScale = 8; 
int cols, rows; 

void setup() { 
    size(640, 360); 
    background(0); 
    movie = new Movie(this, "movie.mp4"); 
    movie.loop(); 

    cols = width/videoScale; 
    rows = height/videoScale; 
} 

void draw() { 
    movie.loadPixels(); 

    for (int i = 0; i < cols; i++) { 
    for (int j = 0; j < rows; j++) { 
    int x = i * videoScale; 
    int y = j * videoScale; 
    color c = movie.pixels[i + j * movie.width]; 
    fill(c); 
    noStroke(); 
    rect(x, y, videoScale, videoScale); 
    } 
    } 
} 

// Called every time a new frame is available to read 
void movieEvent(Movie movie) { 
    movie.read(); 
} 
+0

あなたはそれが動作を停止したと正確に何を意味するのですか?エラーが表示されますか?奇妙な行動ですか?それはどのような振る舞いですか? –

+0

@KevinWorkmanいいえ、エラーはありません。それは単なる黒い画面です。私はそれを閉じることを忘れていたので、ビデオが長い時間の後に来た1つの時間があった。私はそれがローディング時間が長すぎるためだと思ったので、私はもう一度試しましたが、何も出てこなかった。 – practicemakesperfect

+0

@KevinWorkmanそれを指摘してくれてありがとう。私は私の質問を更新しました。 – practicemakesperfect

答えて

1

:オフ

color c = movie.pixels[i + j * movie.width]; 

まず、iはx次元である、あなたのcolsのカウンタであり、jは、行カウンタ、yの次元です。 第2に、同じスケールでサンプリングしたいので、おそらくvideoScaleを乗算する必要があります。あなたはすでにそのためのx,y変数を持っているので、このようにサンプリングしてみてください:

color c = movie.pixels[y * movie.width + x]; 

また、あなたはその後、小さなバッファを描き、小規模(リサンプル)でに描画するためにフレームバッファとしてPGraphicsインスタンスを使用することができますより大きいスケールで:

import processing.video.*; 
Movie movie; 

int videoScale = 8; 
int cols, rows; 
PGraphics resized; 

void setup() { 
    size(640, 360); 
    background(0); 
    noSmooth();//remove aliasing 

    movie = new Movie(this, "transit.mov"); 
    movie.loop(); 

    cols = width/videoScale; 
    rows = height/videoScale; 

    //setup a smaller sized buffer to draw into 
    resized = createGraphics(cols, rows); 
    resized.beginDraw(); 
    resized.noSmooth();//remove aliasing 
    resized.endDraw(); 
} 

void draw() { 
    //draw video resized smaller into a buffer 
    resized.beginDraw(); 
    resized.image(movie,0,0,cols,rows); 
    resized.endDraw(); 
    //draw the small buffer resized bigger 
    image(resized,0,0,movie.width,movie.height); 
} 

// Called every time a new frame is available to read 
void movieEvent(Movie movie) { 
    movie.read(); 
}