2015-02-08 52 views
1

我已經創建的3種聲音3資產文件描述符(放在res /原始)的Android:MediaPlayer.setDataSource(的FileDescriptor FD)對MediaPlayer.setDataSource(FD FileDescriptor的,長偏移,長的長度)

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個聲音?

非常感謝。

回答

2

第二個被告知長度(和偏移量),而第一個只要文件描述符返回一些數據就會播放。資源通常存儲在一個檔案中,因此從文件描述符中讀取會繼續經過第一首歌曲,然後找到第二首歌曲,然後是第三首歌曲。

+0

非常感謝您的解釋。不過,我依然隱約瞭解文件描述符的概念。如果使用沒有設置長度和偏移量的文件描述符,將使MediaPlayer從FileDecriptor_1播放到FileDecriptor_2,FileDecriptor_3等等。那麼setDataResource(FileDescriptor fd)方法的用法是什麼呢?我假設應該只有setDataSource(FileDescriptor,long startOffset,long length)。這是我仍然不明白的地方。 – 2015-02-10 15:59:11

+0

文件描述符指向整個文件,因此您需要爲資源提供偏移量和長度,因爲所有資源都位於一個大檔案(文件)中。如果您在應用程序數據目錄或SD卡上打開一個文件,除文件外沒有內容,您不需要指定偏移量和長度。 – StenSoft 2015-02-10 16:25:56

+0

非常感謝StenSoft!我是android編程的新手,所以我真的需要像你這樣善良的人幫助!祝你今天愉快! – 2015-02-15 03:04:08