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

Processing手势控制视频播放代码无画面问题求助

问题排查与修复方案

核心问题与修复点

  • Movie事件未正确注册
    Processing的Movie类需要通过addEventListener关联movieEvent回调,原代码中registerMovieEvent是空实现,导致视频帧无法更新(movieEvent不触发,currentVideo.available()始终为false,渲染逻辑无法执行)。
    修复:删除空的registerMovieEvent函数,创建新视频实例后调用m.addMovieEventListener(this),确保帧更新事件能被捕获。

  • 字符串比较逻辑错误
    Java/Processing中==比较的是字符串对象的引用地址,而非内容,原代码中Name=="look1,3.mp4"这类判断会导致分支逻辑失效。
    修复:所有字符串比较替换为equals()方法。

  • 视频结束逻辑重复冲突
    draw()和movieEvent()同时处理视频结束逻辑,导致状态混乱。应将视频结束的切换逻辑统一放在movieEvent()中,draw()仅负责渲染帧和监听串口输入。

  • 状态变量维护混乱
    多处修改videoPlaying易导致状态不一致,可通过统一的视频加载函数维护状态,或直接使用currentVideo.isPlaying()判断播放状态。


修正后的完整代码

import processing.video.*;
import processing.serial.*;

Serial myPort;
Movie currentVideo;
String currentVideoName;

void setup() {
  size(1080, 1920);
  
  // 初始化第一个视频
  loadVideo("look1,1.mp4");
  
  // 初始化串口(根据实际端口选择,保持路径统一)
  String portName = "/dev/tty.usbmodem142401"; // 也可替换为 Serial.list()[0]
  myPort = new Serial(this, portName, 9600);
}

void draw() {
  // 渲染视频帧(仅当视频可用时)
  if (currentVideo != null && currentVideo.available()) {
    image(currentVideo, 0, 0, width, height);
  }
  
  // 实时监听串口手势指令
  while (myPort.available() > 0) {
    String input = myPort.readStringUntil('\n');
    if (input != null) {
      input = input.trim();
      switch(input) {
        case "up":
          loadVideo("look1,5.mp4");
          break;
        case "down":
          loadVideo("look1,6.mp4");
          break;
        case "left":
          loadVideo("look1,3.mp4");
          break;
        case "right":
          loadVideo("look1,2.mp4");
          break;
      }
    }
  }
}

// 统一视频加载与状态管理函数
void loadVideo(String videoPath) {
  // 清理当前视频资源
  if (currentVideo != null) {
    currentVideo.stop();
    currentVideo.removeMovieEventListener(this);
  }
  
  // 创建并启动新视频
  currentVideo = new Movie(this, videoPath);
  currentVideoName = videoPath;
  currentVideo.addMovieEventListener(this);
  currentVideo.play();
}

void movieEvent(Movie m) {
  // 读取当前帧(必须调用,否则available()返回false)
  m.read();
  
  // 视频结束后的自动切换逻辑
  if (m.time() >= m.duration()) {
    m.stop();
    if (currentVideoName.equals("look1,3.mp4")) {
      loadVideo("look2,1.mp4");
    } else if (currentVideoName.equals("look1,5.mp4") || 
               currentVideoName.equals("look1,6.mp4") || 
               currentVideoName.equals("look1,2.mp4")) {
      loadVideo("look1,4.mp4");
    } else {
      // 默认回到初始视频
      loadVideo("look1,1.mp4");
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:42:45