源码共享:C# 在mac OS里 控制播放mp3

项目中要用到声音提醒功能。条件是macOS,而不是windows平台。

使用VS 2019 for Mac 和 xcode . 你只要使用的这两个开发工具版本配对 就可以顺利编译运行C# 开发mac应用

复制代码
using System;
using AVFoundation;
using Foundation;


namespace YuanMacLib
{
    public class MacAudioPlayer
    {
        // 必须保持强引用,否则播放可能被 GC 中断
        private AVAudioPlayer _audioPlayer;

        /// <summary>
        /// 从绝对文件路径播放声音
        /// </summary>
        public void PlayFromFile(string filePath)
        {
            var url = NSUrl.FromFilename(filePath);
            Play(url);
        }

        /// <summary>
        /// 从应用程序包资源中播放声音
        /// 例如资源文件名为 "alert.mp3",放在 Resources 文件夹,Build Action 设为 BundleResource
        /// </summary>
        public void PlayFromBundle(string resourceName, string extension)
        {
            var path = NSBundle.MainBundle.PathForResource(resourceName, extension);
            if (path == null)
            {
                Console.WriteLine($"未找到资源: {resourceName}.{extension}");
                return;
            }
            var url = NSUrl.FromFilename(path);
            Play(url);
        }

        private void Play(NSUrl url)
        {
            // 如果已有播放器在播放,先停止并释放
            Stop();

            NSError error;
            _audioPlayer = AVAudioPlayer.FromUrl(url, out error);

            if (error != null)
            {
                Console.WriteLine($"AVAudioPlayer 初始化失败: {error.LocalizedDescription}");
                _audioPlayer = null;
                return;
            }

            // 配置播放参数
            _audioPlayer.Volume = 1.0f;       // 音量 0.0 ~ 1.0
            _audioPlayer.NumberOfLoops = 0;   // 0 = 播放一次,-1 = 无限循环
            _audioPlayer.FinishedPlaying += OnFinishedPlaying;

            _audioPlayer.PrepareToPlay();
            bool started = _audioPlayer.Play();
            Console.WriteLine(started ? "开始播放" : "播放失败");
        }

        private void OnFinishedPlaying(object sender, AVStatusEventArgs e)
        {
            Console.WriteLine("播放完成");
            Stop(); // 播放结束后释放
        }

        public void Stop()
        {
            if (_audioPlayer != null)
            {
                _audioPlayer.FinishedPlaying -= OnFinishedPlaying;
                if (_audioPlayer.Playing)
                    _audioPlayer.Stop();
                _audioPlayer.Dispose();
                _audioPlayer = null;
            }
        }
    }
}

调用方法:

复制代码
MacAudioPlayer player = new MacAudioPlayer(); 

player.PlayFromBundle("happy together", "mp3");

happy together.mp3 被事先添加到项目Resources文件夹中,Build Action 设为 BundleResource

好了,就这样!