python - 如何让 Kivy 在 Linux 上使用 sdl2?
问题描述
我遇到了一个问题,Kivy 在 android 上使用 sdl2,并且工作正常,但在 linux 上它使用 ffpyplayer,但事实并非如此。
所以我想让 Kivy 在 linux 上也使用 sdl2,但是 sdl2 在 linux 上似乎根本不起作用。
$ KIVY_AUDIO=sdl2 python min_audio_example.py
[INFO ] [Audio ] Providers: audio_sdl2 (audio_ffpyplayer ignored)
[CRITICAL] [AudioSDL2 ] Unable to open mixer: b'No such audio device'
这是一个演示问题的最小示例。
#!/usr/bin/env python
# works with:
# export KIVY_AUDIO=ffpyplayer
# fails with:
# export KIVY_AUDIO=sdl2
from kivy.app import App
from kivy.core.audio import SoundLoader
def playsound(dummy):
sound = SoundLoader.load("440Hz_44100Hz_16bit_05sec.ogg")
if sound:
print("Sound found at %s" % sound.source)
print("Sound is %.3f seconds" % sound.length)
print("sound state", sound.state)
sound.play()
print("sound state", sound.state)
import time
time.sleep(5)
class TestApp(App):
playsound(None)
if __name__ == '__main__':
TestApp().run()
我认为这可能与kivy轮的构建方式有关,所以我尝试了
pip uninstall kivy
pip install -U --no-binary=:all: kivy
那时,kivy 似乎根本看不到 sdl2!
$ KIVY_AUDIO=sdl2 python min_audio_example.py
[INFO ] [Audio ] Providers: (audio_ffpyplayer, audio_pygame ignored)
[WARNING] [Audio ] Unable to find a loader for </home/john/data/sight-sing/sightsinger/440Hz1secfadeinandout.ogg>
它现在将 audio_ffpyplayer 和 audio_pygame 列为提供程序,并且由于环境变量而没有使用任何一个。(pygame 提供者似乎也坏了,但 ffpyplayer 仍然有效)
任何人都可以帮忙吗?
解决方案
这是 kivy 轮子的构造,我尝试的修复几乎是正确的。
问题是,如果 kivy 构建时缺少依赖项,它将在不支持事物的情况下构建,但不会抱怨。
因此,在 debian 上,安装 kivy 的依赖项:
(https://kivy.org/doc/stable/installation/installation-linux-venvs.html#installation-in-venv)
sudo apt-get install python-pip build-essential git python python-dev ffmpeg libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev zlib1g-dev
然后:
pip uninstall kivy
然后在不使用损坏的预制轮子的情况下安装
pip install --no-binary kivy kivy
推荐阅读
- android - 如果切换过滤器开关,如何取消选中微调器中的选中项目?
- python - 使用 Python 循环和维恩图来决定学习哪种语言
- angular - 如何以角度验证特定的ngModel
- snowflake-cloud-data-platform - Where are snowflake tables stored?
- python - 在python中的某个变量中从curl命令中获取数据
- concourse - 如何在 Concourse 任务运行配置中组合一个终端命令
- javascript - 如何安装 node_modules?
- javascript - 如何使用 Typescript 实现 Material-UI ThemeProvider 和 WithStyles
- java - 无法从 mysql 检索用户身份(用户名和密码)以登录
- ios - 如何使collectionView布局iOS 13无效