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)

0 ответов

Другие вопросы по тегам