在MediaPlayer类中设置DataSource以从Assets或原始文件夹加载mp3文件



我有从path播放mp3文件的代码。虽然我不知道当我调用StartPlayer(String filePath)时,我的filePath的值应该是多少。

我存储的音频文件位于assetsraw文件夹中。但我不知道存储音频文件的最佳位置是什么?此外,我不知道如何从任何一个文件夹访问路径。

protected MediaPlayer player;
public void StartPlayer(String  filePath)
{
if (player == null) {
player = new MediaPlayer();
} else {
player.Reset();
player.SetDataSource(filePath);
player.Prepare();
player.Start();
}
}

感谢您的帮助。

如果将媒体文件添加为资产,则需要使用AssetManager来获得AssetFileDescriptor。通过访问Android.App.Context(如Activity)上的Assets属性,可以获得AssetManager的实例。因此,在Activity子类中,可以在else子句中执行以下操作:

AssetFileDescriptor afd = Assets.OpenFd("filenameinAssetsfolder.mp3");
player = new MediaPlayer();
player.Reset();
player.SetDataSource(afd.FileDescriptor);
player.Prepare();
player.Start();

然而,我不得不说,由于您的else子句,您的音频将不会第一次播放,当调用该方法时,当MediaPlayer为null时,该子句将不会运行。看来你应该这么做:

if (player == null)
{
player = new MediaPlayer();
}
AssetFileDescriptor afd = Assets.OpenFd("filenameinAssetsfolder.mp3");
player.Reset();
player.SetDataSource(afd.FileDescriptor);
player.Prepare();
player.Start();

有关AssetManager的更多信息:https://developer.xamarin.com/guides/android/application_fundamentals/resources_in_android/part_6_-_using_android_assets/

您可以使用assetsraw文件夹来存储音频文件,这些文件将使用.APK.进行编译

但是,在使用filePath作为参数时,您应该重新考虑您的策略。相反,可以考虑使用string fileNameint resource

在Android中,无法使用filePathassetsraw文件夹检索文件。相反,这是通过使用AsssetManager或通过这里提到的Resource来完成的。

我还对您的代码进行了一些优化,因为不需要else子句。

资源文件夹

尝试从assets文件夹访问文件时,需要使用静态方法OpenFdfromthis.Assets(其中thisActivityContext)和文件名。这将返回一个AssetFileDescriptor,您可以将其用作DataSource,如下所示:

protected MediaPlayer player;
public void StartPlayer(string fileName)
{
if (player == null) 
player = new MediaPlayer();
var fileDescriptor = Assets.OpenFd(filename);
player.Reset();
player.SetDataSource(fileDescriptor.FileDescriptor);
player.Prepare();
player.Start();
}

原始文件夹

您也可以使用raw文件夹,尽管它要求您指向给定Resource的自动生成的id。这是使用MediaPlayer:的静态Create方法完成的

protected MediaPlayer player;
public void StartPlayer(int resource)
{
if (player == null) 
player = MediaPlayer.Create(this, resource);
player.Reset();
player.Prepare();
player.Start();
}

其中resource是指Resource.raw.youraudiofile可以访问的raw文件夹中的音频文件(其中youraudiofileraw文件夹中音频文件的名称)。

您可以阅读Xamarin文档中有关使用raw文件夹的更多信息。

相关内容

最新更新