Processing实现视频左半部分镜像至右半部分时视频卡顿问题求助
视频镜像效果修复方案
问题出在这几个地方:
- 画面未更新:你只把视频/镜像内容绘制到了
flippedBuffer缓冲区,但从未将这个缓冲区的内容渲染到主画布上,导致屏幕一直停留在初始帧。 - 无效的帧读取判断:代码中使用了未定义的
overlay变量,movie.available() && overlay.available()条件永远不成立,draw内的帧读取逻辑完全失效。 - 镜像源错误:启用镜像时,你从主画布截取左半部分,但此时画布还未绘制当前帧的视频内容,拿到的都是旧帧数据。
改好的完整代码:
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
相关产品推荐
相关产品推荐

