问题描述:Psychopy不能正常调用ffpyplayer接口
Cannot find matching video player interface for 'ffpyplayer'.
解决步骤:
1、测试ffpyplayer
bash
python -c "from ffpyplayer.player import MediaPlayer; print('OK')"
如果报错:
ImportError:
/home/cat/anaconda3/lib/python3.8/site-packages/ffpyplayer/player/player.cpython-38-aarch64-linux-gnu.so:
undefined symbol: ff_reverse
原因:ffpyplayer 的动态库依赖系统的 libav(ffmpeg)库,*,但你的 Anaconda Python 环境里带的 libstdc++ 和 libgcc_s 与系统 ffmpeg 编译时使用的不兼容,所以符号 ff_reverse 找不到。
简单来说:系统 ffmpeg 没有这个符号,而 ffpyplayer 是按旧 ffmpeg 编译的。所以必须重新编译 ffpyplayer。
2、彻底重装 ffpyplayer
①先删干净:
bash
pip uninstall ffpyplayer -y
②再清缓存(一定要做):
bash
pip cache purge
③安装系统 FFmpeg 开发库
bash
sudo apt update
sudo apt install -y \
ffmpeg \
libavcodec-dev \
libavformat-dev \
libavdevice-dev \
libavutil-dev \
libswscale-dev \
libswresample-dev \
libsdl2-dev
④然后强制源码编译:
bash
pip install --no-binary ffpyplayer ffpyplayer
这一步会:自动链接系统 ffmpeg、重新生成 .so。
(编译过程需要等待几分钟)
⑤编译完成后再测试(若还有问题转第3条):
bash
python -c "from ffpyplayer.player import MediaPlayer; print('OK')"
⑥确认 PsychoPy backend
运行:
bash
python -c "from psychopy.visual.movies import players; print(players._players)"
3、后续遗留问题
如果python -c "from ffpyplayer.player import MediaPlayer; print('OK')"后,出现新错误:
undefined symbol: g_task_set_static_name
说明问题已经不在 ffpyplayer 本身,而是在 GLib / GIO 库版本冲突。
核心原因是:conda 的 GLib 与系统 GLib 混用了。
一步验证是不是 conda 冲突:
bash
ldd /home/cat/anaconda3/lib/python3.8/site-packages/ffpyplayer/player/player*.so | grep glib
如果看到:
bash
libglib-2.0.so => /home/cat/anaconda3/lib/libglib-2.0.so
则100% 确认是 conda 库污染。
修复方式:
把 conda 的 glib 暂时移走:
bash
cd ~/anaconda3/lib
mv libglib-2.0.so.0 libglib-2.0.so.0.bak
mv libgobject-2.0.so.0 libgobject-2.0.so.0.bak
mv libgio-2.0.so.0 libgio-2.0.so.0.bak
mv libgmodule-2.0.so.0 libgmodule-2.0.so.0.bak