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
相关产品推荐
相关产品推荐

