- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为个人项目,我正在尝试为 Kivy 制作音频播放器,但我注意到我的应用无法加载 mp3 音频。经过一番研究,它似乎与某些许可问题有关?无论如何,机器人当然仍然可以播放 mp3 文件,那么我该怎么做才能实现这一点?
就目前而言,我正在使用来自 kivy 的普通 SoundLoader() 类。我认为我的 android 音频正在使用 sdl2 但我可能会弄错,因为我不确定在哪里检查它我只记得在某个地方看到过它。我也尝试过更改 KIVY_AUDIO 环境变量,但它没有用(我假设我做错了什么)。
有没有人知道任何解决方法,因为我似乎找不到任何解决方法?
最佳答案
kivy SoundLoader 类有一些问题(例如,它在某些 mp3 文件中不能正确定位)。正如 Joey 提到的,jnius 可以访问的原始 android 类工作得更好,并且对于你扔给它的大多数歌曲文件(mp3、mp4、flac、waves 等)
我做了两个working类,一个是android用的,用的是jnius,一个是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()
关于android - 在 Android 上播放 mp3?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45061116/
我正在使用以下代码播放声音,过一会儿它将停止播放声音,这是因为我相信有太多的Mediaplayer打开实例,所以我添加了一个额外的mp.release();,这只会使我的应用程序崩溃(目前已被注释掉)
我正在查看 XV-6 代码,它通过它识别 MP 结构。它首先在 EBDA 的第一个 kb 中搜索。代码是这样的 static struct mp* mpsearch(void) { uchar *
我在我的应用程序中使用 Mp 饼图。它显示非常小的尺寸,我试图增加它的尺寸但它没有增加它的尺寸。我无法找出问题所在。请告诉我们如何增加尺寸。 这是我的代码: public class MPpiecha
如何使用 MPAndroidChart 实现此目的? 使用版本:com.github.PhilJay:MPAndroidChart:v3.1.0-alpha 添加图例和饼图边距的代码: private
亲爱的社区,我面临以下问题,我正在使用此处提供的 MP android 图表库创建条形图:https://github.com/PhilJay/MPAndroidChart . 我想为我的条设置渐变背
我正在使用 SAS MP Connect 开发我的第一段代码,以运行同一个 sas 作业的并行线程。 我知道 MP CONNECT 仅受可用 CPU 数量的物理限制,但理想情况下我不想在我的工作中使用
我最近购买了在 Linux 服务器上运行的 Stata MP12(8 核)许可证。 有没有人写过 Stata 程序,比如说模拟研究来测试 Stata MP 的性能?我想监视在作业处理过程中实际使用的内
我将不胜感激任何“一步一步”指南,说明如何更改 PHP/HTML 页面上的动态数据库连接/连接字符串/等上的代码,使其“即插即用”工作通过 ftp 将页面和 MySQL 数据库托管在“Azure 网站
试图在我的应用程序中放置一个“暂停”按钮,以播放一些声音片段循环播放。 当我打电话mp.pause();一切都破了,我完全迷路了! 这是我正在使用的方法。 protected void man
我想使用 Mp Chart 创建折线图 我想要实现的是这张图片 但是到目前为止我已经得到了这个。 我使用的代码是这个 private fun setData() { val entries
通常,我可能会编写一个类似simd的循环: float * x = (float *) malloc(10 * sizeof(float)); float * y = (float *) malloc
在与堆栈空间、OpenMP 以及如何处理这些问题相关的其他帖子上,有很多回复。但是,我找不到信息来真正理解 OpenMP 调整编译器选项的原因: 原因是什么-fopenmp在 gfortran 中暗示
我有一段代码,可以根据漂移、波动性和随机数计算任意给定日期的股票价格。但是当我检查输出列表时 - 它们是算术级数,而不是几何级数(幂函数)。我共享的变量有问题吗? 代码如下: #include #i
我正在尝试在 C++11 中并行化动态编程算法使用这种方法: void buildBaseCases() { cout << "Building base cases" << endl
我正在 open MP 中实现并行点积 我有这个代码: #include #include #include #include #include #include #define SIZE
我有一台服务器已经将近 4 年了,直到现在我都没有遇到任何问题(主机端)。我一直在更换主机,因为 ddos 的东西试图找到最适合我的东西。现在我买了一个 VPS(这不是我的第一个)并尝试运行我的服
所以我有两个内部平行区域的外部平行区域。是否可以将 2 个线程放入外部平行线,将 4 个线程放入每个内部平行线?我做了这样的东西,但它似乎无法按照我想要的方式工作。有什么建议吗? start_r =
我希望有人指出我们遇到的问题或解决方法。 使用/MP 编译项目时,似乎只有同一文件夹中的文件会同时编译。我使用 Process Explorer 滑动命令行并确认行为。 项目过滤器似乎对并发编译的内容
本文整理了Java中me.chanjar.weixin.mp.api.WxMpMessageRouter类的一些代码示例,展示了WxMpMessageRouter类的具体用法。这些代码示例主要来源于G
我正在监视 Stata/MP(Stata/SE 的多核版本)的 CPU 和内存使用情况,但我不是 Stata 程序员(更像是 Perl 人)。 任何人都可以发布一些代码,利用公共(public)数据集
我是一名优秀的程序员,十分优秀!