PsychoPy视频刺激和音频刺激

2020-06-29 17:06:52 浏览数 (1)

PsychoPy


Rose小哥是个代码狂,个人喜欢编写代码来实现相关实验设计,因为编写代码来实现实验十分灵活。

PsychoPy安装与测试案例

PsychoPy文字刺激、图片刺激和光栅刺激

这篇主要介绍视频刺激、音频刺激。

视频刺激


1.打开Coder视图

2.如下图在Coder编辑器中,编写代码。

代码语言:javascript复制
# -*- coding: utf-8 -*-
'''
视频刺激
'''
#导入工具
from psychopy import visual, core, event

"""
用visual.Window创建一个窗口/屏幕来创建想要呈现文字/图片等这些刺激。

visual.Window的参数解析:

size:屏幕分辨率的大小, size=(600,400)
color:表示屏幕颜色。(0,0,0)是RGB模式,取值范围是[-1,1],全为-1的话是纯黑色,全为1是白色。
当然也可以采用其他方式设置颜色,比如直接用颜色名:color='green'。
fullscr:True为全屏,默认值为False不全屏。

"""
DISPSIZE=(400,400)
win = visual.Window(fullscr = False, 
                    size = DISPSIZE,
                    color = (-1.0,-1.0,-1.0))

"""
文字刺激TextStim的参数:

win:呈现的屏幕。
text:文字内容。u'str',前面加u表示unicode编码,如果是中文的话则需要用u,英文则无需。
pos:位置。以屏幕中心(0,0)为坐标中心建一个坐标轴,(x,y)相当于坐标,右/上为正值,左/下为负值。
取值范围最好在(-1,1)中间,相当于占位的百分比。
color:颜色。
bold/italic:是字体的格式,加粗/倾斜。
"""
msg1 = visual.TextStim(win, text = u'视频刺激',
                               height = 0.12,
                               pos = (0.0,0.2),
                               bold = True,
                               italic = False,
                               color = 'pink')

#呈现文字刺激
"""
stimName.draw()用来绘制刺激内容。
win.flip()用来刷新屏幕。

括号里是秒数,可以是整数也可以是小数。使程序保持这个状态停留3秒.
core.wait(3)

说明:用core.wait(n)控制时间是比较粗糙的,误差比较大。
可以用core.clock()严格控制时间的刺激呈现。
"""
msg1.draw()
win.flip()
core.wait(3)

#视频刺激
video1 = visual.MovieStim(win, 'aa.mp4')
video1.size *= 0.7
#播放视频
"""
循环绘制视频帧
判断视频播放状态,如果未到视频最后,则继续循环。
"""
while video1.status != visual.FINISHED:
    video1.draw()
    win.flip()
    # 如果按Esc键则退出播放
    if event.getKeys(keyList = ['escape']):
        video1.pause()
        break
"""
关闭窗口,退出程序。
"""
win.close()
core.quit()

音频刺激


PsychoPy中并没有专门的音频刺激方法,在上面我们知道视频刺激有对应的方法MovieStim。我们可以通过利用MovieStim来实现音频刺激。

方法:将音频文件转换为视频文件即可。比如将mp3转换为avi或者mp4。

代码程序与上面视频刺激一样。

过程中遇到的奇葩问题


在使用PsychoPy来设计视频刺激实验时,遇到奇怪的问题:

在同一段代码在PsychoPy Coder视图中来运行出现的是下面的问题:

‘AVbin is required to decode compressed media’)

pyglet.media.riff.WAVEFormatException: AVbin is required to decode compressed media

而在Pycharm中出现的是下面的问题:

pyglet wave.Error: file does not start with RIFF id

经分析出现这两个问题的原因都是系统中缺少音视频的解码器。只不过PsychoPy Coder中默认采用的是AVbin来解码。而在Pycharm调用的是pyglet推荐的ffmpeg来解码。

两个问题的解决方法都是,安装需要的工具库来进行解码。

说明:这里的系统都是windows,其他系统类似。

针对在PsychoPy Coder出现的问题:

‘AVbin is required to decode compressed media’)

pyglet.media.riff.WAVEFormatException: AVbin is required to decode compressed media

解决方法:

根据系统要求下载并安装对应AVbin:

AVbin官网:http://avbin.github.io/AVbin/Download.html

针对在Pycharm中出现的问题:

pyglet wave.Error: file does not start with RIFF id

解决方法:

到ffmepg官网下载对应系统的对应版本:

ffmpeg官网:https://ffmpeg.zeranoe.com/builds/

由于本人安装的是shared版本,解压即可使用[但需要配置]。

配置:直接在系统环境变量中配置存放路径

0 人点赞