我正在尝试让媒体播放器播放存储在本地/外部存储设备中的媒体文件。
使用单独的活动下载媒体文件并存储在本地/外部存储中。请参阅下面的存储示例代码。
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();
}
但是,媒体播放器拒绝播放该文件并始终失败并显示错误(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)
答案 0 :(得分:0)
正如Chris Stratton评论的那样,不要硬编码内部或外部存储的路径。它们可能在某些系统上运行,但并不能保证每个系统都有效。
使用getFilesDir()
查找目录的路径。来自文档...
public File getFilesDir()
返回文件系统上目录的绝对路径,其中存储使用openFileOutput(String,int)创建的文件。
返回保存应用程序文件的目录的路径。
您可以在返回的getAbsolutePath()
上致电File
,然后将/myfile.mp4
添加到setDataSource(...)
,并将其用于Mediaplayer
上的{{1}}。