Processing中如何基于鼠标坐标分区触发不同视频播放
核心结论
完全不需要创建多窗口。Processing 内置的视频播放能力是将视频帧作为普通画布图像渲染的,和你当前使用的text()文本绘制逻辑层级完全一致,只需要把现有代码里触发文本显示的分支,替换为对应视频的播放控制、帧绘制操作即可,原有的坐标区间判断逻辑可以100%保留,不用做任何改动。
具体整合步骤
- 前置准备
- 在Processing编辑器中导入内置视频库:通过菜单栏「草图-导入库-Video」完成库引入,代码头部会自动生成
import processing.video.*;的引入语句 - 将两个待播放的视频文件放到项目的
data文件夹下,保证文件名和后续代码中的加载路径完全匹配
- 在Processing编辑器中导入内置视频库:通过菜单栏「草图-导入库-Video」完成库引入,代码头部会自动生成
- 声明全局视频对象
视频对象需要在setup()中完成加载、在draw()的分支判断中调用,因此要在所有方法外部声明两个PVideo实例,避免方法内变量被回收无法跨方法访问:PVideo movie1, movie2; - 改造
setup()方法
完全保留原有窗口尺寸配置,仅添加视频加载逻辑,不要改动原有窗口参数:void setup() { size(934,887); movie1 = loadVideo("1.mp4"); movie2 = loadVideo("2.mp4"); } - 改造
draw()方法
完整保留原有的坐标判定条件,将分支内的文本绘制操作替换为视频控制逻辑。核心规则是:鼠标命中哪个区域,就播放对应视频、暂停另一个视频,再把当前播放的视频帧画到画布上。关键注意点:每帧必须调用视频的
read()方法拉取最新视频帧,否则视频会卡在初始状态无法正常播放。
当鼠标未命中任意判定区间时,两个视频会自然保持暂停状态,和你原有代码中“无文本显示、仅黑背景”的行为完全匹配。如果视频尺寸和934*887的窗口不匹配,可以在调用image()时传入宽高参数,将视频自适应拉伸到画布尺寸。
整合完成的可直接运行代码示例
import processing.video.*; // 全局声明两个视频对象 PVideo movie1, movie2; void setup() { size(934,887); movie1 = loadVideo("1.mp4"); movie2 = loadVideo("2.mp4"); } void draw(){ background(0); // 拉取所有视频的最新帧,避免播放卡顿 movie1.read(); movie2.read(); // 原坐标判断逻辑完全保留 if((46<mouseX && mouseX<339)&&(46<mouseY && mouseY<249)){ // 控制对应视频播放,暂停另一个视频 if(!movie1.isPlaying()) movie1.play(); if(movie2.isPlaying()) movie2.pause(); // 将视频帧绘制到画布,可传入宽高参数实现全屏自适应 image(movie1, 0, 0, width, height); } // 原坐标判断逻辑完全保留 if((46<mouseX && mouseX<339)&&(249<mouseY && mouseY<464)){ if(!movie2.isPlaying()) movie2.play(); if(movie1.isPlaying()) movie1.pause(); image(movie2, 0, 0, width, height); } }
常见疑问说明
- 为什么之前查阅的视频教程和现有代码结构不匹配:多数入门视频教程仅演示单视频全屏播放的场景,会直接在
draw()里固定调用image(movie, 0,0),没有嵌套分支判断逻辑。但本质上PVideo就是可绘制的图像对象,和text()、rect()没有使用上的区别,完全可以嵌入到任意条件判断分支中。 - 为什么不能用多窗口实现:Processing 多窗口模式下,
mouseX、mouseY的坐标是相对于当前获得焦点的独立窗口的,会直接破坏你原有的全局坐标区间判断逻辑;且多窗口的视频渲染需要独立的渲染上下文,开发复杂度会大幅提升,完全没有必要。
内容的提问来源于stack exchange,提问作者Lauren
相关产品推荐
相关产品推荐

