개인 프로젝트로 Kivy 용 오디오 플레이어를 만들려고하는데 내 앱이 mp3 오디오를로드하지 못하는 것을 발견했습니다. 약간의 조사 끝에 라이센스 문제와 관련된 것 같습니까? 어쨌든 안드로이드는 여전히 mp3 파일을 재생할 수 있으므로 어떻게해야할까요?
현재로서는 kivy의 일반 SoundLoader () 클래스를 사용하고 있습니다. 내 안드로이드 오디오가 sdl2를 사용하고 있다고 생각하지만 어디서 확인 해야할지 모르겠 기 때문에 어딘가에서 본 기억이 있습니다. 나는 또한 KIVY_AUDIO 환경 변수를 변경하려고 시도했지만 작동하지 않았습니다 (나는 뭔가 잘못했다고 가정합니다).
내가 아무것도 찾을 수 없기 때문에 누구든지 해결 방법을 알고 있습니까?
kivy SoundLoader 클래스에는 몇 가지 문제가 있습니다 (예 : 특정 mp3 파일에서 올바르게 검색하지 않음). Joey가 jnius에서 액세스 할 수있는 원래 Android 클래스를 언급했듯이 대부분의 노래 파일 (mp3, mp4, flac, waves 등)에서 더 잘 작동합니다.
나는 jnius를 사용하는 안드로이드와 윈도우를위한 두 개의 워킹 클래스를 만들었다 (물론 안드로이드 클래스는 여기서 작동하지 않는다).
문서에 설명 된대로 최신 kivy로 업데이트하고 gstreamer를 추가해야 할 수 있습니다. 그리고 : kivy logger는 안드로이드의 유니 코드에 몇 가지 문제가 있으며 인쇄 할 때 예외를 발생시킵니다. 그래도 소리가 잘 재생됩니다. 예외로 인해 짜증이 나면 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] 삭제
몇 마디 만하겠습니다