Android:MediaPlayer.setDataSource(FileDescriptor fd) vs MediaPlayer.setDataSource(FileDescriptor fd,
Posted
技术标签:
【中文标题】Android:MediaPlayer.setDataSource(FileDescriptor fd) vs MediaPlayer.setDataSource(FileDescriptor fd, long offset, long length)【英文标题】:Android: MediaPlayer.setDataSource(FileDescriptor fd) vs MediaPlayer.setDataSource(FileDescriptor fd, long offset, long length) 【发布时间】:2015-02-08 12:27:41 【问题描述】:我已经创建了 3 个声音的 3 个资产文件描述符(放在 res/raw 中)
AssetFileDescriptor afd1 = mContext.getResources().openRawResourceFd(R.raw.mp3_file_1);
AssetFileDescriptor afd2 = mContext.getResources().openRawResourceFd(R.raw.mp3_file_2);
AssetFileDescriptor afd3 = mContext.getResources().openRawResourceFd(R.raw.mp3_file_3);
然后我将它们放入一个数组中:
array.add(afd1);
array.add(afd2);
array.add(afd3);
然后我创建一个 MediaPlayer 的实例,让它只播放数组中的第一个声音
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(array.get(0).getFileDescriptor());
mp.prepare();
mp.start()
但是,数组中的所有 3 个声音都会播放。 然后我尝试使用 setDataSource(FileDescriptor, long, long) 而不是 setDataSource(FileDescriptor fd),mp 只播放我想要的数组中的第一个声音。
AssetFileDescriptor afd = array.get(0);
mp.setDataSource(afd.getFileDescriptor(),
afd.getStartOffset(), afd.getLength());
我的问题是上面的两个 setDataSource 方法有什么区别?使用我在这里包含的代码,为什么 setDataSource(array.get(0)) 会播放数组中的所有 3 个声音?
非常感谢。
【问题讨论】:
【参考方案1】:第二个被告知长度(和偏移),而第一个在文件描述符返回一些数据时播放。资源通常存储在存档中,因此从文件描述符中读取会继续经过第一首歌曲,然后找到第二首歌曲,然后是第三首歌曲。
【讨论】:
非常感谢您的解释。不过,我还是对文件描述符的概念有一个模糊的了解。如果使用文件描述符而不设置长度和偏移量,会使 MediaPlayer 从 FileDecriptor_1 播放到 FileDecriptor_2、FileDecriptor_3 等。那么 setDataResource(FileDescriptor fd) 方法有什么用呢?我假设应该只有 setDataSource(FileDescriptor, long startOffset, long length)。这是我仍然不明白的。 文件描述符指向整个文件,因此您需要为资源提供偏移量和长度,因为所有资源都在一个大存档(文件)中。如果你在你的应用数据目录或SD卡上打开一个文件,除了文件之外没有其他内容,你不需要指定偏移量和长度。 非常感谢 StenSoft!我是android编程的新手,所以我真的需要像你这样的好心人的帮助!祝你有美好的一天!以上是关于Android:MediaPlayer.setDataSource(FileDescriptor fd) vs MediaPlayer.setDataSource(FileDescriptor fd,的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )