0%

Qt Multimedia

Qt Multimedia

录音

使用 普通用户 登录桌面环境,使用 sudo your-recorder 是无法录音的。

涉及声卡权限的归属。

播放

QSoundEffect 不依赖 gstreamer/ffmpeg 后端,但 QMediaPlayer 依赖。

Qt Multimedia 为媒体播放、录制和设备管理提供了用户友好的跨平台 API。
核心 API 的实现,包括 QMediaDevices, QAudioDevice, QSoundEffect, QAudioSinkQAudioSource ,都集成在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 初始化失败的根因就是这条动态库加载顺序问题,不是你的播放器代码逻辑问题。

这件事可以这样理解:

  1. Qt 在加载 multimedia backend 时会拉起 libffmpegmediaplugin.so (ffmpeg 优先于 gstreamer)
  2. 这个插件又依赖系统的 libgobject-2.0.so.0
  3. 但进程里先拿到了 conda 的不兼容 libffi
  4. 导致 backend 插件加载失败,QMediaPlayer 才显示 Not available (gstreamer 也是这条依赖链)
  5. 现在用系统 libffi 预加载后,这条依赖链恢复正常,所以错误消失

把启动命令固定成:

1
LD_PRELOAD=/lib/aarch64-linux-gnu/libffi.so.7 python agent/desktop_agent_qt.py

如果你是通过桌面图标、systemd、shell 脚本或者 launcher 启动,就把这一句放到对应启动入口里。

再进一步,如果你想确认现在实际启用的是哪个 backend,可以运行:

1
2
3
QT_DEBUG_PLUGINS=1 QT_LOGGING_RULES='qt.multimedia.*=true' \
LD_PRELOAD=/lib/aarch64-linux-gnu/libffi.so.7 \
python agent/desktop_agent_qt.py 2>&1 | grep -Ei 'ffmpeg|gstreamer|backend|multimedia'

看到成功加载 libffmpegmediaplugin.so,就说明当前主线已经通了。