以xamarin格式播放下载的mp3

时间:2017-06-25 19:20:18

标签: audio xamarin xamarin.forms

我可以通过调用

将一个名为“test.mp3”的文件作为资源添加到我的pcl项目的“Resources \ Sounds \”文件夹中

AudioManager.Audio.Manager.PlaySound("test.mp3");

现在我正在尝试播放我从webapi服务下载的音频文件。我使用RestSharp库下载文件和PCLStorage库来存储文件:

try
            {
                var fileId = new Guid("test2");
                IFolder rootFolder = FileSystem.Current.LocalStorage;
                IFolder resources = await rootFolder.CreateFolderAsync("Resources", CreationCollisionOption.OpenIfExists);
                IFolder soundsFolder = await rootFolder.CreateFolderAsync("Sounds", CreationCollisionOption.OpenIfExists);
                IFile myFile = await soundsFolder.CreateFileAsync($"{fileId}.mp3", CreationCollisionOption.ReplaceExisting);
                using (var stream = await myFile.OpenAsync(fileAccess: FileAccess.ReadAndWrite))
                {

                var request = new RestRequest($"{fileId}");
                var client = new RestClient();
                client.BaseUrl = new System.Uri("http://10.0.2.2/MyApp.WebApi/api/");
                var bytes = client.DownloadData(request);
                foreach (var myByte in bytes)
                {
                    stream.WriteByte(myByte);
                }
            }
        }
        catch (Exception e)
        {

        }

我也尝试将文件保存到根目录但这也不起作用。

据我所知,文件似乎下载得很好(没有错误)。但是我还没有找到一种方法来通过在android模拟器上定位文件来验证这一点。我想我首先需要以某种方式安装Play商店,然后下载ES File explorer以查看android模拟器上的文件结构。

问题在于,当我尝试以与嵌入式资源相同的方式播放声音文件时,它将无法正常工作。

AudioManager.Audio.Manager.PlaySound("test2.mp3");

我想这是因为在编译时将嵌入式资源迁移到android模拟器上的“某处”所发生的魔力。 我的主要问题是我不明白使用什么路径

  • 编写文件(尝试资源/声音和根目录)
  • 读取文件(试过 资源/声音和根)

为了能够播放文件

1 个答案:

答案 0 :(得分:1)

事实证明AudioManager库假定声音始终是Assets。 在它的NewSound method in the android code中,它尝试使用以下行构建AssetFileDescriptor:

  

Forms.Context.Assets.OpenFd(文件路径);

我想这个方法需要一个相对于assets文件夹的文件路径(对于已编译的资源),否则抛出一个FileNotFoundException。无论如何抛出此异常都没有在我的pcl代码中达到我的catch语句。 (它看起来像是在android - > pcl层中被吞噬了吗?)

现在我将SoundPool.LoadAsync与文件路径而不是AssetFileDescriptor一起使用,这解决了我的问题。

耶!