2016-04-19 7 views
0

Ich versuche ein Video zu laden und es dann pixelig anzuzeigen. Es funktionierte eine Zeit nach dem Laden für sehr lange Zeit, aber dann hörte es auf zu arbeiten - nur ein schwarzer Bildschirm und nichts kommt auf und ohne Fehlermeldung Ich frage mich, was schief geht. Vielen Dank.Pixelated Video mit der Verarbeitung

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

Was genau meinen Sie, wenn Sie sagen, es funktioniert nicht mehr? Siehst du einen Fehler? Ein seltsames Verhalten? Welches Verhalten ist das? –

+0

@KevinWorkman Nein, es gibt keinen Fehler. Es ist nur ein schwarzer Bildschirm. Es gab einmal ein Video, das nach langer Zeit auftauchte, weil ich vergessen hatte, es zu schließen. Dann dachte ich, es war, weil die Ladezeit zu lang war, also versuchte ich es erneut, aber nichts kam auf. – practicemakesperfect

+0

@KevinWorkman Danke, dass du das herausgibst. Ich habe meine Frage aktualisiert. – practicemakesperfect

Antwort

1

Sie können hier von der falschen Stelle Probenahme werden:

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

First off, i Ihre cols Zähler, die die x-Dimension ist, ist die j die Reihen Zähler, y Dimension. Zweitens möchten Sie wahrscheinlich im gleichen Maßstab Probe und müssen daher mit videoScale multiplizieren. Sie haben bereits die x,y Variablen für das, so versuchen Probenahme wie folgt aus:

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

Alternativ können Sie auch eine PGraphics Instanz verwenden als ein Rahmenpuffer in in einem kleineren Maßstab Unentschieden (Resampling), dann den kleinen Puffer zeichnen in größerem Maßstab:

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(); 
} 
Verwandte Themen