【问题标题】:SetDataSource in MediaPlayer class to load up an mp3 file from Assets or raw folderMediaPlayer 类中的 SetDataSource 从 Assets 或 raw 文件夹加载 mp3 文件
【发布时间】:2017-01-04 21:05:09
【问题描述】:

我有从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();
  }
}

感谢任何帮助。

【问题讨论】:

  • 是否需要使用string 作为参数?您的解决方案是否可以使用文件名来代替?

标签: c# android xamarin xamarin.android


【解决方案1】:

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

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

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

 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/

【讨论】:

  • 这个播放的是 Asset 文件夹中的最后一首歌,我没有提到我在 Asset 文件夹中有多首歌曲。
  • 我找到了解决办法 player.SetDataSource(afd.FileDescriptor, afd.StartOffSet, afd.Length);
  • 请接受一个答案,即使它可以帮助您找到解决方案。在这种情况下,答案确实向您展示了如何在资产文件夹中查找文件,以便您可以使用它们。
【解决方案2】:

您可以同时使用assetsraw 文件夹来存储将使用您的.APK 编译的音频文件。

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

在 Android 中无法使用 filePathassetsraw 文件夹中检索文件。相反,这是通过使用AsssetManager 或通过Resource 完成的,如here 所述。

我还稍微优化了您的代码,因为不需要 else 子句。

资产文件夹

当尝试从assets 文件夹访问文件时,您需要使用来自this.Assets 的静态方法OpenFd(其中this 是您的ContextContext),名称为文件。这将返回一个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 文件夹中的音频文件的名称)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多