【问题标题】:How to play audio in xamarin forms?如何以 xamarin 形式播放音频?
【发布时间】:2023-03-27 23:08:01
【问题描述】:

我正在尝试播放本地存储的音频文件。我正在使用Xam.Plugin.SimpleAudioPlayer 播放音频。对于 UWP 和 Android,分别将 Build Action 设置为 Content 和 Android Asset 的文件添加到 Assets 文件夹中。

我的代码:

private void PlayAudio()
    {
        try
        {
            var stream = GetStreamFromFile("audio.mp3");
            var audio = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
            audio.Load(stream);
            audio.Play();
        }
        catch (Exception e)
        {
            Debug.WriteLine("exception:>>" + e);
        }
    }

    Stream GetStreamFromFile(string filename)
    {
        var assembly = typeof(App).GetTypeInfo().Assembly;

        var stream = assembly.GetManifestResourceStream("AudioPlay." + filename);

        return stream;
    }

但是在 android 和 UWP 中出现异常,没有在 IOS 中检查。

Android 异常:

[0:] 异常:>>System.NullReferenceException:对象引用未设置为对象的实例。 在 C:\dev\open\Xamarin-Plugins\SimpleAudioPlayer\SimpleAudioPlayer\Plugin.SimpleAudioPlayer.Android\SimpleAudioPlayerImplementation.cs:100 中的 Plugin.SimpleAudioPlayer.SimpleAudioPlayerImplementation.Load (System.IO.Stream audioStream) [0x00050] 在 F:\AudioPlay\AudioPlay\AudioPlay\MainPage.xaml.cs:63 中的 AudioPlay.MainPage.PlayAudio () [0x00014]

我正在使用 .mp3 文件。我在这个实现中遗漏了什么吗?请帮我解决这个问题?

【问题讨论】:

    标签: audio xamarin.forms


    【解决方案1】:

    你只需要将mp3文件直接放到share project中即可。并调用方法

    var stream = GetStreamFromFile("xxx.mp3");
    var audio = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current;
    audio.Load(stream );
    audio.Play();
    
    Stream GetStreamFromFile(string filename)
    {
       var assembly = typeof(App).GetTypeInfo().Assembly;
    
       var stream = assembly.GetManifestResourceStream("yourprojectname." + filename);
    
       return stream;
    }
    

    更新

    我检查了你的演示,如果你想在你的项目中播放 mp3 文件。您需要将 mp3 的构建操作设置为 Embedded resource

    右键点击mp3文件->属性

    【讨论】:

    • 当前上下文中不存在名称“GetStreamFromFile”
    • 提供样品,我会亲自测试。
    • 你能看一下吗,我已经在google文件夹上上传了一个示例。
    • 再次出现异常:[0:] 异常:>>System.NullReferenceException:对象引用未设置为对象的实例。在 Plugin.SimpleAudioPlayer.SimpleAudioPlayerImplementation.Load (System.IO.Stream audioStream) [0x00050] 在 C:\dev\open\Xamarin-Plugins\SimpleAudioPlayer\SimpleAudioPlayer\Plugin.SimpleAudioPlayer.Android\SimpleAudioPlayerImplementation.cs:100 在 AudioPlay.MainPage .PlayAudio () [0x00014] in F:\AudioPlay\AudioPlay\AudioPlay\MainPage.xaml.cs:63 09-27 16:25:00.759 V/MediaPlayer(13226): resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgr跨度>
    【解决方案2】:

    试试这个对于 xamarin.android

    var u = Android.Net.Uri.Parse("filepath");
    MediaPlayer _player = MediaPlayer.Create(this, u);
    _player.Start();
    

    或 使用 XamarinMediaManager 插件

    https://github.com/martijn00/XamarinMediaManager

    【讨论】:

    • 什么“文件路径”? “Resources.Drawable.Audio”?
    【解决方案3】:

    当尝试从不是 Xamarin Forms 主项目的项目中加载资源时,接受的答案不起作用。

    解决方案是使用Android.AssetManager.Open() 获取Stream (我相信iOS 也有类似的东西)。您需要使用 DependencyService 在 Android 项目之外访问它。

    MP3 文件将放在 Android 项目的 Assets 文件夹中。 音频文件需要有 Build Action: "Android Asset",而不是上面的“Embedded Resource”。


    示例:
    Android 项目有Assets/Audio/click.mp3

    AndroidProject/AndroidAssetManager.cs

    [assembly: Dependency (typeof (AndroidAssetManager))]
    namespace App.Droid
    {
        public interface IAssetManager
        {
            Stream LoadAsset(string assetName);
            ...
        }
    
        public class AndroidAssetManager : IAssetManager
        {
            private readonly AssetManager _assets;
    
            public AndroidAssetManager(AssetManager assets)
            {
                _assets = assets;
            }
            
            public Stream LoadAsset(string assetName)
            {
                return _assets.Open(assetName);
            }
            ...
        }
    }
    

    Shared/AudioPlayer.cs:

    class AudioPlayer : IAudioPlayer
    {
        private IAssetManager AssetManager => DependencyService.Get<IAssetManager>();
        private ISimpleAudioPlayer _clickPlayer;
    
        public AudioPlayer()
        {
            _clickPlayer = CrossSimpleAudioPlayer.CreateSimpleAudioPlayer();
            _clickPlayer.Load(AssetManager.Load("Audio/click.mp3"));
        }
    
        public void PlayClick()
        {
            _clickPlayer.Play();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多