Есть ли способ воспроизвести живой аудиопоток через Kivy?

Я пытаюсь создать приложение, в котором вы можете слушать радиопотоки со своего телефона. Возможно ли это с Киви?

Я создаю это приложение для своей школьной радиостанции. Я пробовал SoundLoader, но это не сработало.

Вот код, который у меня есть для воспроизведения в прямом эфире.

class ListenWindow(Screen):
    sound = SoundLoader.load('stream.mp3')
    sound.play()

Вот результат, который я получаю.

[WARNING] Deprecated property "<AliasProperty name=filename>" of object "<kivy.core.audio.audio_gstplayer.SoundGstplayer object at 0x03DFE378>" was accessed, it will be removed in a future version
[WARNING] [AudioGstplayer] b"No decoder available for type 'text/uri-list'."
[ERROR  ] [AudioGstplayer] b'Your GStreamer installation is missing a plug-in.'
[INFO   ] [Window      ] Provider: sdl2
[ERROR  ] [AudioGstplayer] b'Internal data stream error.'

Я попытался обновить GStreamer через pip, но это не решило проблему.


person 2003lxp    schedule 27.08.2019    source источник
comment
Я никогда не использовал Kivy, но какой формат потока вы пытаетесь воспроизвести? Сообщение об ошибке подразумевает, что вы используете неправильный URL-адрес. Это случайно не сервер SHOUTcast?   -  person Brad    schedule 28.08.2019
comment
Я использую файл mp3, который скачал. Итак, я пытаюсь воспроизвести файл. Это сервер icecast.   -  person 2003lxp    schedule 29.08.2019
comment
Вы уверены, что загрузили MP3, а не M3U?   -  person Brad    schedule 29.08.2019
comment
Первоначально это был файл m3u, но я изменил его на mp3. После того, как я это сделал, он все еще играл в VLC. Так что я подумал, что все в порядке. Он все еще не работает, но выдает другую ошибку.   -  person 2003lxp    schedule 29.08.2019
comment
Слишком долго для одного комментария [INFO ] [AudioGstplayer] Using Gstreamer 1.16.0.0 [INFO ] [Audio ] Providers: audio_gstplayer, audio_sdl2 (audio_ffpyplayer ignored) [WARNING] [Audio ] Unable to find a loader for <D:\fredi\Python Projects\wahsapp\stream.m3u> Traceback (most recent call last): File "D:\fredi\Python Projects\wahsapp\WAHS.py", line 17, in <module> class ListenWindow(Screen): File "D:\fredi\Python Projects\wahsapp\WAHS.py", line 19, in ListenWindow sound.play() AttributeError: 'NoneType' object has no attribute 'play'   -  person 2003lxp    schedule 29.08.2019
comment
Когда вы говорите, что изменили его на MP3, я полагаю, вы имеете в виду, что просто переименовали его? VLC поддерживает M3U и выполнил бы некоторое автоматическое обнаружение, поэтому он смог бы воспроизвести его. Если вы откроете этот M3U в любом текстовом редакторе, вы увидите URL-адреса реальных потоков. Используйте эти URL-адреса потоков с вашим скриптом Python/Gstreamer.   -  person Brad    schedule 30.08.2019
comment
Хорошо. Я заменил «stream.mp3» на ссылку на прямую трансляцию, и это сработало. Спасибо за помощь!   -  person 2003lxp    schedule 30.08.2019
comment
Круто, рад, что сработало! Я написал подробности в ответе ниже, чтобы другие могли найти их позже.   -  person Brad    schedule 30.08.2019


Ответы (1)


Потоки Icecast/SHOUTcast по сути являются потоками HTTP Progressive, в которых медиаданные постоянно кодируются, передаются клиентам и воспроизводятся. Когда этот тип потоковой передачи начался, веб-браузеры не могли воспроизвести поток. Поэтому, если вы напрямую подключитесь к потоку, браузер будет постоянно загружать бесконечный «файл».

Чтобы обойти это, использовались плейлисты M3U и PLS. Идея заключается в том, что в браузере вы можете ссылаться на список воспроизведения, который был загружен и впоследствии открыт в медиаплеере пользователя. Медиаплеер читает список воспроизведения, находит фактический URL-адрес потока, а затем делает собственный HTTP-запрос к потоку и воспроизводит его.

Когда вы используете что-то вроде Gstreamer, для воспроизведения потока вам нужно использовать фактический URL-адрес потока. То есть вам нужно самостоятельно разобрать файл списка воспроизведения M3U или PLS, найти URL-адрес потока, а затем открыть его. В вашем случае, поскольку вы знаете, что работаете только с одной станцией, вы можете просто открыть этот список воспроизведения в текстовом редакторе, чтобы найти URL-адрес потока.

person Brad    schedule 30.08.2019