You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Processing实现视频左半部分镜像至右半部分时视频卡顿问题求助

视频镜像效果修复方案

问题出在这几个地方:

  1. 画面未更新:你只把视频/镜像内容绘制到了flippedBuffer缓冲区,但从未将这个缓冲区的内容渲染到主画布上,导致屏幕一直停留在初始帧。
  2. 无效的帧读取判断:代码中使用了未定义的overlay变量,movie.available() && overlay.available()条件永远不成立,draw内的帧读取逻辑完全失效。
  3. 镜像源错误:启用镜像时,你从主画布截取左半部分,但此时画布还未绘制当前帧的视频内容,拿到的都是旧帧数据。

改好的完整代码:

import processing.video.*;
boolean flipVideo = false;
Movie movie;

PGraphics flippedBuffer;

void setup() {
  size(640, 480);
  frameRate(30);
  
  movie = new Movie(this, "movie.mov");
  movie.loop();
  
  // 等视频加载出第一帧再初始化缓冲区,避免尺寸出错
  while (!movie.available()) {
    movie.read();
  }
  flippedBuffer = createGraphics(movie.width, movie.height);
}

void draw() {
  movie.loadPixels();
  
  flippedBuffer.beginDraw();
  if (flipVideo) {
    // 直接从当前视频帧截取左半部分,而非主画布
    PImage leftHalf = movie.get(0, 0, movie.width/2, movie.height);
    // 绘制原左半部分
    flippedBuffer.image(leftHalf, 0, 0);
    // 镜像翻转后绘制到右侧
    flippedBuffer.pushMatrix();
    flippedBuffer.translate(movie.width, 0);
    flippedBuffer.scale(-1, 1);
    flippedBuffer.image(leftHalf, 0, 0);
    flippedBuffer.popMatrix();
  } else {
    // 正常显示原视频
    flippedBuffer.image(movie, 0, 0);
  }
  flippedBuffer.endDraw();
  
  // 关键:将处理好的内容绘制到屏幕上
  image(flippedBuffer, 0, 0);
}

void movieEvent(Movie m) {
  m.read();
}

// 保留你的TUIO逻辑
void addTuioObject(TuioObject tobj) {
  // 比如在这里触发镜像:flipVideo = true;
}

void removeTuioObject(TuioObject tobj) {
  // 比如在这里关闭镜像:flipVideo = false;
}

关键修改说明:

  • 新增image(flippedBuffer, 0, 0),终于将处理后的内容显示到主画布
  • 等待视频加载出第一帧再初始化缓冲区,避免视频未加载完成导致的尺寸错误
  • 直接从视频帧截取左半部分,保证使用的是当前最新画面
  • 删除无效的overlay判断,依赖movieEvent正常处理帧更新
  • 完善镜像绘制逻辑:先绘制原左半部分,再通过矩阵变换镜像到右侧,完整覆盖整个画面

内容的提问来源于stack exchange,提问作者mrblade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:37:21