看完之后 ”媒体播放" and "媒体播放器“ android 文档我仍然很困惑,需要有经验的建议设置数据源重载方法。
我在用MediaPlayer
in a Service
我的项目中的组件将是前台服务播放音乐时。我的音乐文件(.mp3)位于res/raw
我的apk的文件夹。
要开始播放,我知道我必须准备 MediaPlayer 对象。因为 Android 应用程序中的服务默认使用单进程和主线程,所以我不希望我的用户得到ANR当 MediaPlayer 自行准备时(考虑原始文件夹中的媒体文件是否很大)。
然后我用prepareAsync
代替prepare
(同步)。所以我不能使用:
mp = MediaPlayer.create(context, R.raw.myfile);
因为这已经调用了prepare()
内部但不是prepareAsync()
。
所以基本上我有两个选择(四个中的两个):
Uri myUri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.myfile);
mp.setDataSource(context, myUri);
or
AssetFileDescriptor afd = context.getResources().openRawResourceFd(R.raw.myfile);
mp.setDataSource(fd.getFileDescriptor());
afd.close();
使用其中之一后我可以简单地使用:
mp.prepareAsync();
最后我的问题是“包括这些不同的方法,哪一种是最好的选择?其中一种比另一种有什么好处吗?我错过了什么吗?”
各种调用方式并没有任何实际好处create
or setDataSource
。静态的create
方法除了调用之外没有做更多的事情setDataSource
and prepare
。各种种类setDataSource
方法在内部相互调用。最终它们归结为两种可能的本机调用,一种使用描述远程 URI 的字符串,另一种使用本地文件描述符。自己创建文件描述符可能会带来非常轻微的性能优势,但在上下文中不会明显。
对于本地文件播放,正如您在代码中演示的那样,只需调用prepare
(或静态create
方法)根本不是一个坏习惯。无论文件大小如何,底层播放器都应该可以毫无问题地确定相关元数据并快速返回。这prepareAsync
方法对于网络流更有用,其中任何数量的情况都可能导致一些意外的延迟。如果您正在设计通用播放器,那么使用prepareAsync
方法将是可行的方法,但如果您只是玩原始资产,那么它应该没有任何区别。提供的各种方法只是为了方便(请注意 javadoccreate
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)