项目中要用到声音提醒功能。条件是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
好了,就这样!