从 Android 上的资产中读取音频文件

Posted

技术标签:

【中文标题】从 Android 上的资产中读取音频文件【英文标题】:Read audio file from assets on Android 【发布时间】:2011-12-11 19:42:45 【问题描述】:

我正在尝试播放存储在资产目录中的音频文件,但在我读取文件之前,我收到错误“错误发生 java.io.FileNotFoundException:track.mp3”。以下是我的阅读方式:

AssetFileDescriptor afd = getAssets().openFd("track.mp3");

我在互联网上阅读了很多描述,但没有成功。

【问题讨论】:

您也可以将其存储在 res 下的 raw 目录中,这样您就可以更轻松地将其加载到媒体播放器中,因为您可以提供 res id。 很遗憾,我需要播放大量文件,所以我真的不想跟踪资源中的每一个文件。 对我来说这是案例问题。文件名是资产文件夹中的 MP3 格式,但我使用的是代码中的 mp3。通过使用完全相同的名称来解决问题。 【参考方案1】:

我认为这段代码应该适合你:

AssetFileDescriptor afd = getAssets().openFd("track.mp3");

MediaPlayer player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
player.prepare();
player.start();

否则,请检查文件是否在正确的文件夹中,名称是否为“track.mp3”。

【讨论】:

好吧,正如我所说,在我使用 MediaPlayer 对象之前,我得到了 FileNotFoundException。它在我打开 AssetFileDescriptor 后抛出。 这是我正在使用的代码路径,但它不起作用:***.com/questions/9124378/…【参考方案2】:

右键单击“track.mp3”文件,使用“重构”>“移动”命令,将文件移动到另一个目录(例如“res”)。使用相同的命令,将其移回您的“资产”目录。对我来说,它有效。

【讨论】:

【参考方案3】:

android 指南建议音频使用 res/raw 文件夹。所以确保所有的音频都在那里,当你阅读时你可以使用这个方法:

void playAudio(Context mContext, String sound)
    new AudioPlayer().play(mContext, mContext.getResources().getIdentifier(
            sound,"raw", mContext.getPackageName()));

如果您需要线路音频播放器,请查看MediaPlayer

【讨论】:

【参考方案4】:

使用此代码

MediaPlayer mediaPlayer = new MediaPlayer();
            AssetFileDescriptor afd;
            try 
                afd = getAssets().openFd("1.mp3");
                mediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
                mediaPlayer.prepare();
                mediaPlayer.start();
             catch (IOException e) 
                          Toast.makeText(LearnActivity.this, "Error Playing audio from Asset directory",Toast.LENGTH_SHORT).show();
            

否则,请检查文件是否在正确的文件夹中,名称是否为“track.mp3”。

【讨论】:

纯代码答案是低质量的答案。 谢谢您的建议,先生 :)

以上是关于从 Android 上的资产中读取音频文件的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将音频文件从 iPhone 的文件系统复制到资产库

如何使用 Kotlin 从 android 中的资产中读取 json 文件?

从资产中读取文件

是否可以直接从 OpenSL ES(适用于 Android)中的音频资产获取字节缓冲区?

Android 上的音频流

Flutter - 从资产中读取文本文件