【问题标题】:How to play sounds on Xamarin.forms?如何在 Xamarin.forms 上播放声音?
【发布时间】:2016-03-19 07:01:45
【问题描述】:

我正在使用 Xamarin.forms 创建适用于 Android、iOS 和 Windows Phone 的应用程序。我的问题是如何使用 Xamarin Forms 播放 mp3 或 wav?

我的业务逻辑由共享项目处理,我不知道如何专门使用平台“MediaPlayer”。

【问题讨论】:

    标签: c# xamarin cross-platform xamarin.forms


    【解决方案1】:

    我认为,Xamarin.Forms 目前没有健全的 API,因此您必须编写自定义的、特定于平台的代码。

    检查 James Montemagno 如何实现 TextToSpeech(使用 DependencyService

    参考:

    【讨论】:

      【解决方案2】:

      我刚刚为 Xamarin 创建了一个适用于 iOS、Android、UWP、Windows 8.1 和 Windows Phone 8.1 的 AudioManager。如果您有兴趣,请查看https://github.com/jcphlux/XamarinAudioManager。有一个 Nuget 包的链接或随意克隆该项目。

      【讨论】:

      • 你还在更新你的项目吗?
      • 我已经不再使用 Xamarin。我一直将 Ionic 用于我的移动解决方案。在过去的 2 年里我没有更新它。如果有人想对其进行更新,我会提出拉取请求。对不起。
      【解决方案3】:

      目前Xamarin.forms 没有健全的API,所以你需要使用DependencyService

      检查以下链接,它对我来说工作正常:

      https://www.codeproject.com/Articles/1088094/Playing-audio-mp-File-in-Xamarin-Forms

      我们需要创建一个将在特定平台项目中实现的接口,我将其命名为 IAudio.cs,其代码如下:

      using System;
        namespace AudioPlayEx
         {
          public interface IAudio
              {
                  void PlayAudioFile(string fileName);
              }
         }
      

      Android 解决方案:

          using System;
          using Xamarin.Forms;
          using AudioPlayEx.Droid;
          using Android.Media;
          using Android.Content.Res;
      
          [assembly: Dependency(typeof(AudioService))]
          namespace AudioPlayEx.Droid
          {
              public class AudioService: IAudio
              {
                  public AudioService ()
                  {
                  }
      
                  public void PlayAudioFile(string fileName){
                      var player = new MediaPlayer();
                      var fd = global::Android.App.Application.Context.Assets.OpenFd(fileName);
                      player.Prepared += (s, e) =>
                      {
                          player.Start();
                      };
                      player.SetDataSource(fd.FileDescriptor,fd.StartOffset,fd.Length);
                      player.Prepare();
                  }
              }
      }
      

      iOS 解决方案:

      using System;
      using Xamarin.Forms;
      using AudioPlayEx;
      using AudioPlayEx.iOS;
      using System.IO;
      using Foundation;
      using AVFoundation;
      
      [assembly: Dependency (typeof (AudioService))]
      namespace AudioPlayEx.iOS
      {
          public class AudioService : IAudio
          {
              public AudioService ()
              {
              }
      
              public void PlayAudioFile(string fileName)
              {
                  string sFilePath = NSBundle.MainBundle.PathForResource
                  (Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName));
                  var url = NSUrl.FromString (sFilePath);
                  var _player = AVAudioPlayer.FromUrl(url);
                  _player.FinishedPlaying += (object sender, AVStatusEventArgs e) => {
                      _player = null;
                  };
                  _player.Play();
              }
          }
      }
      

      最后,我们将在我们的 PCL/共享项目中使用以下代码来播放音频文件。

      DependencyService.Get<IAudio>().PlayAudioFile("MySong.mp3");
      

      【讨论】:

      【解决方案4】:

      你可以试试Xam.Plugin.SimpleAudioPlayer,因为 Xamarin.Forms 没有健全的 API。

      简而言之,将 NuGet 包添加到您希望支持的每个特定于平台的项目中。将音频文件复制到 Windows UWP 和 Android 的 Assets 文件夹,并将构建操作分别设置为 ContentAndroid Asset。对于 iOS,将音频文件复制到 Resources 文件夹并将构建操作设置为BundleResource,然后像这样播放文件:

      var player = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current; 
      player.Load("intro_sound.mp3");
      player.Play();
      

      【讨论】:

      • 迄今为止最简单的解决方案。
      【解决方案5】:

      使用依赖服务通过原生平台播放声音。如果您一次只需要播放一种声音,您可以使用静态字段来管理播放器对象的生命周期。如果在播放音频时发生垃圾收集,静态字段可防止播放器被破坏并停止音频。

      以下方法一次播放一个声音,任何新声音终止并替换任何以前的声音。

      为依赖服务创建接口:

      public interface IAudio {
          void PlayAudioFile(string fileName);
      }
      

      在你想播放声音的地方使用依赖服务:

      DependencyService.Get<IAudio>().PlayAudioFile("honk.mp3");
      

      这是 iOS 的依赖服务:

      using AVFoundation;
      using Foundation;
      using System.IO;
      using Xamarin.Forms;
      
      [assembly: Dependency(typeof(AudioService))]
      public class AudioService : IAudio {
          static AVAudioPlayer player;
      
          public void PlayAudioFile(string fileName) {
              var url = NSUrl.FromString(NSBundle.MainBundle.PathForResource(Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName)));
              player = AVAudioPlayer.FromUrl(url);
              player.FinishedPlaying += (sender, e) => { player = null; };
              player.Play();
          }
      }
      

      这是 Android 的依赖服务:

      using Xamarin.Forms;
      using Android.Media;
      
      [assembly: Dependency(typeof(AudioService))]
      public class AudioService : IAudio {
          static MediaPlayer player;
      
          public void PlayAudioFile(string fileName) {
              player?.Stop();
              player = new MediaPlayer();
              var fd = Android.App.Application.Context.Assets.OpenFd(fileName);
              player.SetDataSource(fd.FileDescriptor, fd.StartOffset, fd.Length);
              player.Prepared += (s, e) => player.Start();
              player.Completion += (s, e) => { player = null; };
              player.Prepare();
          }
      }
      

      【讨论】:

      • 感谢@MikeDarwish 的回答,显示了本地调用使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多