Windows 播放音乐API
使用C#的NAudio库进行封装 (只支持Windows)
MusicPlayer类
一个Player控制一个歌曲播放 以下为C#代码
namespace Web_Music_Controller_Base; using System.Timers; using System.Threading.Tasks; using NAudio.Wave; public class MusicPlayer : IDisposable { private AudioFileReader? _audioFile; private WaveOutEvent? _outputDevice; private TaskCompletionSource<bool>? _playbackFinished; private PlayStatus _playStatus = PlayStatus.BeforeInit; private String? _filePath; public String GetFilePath() { return _filePath; } public PlayStatus GetPlaySataus() { return _playStatus; } public int GetCurrentSec() { if (_playStatus == PlayStatus.BeforeInit) throw new Exception("GetCurrentSec(Error) _audioFile实例未初始化"); return (int)_audioFile.CurrentTime.TotalSeconds; } public int GetTotalSec() { if (_playStatus == PlayStatus.BeforeInit) throw new Exception("GetTotalSec(Error) _audioFile实例未初始化"); return (int)_audioFile.TotalTime.TotalSeconds; } public MusicPlayer(string filePath) { _playStatus = PlayStatus.Stop; _audioFile = new AudioFileReader(filePath); _filePath = filePath; } public async Task Play() { Stop(); _outputDevice = new WaveOutEvent(); _outputDevice.Init(_audioFile); _playbackFinished = new TaskCompletionSource<bool>(); _outputDevice.PlaybackStopped += (s, e) => { _playStatus = PlayStatus.Stop; _playbackFinished.TrySetResult(true); }; _outputDevice.Play(); _playStatus = PlayStatus.Playing; await _playbackFinished.Task; } public void Pause() { if (_outputDevice != null && _outputDevice.PlaybackState == PlaybackState.Playing) { _outputDevice.Pause(); _playStatus = PlayStatus.Pause; } } public void Resume() { if (_outputDevice != null && _outputDevice.PlaybackState == PlaybackState.Paused) { _outputDevice.Play(); _playStatus = PlayStatus.Playing; } } public void Stop() { _playStatus = PlayStatus.Stop; _outputDevice?.Stop(); _audioFile.CurrentTime = TimeSpan.Zero; } public void setCurrentSec(int sec) { if (_playStatus == PlayStatus.BeforeInit) throw new Exception("Seek(Error) _audioFile实例未初始化"); _audioFile.CurrentTime = TimeSpan.FromSeconds(sec); } public void Dispose() { Stop(); _audioFile?.Dispose(); _outputDevice?.Dispose(); _audioFile = null; _outputDevice = null; _playStatus = PlayStatus.BeforeInit; } }
MusicController类
用于管理所有的MusicController并提供控制方法(以下代码示例)
using System.Collections;
namespace Web_Music_Controller_Base;
public class MusicController : IEnumerable<KeyValuePair<string, MusicPlayer>>
{
private Dictionary<string, MusicPlayer> musicPlayers = new ();
public MusicPlayer this[string musicName]
{
get => GetMusicPlayer(musicName);
}
public int GetCount()
{
return musicPlayers.Count;
}
public void RemoveMusicPlayer(String musicName)
{
musicPlayers.Remove(musicName);
}
public MusicController()
{
}
public bool exist(String musicName)
{
return musicPlayers.ContainsKey(musicName);
}
public void AddMusicPlayer(string musicName, MusicPlayer musicPlayer)
{
if (musicPlayers.ContainsKey(musicName))
{
throw new Exception("音乐已存在");
}
musicPlayers.Add(musicName, musicPlayer);
}
public MusicPlayer GetMusicPlayer(string musicName)
{
if (!musicPlayers.ContainsKey(musicName))
{
throw new Exception("音乐不存在");
}
return musicPlayers[musicName];
}
public IEnumerator<KeyValuePair<string, MusicPlayer>> GetEnumerator()
{
return musicPlayers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
