Android MediaPlayer无法从本地存储播放媒体文件

时间:2012-05-17 16:53:42

标签: android video media-player

我正在尝试让媒体播放器播放存储在本地/外部存储设备中的媒体文件。

使用单独的活动下载媒体文件并存储在本地/外部存储中。请参阅下面的存储示例代码。

    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文件夹中的文件替换本地文件时,这似乎很好。这是否与应用程序或媒体播放器无法读取的文件有关。帮助将非常感谢使这件作品。

更新1

@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)

1 个答案:

答案 0 :(得分:0)

正如Chris Stratton评论的那样,不要硬编码内部或外部存储的路径。它们可能在某些系统上运行,但并不能保证每个系统都有效。

使用getFilesDir()查找目录的路径。来自文档...

  

public File getFilesDir()

     

返回文件系统上目录的绝对路径,其中存储使用openFileOutput(String,int)创建的文件。

     

返回保存应用程序文件的目录的路径。

您可以在返回的getAbsolutePath()上致电File,然后将/myfile.mp4添加到setDataSource(...),并将其用于Mediaplayer上的{{1}}。