自从开发MP3背景音乐模块一来问题不断:
1,如何实现MP3模块播放,首先想到的就是采用jni方式,调用动态链接库so,由同事操刀完成底层调用开发,采用madplayer,给我提供我需要的上层接口,最后功能也貌似实现了。可是最后我并没有采取这样的实现方式,具体什么原因我现在也忘记了,明天再回忆回忆。 (好像需要加载较多运行库)
2,当然否定了以上方案必定有新的方案替代,那就是采用java 调用linux命令行方式来创建执行进程。 madplayer的使用方式就是madplayer [歌曲名路径]。 有了这个命令使用Runtime.getRuntime().exec(args)便可以创建一个madplayer的播放进程,这样madplayer就会自动加载歌曲路径实现播放功能了,这种方式简单,易操作,而且代码也精简,省去了方案一中的加载繁琐。
好吧,方案2看起来很爽,但其实弊端也不少,首先对于Java创建的播放进程,可以操作的很少,java提供的API对我来说有用的暂时就一个就是Process的stop()方法。 这样的话我就可以实现歌曲的播放与停止,停止实现就是调用stop()方法杀死进程。问题来了,歌曲的暂停怎么实现呢,如何知道一首歌曲播放完成了呢。避开暂停功能不提,如果无法知道一首歌曲什么时候播放完成,那么如何实现连续播放以及循环播放等功能呢。 很遗憾,这些我想要的功能从Process API中很难找到解决方案。 也或许是我还没去深究。
当然以上问题都不太影响MP3功能的实现,最大的麻烦来了,就是在ARM LINUX下 中文文件名乱码的问题。首先是客户端获取SD卡上文件名乱码,其次是根据这些乱码根本无法找到相应的文件。也就无法播放相应的歌曲。
这个问题拖了一个星期又一个星期。
终于C601主打背景音乐,客户需要这款产品了,
原本想就让客户当做体验吧,让客户只放非中文名的歌曲在SD卡就行了
当然这个懒人,不友善方案没能通过
问题还是得解决
刚开始一直以为只是编码问题,觉得问题不大,无非那几个编码捣鼓几个来回就可以了。
上周5开始,计划两天解决周六出。
结果只解决了客户端显示正常的问题,也就是可以顺利的将SD卡文件信息获取到,存放到XML数据库,并且客户端能够下载正确显示中文名称了。 刚开始采用的就是java API直接list某个文件夹下所有MP3后缀文件,但是获取到的都是乱码,非正确的编码方案。一个汉字变成了三个问号,这种结果明显是先对文件名通过utf-8编码将中文序列化成Byte数组,长度为3,然后通过ASCII编码转换成Unicode字符串,也就变成了3个问号,当时我怀疑是linux系统本身默认采用了ASCII编码,从而导致文件名变成3个问号,可是Linux系统默认应该使用的utf-8编码呀,既然系统采用utf-8编码,那么jvm应该也是默认调用系统编码吧,当时也没怀疑到这点上,从而也导致后来浪费了不少时间和精力 。既然怀疑是系统编码导致文件名乱码,那么我就绕过系统这一层,采用Ls命令获取原始Inputstream然后采用utf-8编码方式转换成Unicode字符串存储到XML数据库。这样顺利的解决了客户端显示中文正常的问题了。
本以为可以了,可是死活播放不了音乐文件,提示找不到文件。(心寒)
好吧耽误了这么长时间了,感觉还是编码问题,再仔细研究了下编码,发现一个问题,jvm编码与系统编码并不一致。我赶紧在PC机器linux系统下测试了下发现PC上jvm和系统编码一致。将测试测序放到ARM LINUX上 ,NND 问题果然在这。 JVM的默认编码是ASCII。 原来我一直误会“系统”了。既然这样立马修改 修改方式就是在调用jvm时,重新配置file.encoding。。 只要在启动命令行中加入-Dfile.encoding="UTF-8".
1,如何实现MP3模块播放,首先想到的就是采用jni方式,调用动态链接库so,由同事操刀完成底层调用开发,采用madplayer,给我提供我需要的上层接口,最后功能也貌似实现了。可是最后我并没有采取这样的实现方式,具体什么原因我现在也忘记了,明天再回忆回忆。 (好像需要加载较多运行库)
2,当然否定了以上方案必定有新的方案替代,那就是采用java 调用linux命令行方式来创建执行进程。 madplayer的使用方式就是madplayer [歌曲名路径]。 有了这个命令使用Runtime.getRuntime().exec(args)便可以创建一个madplayer的播放进程,这样madplayer就会自动加载歌曲路径实现播放功能了,这种方式简单,易操作,而且代码也精简,省去了方案一中的加载繁琐。
好吧,方案2看起来很爽,但其实弊端也不少,首先对于Java创建的播放进程,可以操作的很少,java提供的API对我来说有用的暂时就一个就是Process的stop()方法。 这样的话我就可以实现歌曲的播放与停止,停止实现就是调用stop()方法杀死进程。问题来了,歌曲的暂停怎么实现呢,如何知道一首歌曲播放完成了呢。避开暂停功能不提,如果无法知道一首歌曲什么时候播放完成,那么如何实现连续播放以及循环播放等功能呢。 很遗憾,这些我想要的功能从Process API中很难找到解决方案。 也或许是我还没去深究。
当然以上问题都不太影响MP3功能的实现,最大的麻烦来了,就是在ARM LINUX下 中文文件名乱码的问题。首先是客户端获取SD卡上文件名乱码,其次是根据这些乱码根本无法找到相应的文件。也就无法播放相应的歌曲。
这个问题拖了一个星期又一个星期。
终于C601主打背景音乐,客户需要这款产品了,
原本想就让客户当做体验吧,让客户只放非中文名的歌曲在SD卡就行了
当然这个懒人,不友善方案没能通过
问题还是得解决
刚开始一直以为只是编码问题,觉得问题不大,无非那几个编码捣鼓几个来回就可以了。
上周5开始,计划两天解决周六出。
结果只解决了客户端显示正常的问题,也就是可以顺利的将SD卡文件信息获取到,存放到XML数据库,并且客户端能够下载正确显示中文名称了。 刚开始采用的就是java API直接list某个文件夹下所有MP3后缀文件,但是获取到的都是乱码,非正确的编码方案。一个汉字变成了三个问号,这种结果明显是先对文件名通过utf-8编码将中文序列化成Byte数组,长度为3,然后通过ASCII编码转换成Unicode字符串,也就变成了3个问号,当时我怀疑是linux系统本身默认采用了ASCII编码,从而导致文件名变成3个问号,可是Linux系统默认应该使用的utf-8编码呀,既然系统采用utf-8编码,那么jvm应该也是默认调用系统编码吧,当时也没怀疑到这点上,从而也导致后来浪费了不少时间和精力 。既然怀疑是系统编码导致文件名乱码,那么我就绕过系统这一层,采用Ls命令获取原始Inputstream然后采用utf-8编码方式转换成Unicode字符串存储到XML数据库。这样顺利的解决了客户端显示中文正常的问题了。
本以为可以了,可是死活播放不了音乐文件,提示找不到文件。(心寒)
好吧耽误了这么长时间了,感觉还是编码问题,再仔细研究了下编码,发现一个问题,jvm编码与系统编码并不一致。我赶紧在PC机器linux系统下测试了下发现PC上jvm和系统编码一致。将测试测序放到ARM LINUX上 ,NND 问题果然在这。 JVM的默认编码是ASCII。 原来我一直误会“系统”了。既然这样立马修改 修改方式就是在调用jvm时,重新配置file.encoding。。 只要在启动命令行中加入-Dfile.encoding="UTF-8".
OK ,点击客户端软件上的中文歌曲。。。美妙的音乐响起来了!
(永景:老武)