Android:MediaPlayer.setDataSource(FileDescriptor fd)vs MediaPlayer.setDataSource(FileDescriptor fd,long offset,long length)

时间:2015-02-08 12:27:41

标签: android-mediaplayer

我创建了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 个答案:

答案 0 :(得分:2)

第二个被告知长度(和偏移),而第一个播放只要文件描述符返回一些数据就播放。资源通常存储在存档中,因此从文件描述符读取的内容将继续通过第一首歌曲,然后找到第二首歌曲,然后是第三首歌曲。