Fre*_*uss 7 android media-player
在阅读" Media Playback "和" MediaPlayer "android文档后,我仍然感到困惑,需要有关setDataSource重载方法的经验建议.
我正在使用我的Project MediaPlayer中的一个Service组件,它将在播放音乐时成为前台服务.我在res/raw我的apk文件夹中有我的音乐文件(.mp3).要开始播放,我知道我必须准备MediaPlayer对象.因为Android应用程序中的服务默认使用单个进程和主线程,所以我不希望我的用户
在MediaPlayer自行准备时获得ANR(想想原始文件夹中的媒体文件是否有大的大小).然后我使用prepareAsync而不是prepare(同步).所以我不能用:
mp = MediaPlayer.create(context, R.raw.myfile);
Run Code Online (Sandbox Code Playgroud)
因为这已经在prepare()内部调用但不是prepareAsync().所以基本上我有两个选择(两个四个):
Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);
Run Code Online (Sandbox Code Playgroud)
要么
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
Run Code Online (Sandbox Code Playgroud)
使用其中之一后,我可以简单地使用:
mp.prepareAsync();
Run Code Online (Sandbox Code Playgroud)
最后,我的问题出现了"包括这些不同的方法,哪一个是最好的选择?一方面有什么好处?我错过了什么吗?"
有没有调用的各种方式的任何实际利益create或setDataSource.静态create方法不仅仅是调用setDataSource和prepare.各种setDataSource方法在内部相互调用.最终它们归结为两个可能的本机调用,一个带有描述远程URI的字符串,另一个带有本地文件描述符.自己创建文件描述符可能会有非常轻微的性能优势,但在上下文中它不会很明显.
对于本地文件回放,正如您在代码中演示的那样,简单地调用prepare(或静态create方法)根本不是一个坏习惯.无论文件大小如何,底层播放器都应该没有问题确定相关元数据并快速返回.该prepareAsync方法对于网络流更有用,其中任何数量的情况都可能导致一些意外延迟.如果您正在设计一个通用播放器,那么使用该prepareAsync方法将是可行的方法,但如果您只是在玩原始资产,它应该没有任何区别.提供的各种方法仅仅是为了方便(请注意javadoc create).
| 归档时间: |
|
| 查看次数: |
6757 次 |
| 最近记录: |