[英]Android MediaPlayer unable to play media file from local storage
我試圖使媒體播放器播放存儲在本地/外部存儲中的媒體文件。
媒體文件是使用單獨的活動下載的,並存儲在本地/外部存儲中。有關存儲的示例代碼,請參見下文。
FileOutputStream fos = openFileOutput("myfile.mp4" , Context.MODE_WORLD_WRITEABLE);
fos.write(byteArrayBuf.toByteArray());
fos.close();
為了播放相同的文件,我使用了。
mMediaPlayer = new MediaPlayer();
ParcelFileDescriptor parcel = ParcelFileDescriptor.open(new File( URI.create("file:///data/data/com.mypackage/files/myfile.mp4")),ParcelFileDescriptor.MODE_READ_WRITE);
mMediaPlayer.setDataSource(parcel.getFileDescriptor());
mMediaPlayer.setDisplay(mHolder);
mMediaPlayer.prepare();
mMediaPlayer.setOnPreparedListener(this);
/** On Prepared Implementation **/
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
}
但是,媒體播放器拒絕播放文件,並且始終失敗並顯示error(1,)。 我真的想盡辦法使此媒體播放器運行,因為我似乎已經完成了所有與代碼示例一致的工作,以使其從本地/外部存儲中讀取文件。
注意:當我用res / raw文件夾中的文件替換本地文件時,這似乎很好用。 這與應用程序或媒體播放器無法讀取文件有關。 非常感謝您的幫助,以使這部分工作。
@Chris:我暫時制作了文件WORLD_WRITEABLE,一旦使媒體播放器工作,實際上將文件寫入WORLD_READABLE。 到目前為止,對路徑進行硬編碼是有意的,因為我只想初步確保讀取文件時不會產生任何歧義。 實際上我已經通過adb shell和DDMS檢查了該文件是否確實存在。一旦我讀取了文件,實際上我可能會使用更明智的方法,例如getFilesDir()。 Logcat的輸出如下。
surfaceCreated
I/AwesomePlayer( 34): reset
I/AwesomePlayer( 34): cancel player events
I/AwesomePlayer( 34): cancel player events
I/SampleTable( 34): There are reordered frames present.
D/MyPlayerActivity( 460): surfaceChanged
I/ActivityManager( 82): Displayed com.mypackage/.MyPlayerActivity: +1s997ms
D/MyPlayerActivity( 460): Video Prepared
D/AudioSink( 34): bufferCount (4) is too small and increased to 12
E/MediaPlayer( 460): error (1, -2147483648)
E/MediaPlayer( 460): Error (1,-2147483648)
正如克里斯·斯特拉頓(Chris Stratton)所說,請勿對內部或外部存儲的路徑進行硬編碼。 它們可能在某些系統上工作,但不能保證每個系統都可以。
使用getFilesDir()
查找目錄的路徑。 從文檔...
公共文件getFilesDir()
返回到使用openFileOutput(String,int)創建的文件存儲在文件系統上目錄的絕對路徑。
返回保存應用程序文件的目錄的路徑。
您可以在返回的File
上調用getAbsolutePath()
,並將/myfile.mp4
附加到該File
然后將其用於Mediaplayer
上的setDataSource(...)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.