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

Pavlovia运行Psychopy实验时cv2库报错的解决方案求助

问题分析与解决方案

首先明确:Pavlovia在线实验运行的是JavaScript代码,不是Java,所以将Python脚本转Java完全无法解决问题——这是核心误解。你的实验在线崩溃的根本原因是:cv2是Python本地计算机视觉库,依赖本地系统的摄像头驱动和硬件资源,但浏览器环境无法直接调用Python库,必须使用浏览器原生的Web API来实现媒体录制。

以下是可行的替代方案:

方案1:使用浏览器原生MediaRecorder API实现在线录制

这是在线实验录制音视频的标准方案,直接在Psychopy的JS代码块中实现:

实验初始化阶段(替代原Python cv2初始化代码)

在Builder中添加一个"Code"组件,设置为"Begin Experiment",切换到"JS"标签页,写入:

// 获取摄像头+麦克风媒体流
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
  .then(function(stream) {
    // 创建MediaRecorder实例,设置录制格式
    const mediaRecorder = new MediaRecorder(stream);
    const chunks = [];

    // 收集录制数据
    mediaRecorder.ondataavailable = function(e) {
      chunks.push(e.data);
    };

    // 录制结束时保存文件
    mediaRecorder.onstop = function() {
      const blob = new Blob(chunks, { type: 'video/webm' });
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      // 用被试ID命名文件
      a.download = expInfo['participant'] + '_output.webm';
      a.click();
      URL.revokeObjectURL(url);
    };

    // 启动录制
    mediaRecorder.start();
    // 将recorder实例存入全局变量,方便后续控制
    window.mediaRecorder = mediaRecorder;
  })
  .catch(function(err) {
    console.error('无法获取媒体流:', err);
  });

实验结束阶段(停止录制)

添加另一个"Code"组件,设置为"End Experiment",JS代码:

if (window.mediaRecorder && window.mediaRecorder.state !== 'inactive') {
  window.mediaRecorder.stop();
}

方案2:使用Psychopy官方推荐的在线媒体组件

如果不想写原生JS,可以尝试:

  • 升级到Psychopy最新版本,检查是否有官方支持的在线音视频录制组件(部分新版本已集成基础的媒体录制功能)。
  • 重新配置Thomas Pronk的例程:确保你正确导入了他的扩展,并且在Pavlovia项目设置里勾选"Allow microphone/camera access",开启媒体权限。

关键注意事项

  • 在线实验必须使用HTTPS协议(Pavlovia默认满足),否则浏览器会阻止摄像头/麦克风访问。
  • 录制的视频格式为WebM(浏览器原生支持),如果需要AVI格式,可让被试后续自行转换,或在服务器端处理。
  • 测试时务必在真实浏览器环境中调试,不要依赖本地Psychopy的在线预览(部分API在预览中可能无法正常工作)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:05:25