簡體   English   中英

如何在 Xamarin.forms 上播放聲音?

[英]How to play sounds on Xamarin.forms?

我正在使用 Xamarin.forms 創建適用於 Android、iOS 和 Windows Phone 的應用程序。 我的問題是如何使用 Xamarin Forms 播放 mp3 或 wav?

我的業務邏輯由共享項目處理,我不知道如何專門使用“MediaPlayer”平台。

現在Xamarin.form s 還沒有完善的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);
        }
   }

安卓解決方案:

    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");

您可以嘗試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();

我剛剛為 Xamarin 創建了一個適用於 iOS、Android、UWP、Windows 8.1 和 Windows Phone 8.1 的 AudioManager。 如果您有興趣,請查看https://github.com/jcphlux/XamarinAudioManager 有一個指向 Nuget 包的鏈接或隨意克隆該項目。

我認為, Xamarin.Forms 目前沒有完善的 API,因此您必須編寫自定義的、特定於平台的代碼。

檢查James Montemagno如何實現TextToSpeech (使用DependencyService

參考 :

使用依賴服務通過本機平台播放聲音。 如果您一次只需要播放一種聲音,您可以使用靜態字段來管理播放器對象的生命周期。 如果在播放音頻時發生垃圾收集,則靜態字段可防止播放器被破壞和音頻停止。

以下方法一次播放一個聲音,任何新聲音終止並替換任何以前的聲音。

為依賴服務創建一個接口:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM