Kivy 中的音频流媒体播放

87 阅读2分钟

在使用 Kivy 进行音频流媒体播放时,可能遇到以下错误:

[WARNING           ] [Audio       ] Unable to find a loader for <http://194.106.198.57:8090/club_low.mp3>
 Traceback (most recent call last):
   File "/home/work/python/pama_radio/andriod_app/main.py", line 11, in <module>
     TestApp().run()
   File "/usr/lib/python2.7/site-packages/kivy/app.py", line 766, in run
     root = self.build()
   File "/home/work/python/pama_radio/andriod_app/main.py", line 9, in build
     print("Sound is %.3f seconds" % sound.length)
 AttributeError: 'NoneType' object has no attribute 'length'

![huake_00066_.jpg](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/78c117c7d8ea47f4872958db00620e96~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5Y2O56eR5bCP5LiB:q75.awebp?rk3s=f64ab15b&x-expires=1771574819&x-signature=wNuxy4E1mkg7dSm3SMq3148MMXc%3D)
Process finished with exit code 1
  1. 解决方案

此错误的发生原因是 Kivy 在不同的平台上使用不同的音频提供程序,这些提供程序对流媒体音频的支持不同。

  • 在桌面上,Kivy 使用 gstplayer(基于 Gstreamer 的音频提供程序),但它不支持在 Android 上使用。
  • 在 Android 上,Kivy 使用 pygame,它也不支持流媒体音频。
  • 在 iOS 上,Kivy 使用 SDL,它可能支持流媒体音频,但需要进一步测试。

为了解决此问题,可以

  1. 在桌面上使用支持流媒体音频的音频提供程序,例如 gstplayer。
  2. 在 Android 上使用支持流媒体音频的音频提供程序,例如 exoplayer。
  3. 在 iOS 上使用 SDL,如果它支持流媒体音频,那就直接使用它,否则,需要使用其他音频提供程序。

下面示例展示了可在桌面上使用的加载远程音频的方法:

from kivy.app import App
from kivy.core.audio import SoundLoader

class TestApp(App):
    def build(self):
        sound = SoundLoader.load('http://194.106.198.57:8090/club_low.mp3')
        if sound:
            print("Sound found at %s" % sound.source)
        print("Sound is %.3f seconds" % sound.length)
        sound.play()
TestApp().run()

运行程序会打印:

[INFO              ] Kivy v1.8.0
[INFO              ] [Logger      ] Record log in /home/mohammad/.kivy/logs/kivy_14-09-11_13.txt
[INFO              ] [Factory     ] 157 symbols loaded
[DEBUG             ] [Cache       ] register <kv.lang> with limit=None, timeout=Nones
[DEBUG             ] [Cache       ] register <kv.image> with limit=None, timeout=60s
[DEBUG             ] [Cache       ] register <kv.atlas> with limit=None, timeout=Nones
[INFO              ] [Image       ] Providers: img_tex, img_dds, img_pygame, img_gif (img_pil ignored)
[DEBUG             ] [Cache       ] register <kv.texture> with limit=1000, timeout=60s
[DEBUG             ] [Cache       ] register <kv.shader> with limit=1000, timeout=3600s
[DEBUG             ] [Audio       ] register SoundPygame
[INFO              ] [Audio       ] Providers: audio_pygame (audio_pygst, audio_sdl ignored)
[DEBUG             ] [App         ] Loading kv </home/work/python/pama_radio/andriod_app/test.kv>
[DEBUG             ] [App         ] kv </home/work/python/pama_radio/andriod_app/test.kv> not found
[WARNING           ] [Audio       ] Unable to find a loader for <http://194.106.198.57:8090/club_low.mp3>
 Traceback (most recent call last):
   File "/home/work/python/pama_radio/andriod_app/main.py", line 11, in <module>
     TestApp().run()
   File "/usr/lib/python2.7/site-packages/kivy/app.py", line 766, in run
     root = self.build()
   File "/home/work/python/pama_radio/andriod_app/main.py", line 9, in build
     print("Sound is %.3f seconds" % sound.length)
 AttributeError: 'NoneType' object has no attribute 'length'

Process finished with exit code 1