【问题标题】:Pixelated Video with Processing带处理的像素化视频
【发布时间】:2016-04-19 14:32:35
【问题描述】:

我正在尝试加载视频,然后以像素化方式显示它。它在加载很长时间后工作了一次,但后来它停止工作 - 只是一个黑屏,什么都没有出现,没有错误消息我想知道出了什么问题。谢谢。

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

【问题讨论】:

  • 你说它停止工作是什么意思?你看到错误了吗?一些奇怪的行为?那是什么行为?
  • @KevinWorkman 不,没有错误。这只是一个黑屏。有一次,因为忘记关了,隔了很久才出现视频。然后我还以为是加载时间过长,于是又试了一遍,还是没有。
  • @KevinWorkman 感谢您指出这一点。我已经更新了我的问题。
  • 你能把视频贴在某个地方并链接到它吗? (它至少完全播放一次吗?)
  • @GeorgeProfenza 好吧,它是哪个视频并不重要。我只是在测试一些东西,并尝试了多个,但都没有奏效。所以它可以是任何 640 x 360 的视频。

标签: java video processing video-processing


【解决方案1】:

你可能是从错误的地方取样:

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

首先,i 是您的 cols 计数器,即 x 维度,j 是行计数器,y 维度。 其次,您可能希望以相同的比例进行采样,因此需要乘以 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2020-07-30
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多