Kivy - потоковое аудио для Android и Ios
Я хочу транслировать в реальном времени mp3 с сервера (MP3, а не MP4), и вот что у меня уже есть. Я дам кусок кода из моего проекта.
def worker(self, v):
if len(self.musicTitle) > 50:
self.album.text = self.musicTitle[:50]+" .."
else:
self.album.text = self.musicTitle
self.pltitle.text = "Music Now Playing"
self.pp.text = "%s"%(icon("fa-pause-circle-o", 60, "#dcdcdc"))
MediaPlayer = autoclass('android.media.MediaPlayer')
AudioManager = autoclass('android.media.AudioManager')
self.mPlayer = MediaPlayer()
self.mPlayer.reset()
self.mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC)
self.mPlayer.setDataSource(self.sUrl)
#self.mPlayer.prepare()
self.mPlayer.prepareAsync()
#time.sleep(duration)
#If i use java mediaPlayer.setOnPreparedListerner it crashes my app, so i should find a workaround
self.isR = Clock.schedule_interval(self.isReady, 1)#I use this to check if a player is ready to play alt to java setOnPreparedListerner
def isReady(self, isr):
dr = self.mPlayer.getDuration()
if len(str(dr)) == 1:
self.seeker.value = 0
self.start.text = '0:00'
self.end.text = '0:00'
self.buffer.text = 'Buffering'
#NOT READY
else:
#READY
Clock.unschedule(self.isR)
self.mPlayer.start()
self.canControl = True
self.buffer.text = ''
if self.canControl:
self.duration = self.mPlayer.getDuration()/1000 #Convert to sec
self.seeker.max = self.duration
self.end.text = str(getTime.getTime(self.duration))
self.upW = Clock.schedule_interval(self.updateWidget, 1)
def control(self):
if self.canControl:
if self.mPlayer.isPlaying():
self.length = self.mPlayer.getCurrentPosition()/1000
self.mPlayer.pause()
self.pp.text = "%s"%(icon("fa-play-circle-o", 60, "#dcdcdc"))
else:
if not self.length:
self.length = self.mPlayer.getCurrentPosition()/1000
self.mPlayer.seekTo(self.length)
self.mPlayer.start()
self.pp.text = "%s"%(icon("fa-pause-circle-o", 60, "#dcdcdc"))
def close(self):
if self.canControl:
self.canControl = False
Clock.unschedule(self.upW)
Clock.unschedule(self.isR)
self.mPlayer.stop()
self.mPlayer.release()
self.mPlayer = None
def seekValue(self, value):
if self.canControl:
self.mPlayer.seekTo(value*1000)
def updateWidget(self, q):
if self.canControl:
self.seeker.value = self.mPlayer.getCurrentPosition()/1000
self.start.text = str(getTime.getTime(self.mPlayer.getCurrentPosition()/1000))
if self.seeker.value == self.seeker.max or self.seeker.value > self.seeker.max:#Check if a music is finished
self.pp.text = "%s"%(icon("fa-play-circle-o", 60, "#dcdcdc"))
self.mPlayer.seekTo(0)
self.mPlayer.pause()
def loopMusic(self):
if self.isLoop:
self.isLoop = False
self.mPlayer.setLooping(False)
self.replay.text = "%s"%(icon("fa-retweet", 30, "#EEEFFF"))
else:
self.isLoop = True
self.mPlayer.setLooping(True)
self.replay.text = "%s"%(icon("fa-retweet", 30, "#15def9"))
Приведенный выше код работает, НО по некоторым причинам Android MediaPlayer очень, очень, очень медленный, иногда может потребоваться 2 минуты для подготовки потока. Теперь есть какой-то другой способ, которым я могу передавать потоковое аудио в Android и / или в Ios с Python Kivy без долгого времени буферизации (я также не хочу использовать ffmpeg или / и ffpyplayer, они оба НЕ РАБОТАЮТ и поддерживают только mp4)