当前位置: 首页 > 知识库问答 >
问题:

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

令狐钧
2023-03-14

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

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

    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/生文件夹,这似乎发挥罚款。这是特别有关的文件不被应用程序或媒体播放器可读。如果能让这篇文章发挥作用,我们将不胜感激。

@克里斯:我暂时让文件世界可写,一旦我让媒体播放器工作,事实上,我会将文件写为世界可读。到目前为止,硬编码路径是经过深思熟虑的,因为我只想首先确保读取文件时不会出现任何歧义。事实上,我通过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个答案

牟慎之
2023-03-14

正如Chris Stratton所评论的,不要硬编码到内部或外部存储的路径。它们可以在某些系统上工作,但不能保证适用于所有系统。

使用getFilesDir()查找目录的路径。从文件中。。。

公共文件

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

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

您可以对返回的文件调用getAbsolutePath(),然后追加/myfile。mp4到它,并使用它来设置数据源(…) Mediaplayer上的code>。

 类似资料:
  • 我正在用JavaFX开发我认为应该是一个简单的任务的media player,它将在用户默认的音乐文件夹路径(使用fedora)中播放存储在本地硬盘驱动器上的mp3文件。我可以很好地从命令行播放所有mp3文件,但当我尝试通过javafx.scene.media库播放时,javafx一直告诉我mp3是一种受支持的媒体类型。我已经下载了我能找到的每一个图书馆,但没有用。下面是一个实际尝试打开文件并播放

  • 当我使用MediaPlayer播放mp3文件时,系统会报告错误日志:。但是RealPlayer是正常的。 我发现它的错误只发生在更高的ROM版本。像4.0版本一样,它有错误。在2.3版中,它没有这个错误。 代码: 日志猫错误:

  • 1.1.1. 多媒体播放 1.1.1. 多媒体播放 我们事实上对上游芯片厂商自带的播放器方式做了调整。 Amlogic 芯片 BaseCode 我们禁用了芯片厂商的原生代码的 libplayer 包,原因是芯片厂商的播放器是直接使用 ALSA 框架来调用音频播放功能的。 这对我们 RokidOS 平台让多个进程使用音频设备造成阻碍。基于这个因素,我们使用了 RokidOS 开发的媒体播放库 lib

  • 我想使用MediaPlayer/MediaView在我的JavaFX应用程序中显示web cam的实时流。我尝试使用ffmpeg录制HLS并播放生成的m3u8文件,但这会引发以下异常(VLC播放视频时没有问题): 我调试了播放器的创建,当。此本机方法返回错误代码,javafx将其映射到。 我使用以下ffmpeg命令录制视频: 我非常确定编码符合javafx的要求,因为如果我将输出容器从m3u8更改

  • 我正在开发一个包含一些音频播放器的RecyclerView的应用程序。应用程序将下载。3gp文件(如果尚未下载)。 当我单击playAudio按钮时,音频未被播放。 这是我的适配器代码: 我怎样才能解决这个问题?