We are about to switch to a new forum software. Until then we have removed the registration on this forum.
What's wrong with my code. The video is playable but it is without the frame differencing filter.
import processing.video.*;
int numPixels;
int[] previousFrame;
Movie video;
void setup() {
size(1920, 1080);
// This the default video input, see the GettingStartedCapture
// example if it creates an error
video = new Movie(this, "abc.mp4");
// Start capturing the images from the camera
video.loop();
//video.read();
numPixels = video.width * video.height;
// Create an array to store the previously captured frame
previousFrame = new int[numPixels];
loadPixels();
}
void draw() {
if (video.available()) {
// When using video to manipulate the screen, use video.available() and
// video.read() inside the draw() method so that it's safe to draw to the screen
video.read(); // Read the new frame from the camera
video.loadPixels(); // Make its pixels[] array available
image(video, 0, 0);
int movementSum = 0; // Amount of movement in the frame
for (int i = 0; i < numPixels; i++) { // For each pixel in the video frame...
color currColor = video.pixels[i];
color prevColor = previousFrame[i];
// Extract the red, green, and blue components from current pixel
int currR = (currColor >> 16) & 0xFF; // Like red(), but faster
int currG = (currColor >> 8) & 0xFF;
int currB = currColor & 0xFF;
// Extract red, green, and blue components from previous pixel
int prevR = (prevColor >> 16) & 0xFF;
int prevG = (prevColor >> 8) & 0xFF;
int prevB = prevColor & 0xFF;
// Compute the difference of the red, green, and blue values
int diffR = abs(currR - prevR);
int diffG = abs(currG - prevG);
int diffB = abs(currB - prevB);
// Add these differences to the running tally
movementSum += diffR + diffG + diffB;
// Render the difference image to the screen
pixels[i] = color(diffR, diffG, diffB);
// The following line is much faster, but more confusing to read
//pixels[i] = 0xff000000 | (diffR << 16) | (diffG << 8) | diffB;
// Save the current color into the 'previous' buffer
previousFrame[i] = currColor;
}
// To prevent flicker from frames that are all black (no movement),
// only update the screen if the image has changed.
if (movementSum > 0) {
updatePixels();
println(movementSum); // Print the total amount of movement to the console
}
}
}
Answers
You're calling read() at 2 places: draw() & movieEvent()!
Easiest fix is simply remove movieEvent(). Although read() in draw() isn't very performant.
Same. Even i removed movieEvent(). Frame differencing filter still not there.
fixed
Hello, I met the same error with the same code. How did you fix it? My code gives the sounds of my video with the just gray screen. What is the movieEvent() which I should remove?