在 Android 上播放 mp3?

约翰·奥尼尔

我正在尝试为 Kivy 制作一个音频播放器作为个人项目,但是我注意到我的应用程序无法加载 mp3 音频。经过一番研究,它似乎与某些许可问题有关?在任何情况下,androids 当然仍然可以播放 mp3 文件,那么我该怎么做才能做到这一点?

就目前而言,我使用的是来自 kivy 的普通 SoundLoader() 类。我认为我的 android 音频使用的是 sdl2,但我可能会误会,因为我不知道在哪里检查这个我只记得在某个地方看到过它。我也尝试过更改 KIVY_AUDIO 环境变量,但它没有用(我想我做错了什么)。

有没有人知道任何变通方法,因为我似乎找不到任何变通方法?

帕特里克

kivy SoundLoader 类有一些问题(例如,它在某些 mp3 文件中无法正确搜索)。正如 Joey 提到的,jnius 可以访问的原始 android 类效果更好,并且大多数歌曲文件(mp3、mp4、flac、waves 等)

我创建了两个工作类,一个用于使用 jnius 的 android,另一个用于 Windows(当然 android 类在这里不起作用)。

您可能需要更新到最新的 kivy 并添加 gstreamer,如文档中所述。并且:kivy logger 在 android 上使用 unicode 有一些问题,并且在打印时抛出异常。声音播放良好。如果异常使您烦恼,请删除 kivy.info 行。

#coding: utf-8

from kivy.core.audio import SoundLoader
from kivy.utils import platform 
from kivy.logger import Logger
import time

class MusicPlayerAndroid(object):
    def __init__(self):

        from jnius import autoclass
        MediaPlayer = autoclass('android.media.MediaPlayer')
        self.mplayer = MediaPlayer()

        self.secs = 0
        self.actualsong = ''
        self.length = 0
        self.isplaying = False

    def __del__(self):
        self.stop()
        self.mplayer.release()
        Logger.info('mplayer: deleted')

    def load(self, filename):
        try:
            self.actualsong = filename
            self.secs = 0
            self.mplayer.setDataSource(filename)        
            self.mplayer.prepare()
            self.length = self.mplayer.getDuration() / 1000
            Logger.info('mplayer load: %s' %filename)
            Logger.info ('type: %s' %type(filename) )
            return True
        except:
            Logger.info('error in title: %s' % filename) 
            return False

    def unload(self):
            self.mplayer.reset()

    def play(self):
        self.mplayer.start()
        self.isplaying = True
        Logger.info('mplayer: play')

    def stop(self):
        self.mplayer.stop()
        self.secs=0
        self.isplaying = False
        Logger.info('mplayer: stop')

    def seek(self,timepos_secs):
        self.mplayer.seekTo(timepos_secs * 1000)
        Logger.info ('mplayer: seek %s' %int(timepos_secs))


class MusicPlayerWindows(object):
    def __init__(self):
        self.secs = 0
        self.actualsong = ''
        self.length = 0
        self.isplaying = False
        self.sound = None

    def __del__(self):
        if self.sound:
            self.sound.unload()
            Logger.info('mplayer: deleted')

    def load(self, filename):
        self.__init__()
        if type(filename) == unicode: filename = filename.encode('utf-8') #unicode does not work ! 
        self.sound = SoundLoader.load(filename)    
        if self.sound:
            if self.sound.length != -1 :
                self.length = self.sound.length
                self.actualsong = filename
                Logger.info('mplayer: load %s' %filename)
                return True
            else:
                Logger.info ('mplayer: songlength = -1 ...')
        return False

    def unload(self):
        if self.sound != None:
            self.sound.unload()
            self.__init__ # reset vars

    def play(self):
        if self.sound:
            self.sound.play()
            self.isplaying = True
            Logger.info('mplayer: play')

    def stop(self):
        self.isplaying = False
        self.secs=0
        if self.sound:
            self.sound.stop()
            Logger.info('mplayer: stop')

    def seek(self, timepos_secs):
        self.sound.seek(timepos_secs)
        Logger.info('mplayer: seek %s' %int(timepos_secs))

def main():
    songs = [
        'f:\\_mp3_\\_testdir_\\file of ☠☢☣.mp3', #insert songs here
        'f:\\_mp3_\\Patricks Mp3s\\electro\\Echotek - Freak Africa.mp3',
        'f:\\_mp3_diverse_\\Testsuite\\flac\\01 - Jam & Spoon - Stella (Jam & Spoon Mix).flac',
        'f:\\_mp3_\\P1\\1Start\\Hot Chip - boy from school.mp4'
        ]

    Logger.info ('platform: %s' %platform)

    if platform == 'win':
        mplayer = MusicPlayerWindows()
    elif platform == 'android':
        mplayer = MusicPlayerAndroid()
    else:
        exit()

    for s in songs:
        if mplayer.load(s): # checking load, seek
            mplayer.play()
            time.sleep(2)
            mplayer.seek(90)
            time.sleep(2)
            mplayer.stop()
            mplayer.unload()

        else:
            Logger.info ('cant load song: %s' %s)


if __name__ == '__main__':
    main()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android上的Rhomobile 5.4中的Mp3 / Wav播放

来自分类Dev

网址中的Android Mp3播放

来自分类Dev

播放 Mp3 Intent Android Studio

来自分类Dev

播放mp3 Android异步。播放但随后崩溃

来自分类Dev

如何在Android上播放PDF,Bulider和mp3

来自分类Dev

在Android中连续播放mp3文件

来自分类Dev

无法从Android WebView中的URL播放mp3

来自分类Dev

无法在我的Android应用中播放mp3

来自分类Dev

Android MediaPlayer从网络不良的网址播放mp3

来自分类Dev

Android MediaPlayer从网络不良的网址播放mp3

来自分类Dev

无法使用Mediaplayer Android播放mp3

来自分类Dev

Android中的MP3 /音乐播放器

来自分类常见问题

在python上播放mp3歌曲

来自分类Dev

播放MP3的Java

来自分类Dev

在Ubuntu Phone上播放音乐/ mp3

来自分类Dev

在本地播放mp3时,Android MediaPlayer错误(1,-2147483648)

来自分类Dev

Android录制的aac(.mp3)文件未在iOS中播放

来自分类Dev

android反复播放mp3文件而没有任何间隙

来自分类Dev

尝试从android应用中的RSS提要中拉和播放mp3文件

来自分类Dev

从数组中播放android中的mp3文件

来自分类Dev

Android:OnClick播放/ res / raw文件中的随机.mp3

来自分类Dev

android反复播放mp3文件而没有任何间隙

来自分类Dev

Android媒体播放-手机扬声器的mp3(和ogg)声音失真

来自分类Dev

无法在Android中使用MediaPlayer播放本地mp3文件

来自分类Dev

Android:如何播放Mp3声音作为通知?

来自分类Dev

播放加密的有声读物 mp3 android 和 ios

来自分类Dev

如何减少 android 音乐播放器中的音频(MP3 文件)加载时间?

来自分类Dev

如何在Android的简单播放器中从原始播放mp3文件?

来自分类Dev

将文件另存为Mp3,放在SD卡上{Android应用}

Related 相关文章

热门标签

归档