Kivy:立即在 android 上播放声音
Kivy: play sound on android without delay
我正在用 kivy 创建一个节拍器应用程序。因为在很多问题中,刻度线需要准确地在我 运行 点上。
我将时钟事件安排为 "free" 事件:
Config.set('kivy', 'kivy_clock', 'free_all')
Config.write()
Clock.schedule_once_free(self.callback, self.delay)
如果我跟踪回调的时间,它们都很棒。
小部件在这些回调中更新,它们恰到好处。
但是如果我在回调开始时播放声音,它每次都会以不同的延迟执行。所以声音与预期的 bpm 无关。
不同的声音加载器有不同的行为:
"SoundPygame" 没有延迟但不能用于 android(缺少对 pygame 的支持)
非 kivy 模块 "play sound" 工作得很好,但由于缺少模块 "gi" 而不能与 buildozer 一起使用。
"SoundSDL2" 默认使用,不适用于此任务。
sound_norm = SoundPygame(source='sounds/tick.wav')
def callback(self, dt):
self.sound_norm.play()
有没有什么方法可以在 android 上使用 kivy 播放声音而不需要基于事件的延迟?
这是我的第一个问题,所以如果我问错了什么或者需要改进我的问题,请原谅。
此致!
使用 Pyjnius 解决了这个问题。我现在有平台依赖代码。
对于 Android:
from jnius import autoclass
MediaPlayer = autoclass('android.media.MediaPlayer')
mPlayer_norm = MediaPlayer()
mPlayer_norm.setDataSource(SOUND_NORM)
mPlayer_norm.prepare()
稍后我可以在回调中播放声音:
self.sound_norm.play()
这种方式没有明显的延迟,所以对我有用。
我正在用 kivy 创建一个节拍器应用程序。因为在很多问题中,刻度线需要准确地在我 运行 点上。
我将时钟事件安排为 "free" 事件:
Config.set('kivy', 'kivy_clock', 'free_all')
Config.write()
Clock.schedule_once_free(self.callback, self.delay)
如果我跟踪回调的时间,它们都很棒。 小部件在这些回调中更新,它们恰到好处。
但是如果我在回调开始时播放声音,它每次都会以不同的延迟执行。所以声音与预期的 bpm 无关。
不同的声音加载器有不同的行为: "SoundPygame" 没有延迟但不能用于 android(缺少对 pygame 的支持) 非 kivy 模块 "play sound" 工作得很好,但由于缺少模块 "gi" 而不能与 buildozer 一起使用。 "SoundSDL2" 默认使用,不适用于此任务。
sound_norm = SoundPygame(source='sounds/tick.wav')
def callback(self, dt):
self.sound_norm.play()
有没有什么方法可以在 android 上使用 kivy 播放声音而不需要基于事件的延迟?
这是我的第一个问题,所以如果我问错了什么或者需要改进我的问题,请原谅。 此致!
使用 Pyjnius 解决了这个问题。我现在有平台依赖代码。 对于 Android:
from jnius import autoclass
MediaPlayer = autoclass('android.media.MediaPlayer')
mPlayer_norm = MediaPlayer()
mPlayer_norm.setDataSource(SOUND_NORM)
mPlayer_norm.prepare()
稍后我可以在回调中播放声音:
self.sound_norm.play()
这种方式没有明显的延迟,所以对我有用。