Qt Multimedia
录音
使用 普通用户 登录桌面环境,使用 sudo your-recorder 是无法录音的。
涉及声卡权限的归属。
播放
QSoundEffect 不依赖 gstreamer/ffmpeg 后端,但 QMediaPlayer 依赖。
Qt Multimedia 为媒体播放、录制和设备管理提供了用户友好的跨平台 API。
核心 API 的实现,包括QMediaDevices,QAudioDevice,QSoundEffect,QAudioSink和QAudioSource,都集成在Qt Multimedia 的主库中,无需额外的库。
其他Qt Multimedia API 使用称为媒体后端的插件库实现。
主媒体后端基于FFmpeg 构建,可确保无缝跨平台功能,在除 WebAssembly 和嵌入式 Linux/Boot2Qt 之外的所有平台上都是默认的。
以下 ABI 冲突问题,可以使用 QSoundEffect 回避! 不使用 QMediaPlayer ,如果你的业务场景允许的话。
LD_PRELOAD=/lib/aarch64-linux-gnu/libffi.so.7
conda 环境里的 libffi 和系统的 libgobject / QtMultimedia backend 存在 ABI 冲突。你加上
1 | LD_PRELOAD=/lib/aarch64-linux-gnu/libffi.so.7 |
后不再报错,说明 QMediaPlayer 初始化失败的根因就是这条动态库加载顺序问题,不是你的播放器代码逻辑问题。
这件事可以这样理解:
- Qt 在加载 multimedia backend 时会拉起 libffmpegmediaplugin.so (ffmpeg 优先于 gstreamer)
- 这个插件又依赖系统的 libgobject-2.0.so.0
- 但进程里先拿到了 conda 的不兼容 libffi
- 导致 backend 插件加载失败,QMediaPlayer 才显示 Not available (gstreamer 也是这条依赖链)
- 现在用系统 libffi 预加载后,这条依赖链恢复正常,所以错误消失
把启动命令固定成:
1 | LD_PRELOAD=/lib/aarch64-linux-gnu/libffi.so.7 python agent/desktop_agent_qt.py |
如果你是通过桌面图标、systemd、shell 脚本或者 launcher 启动,就把这一句放到对应启动入口里。
再进一步,如果你想确认现在实际启用的是哪个 backend,可以运行:
1 | QT_DEBUG_PLUGINS=1 QT_LOGGING_RULES='qt.multimedia.*=true' \ |
看到成功加载 libffmpegmediaplugin.so,就说明当前主线已经通了。