技術選型對比
| 方案 | 優點 | 缺點 | 適用場景 |
| NAudio (C#) | 純托管、格式豐富、支持特效 | 學習曲線較陡 | 專業音頻應用 |
| Windows Media Player COM | 系統內置、兼容性好、API簡單 | 依賴WMP、格式受限 | 簡單播放器 |
| DirectSound/XAudio2 (C++) | 底層控制、延遲低、性能強 | 開發複雜、需C++基礎 | 遊戲/專業音頻 |
| MediaElement (WPF) | XAML整合、硬件加速 | 僅限WPF項目 | WPF應用 |
推薦方案:C# + NAudio 實現核心功能
核心代碼結構
using NAudio.Wave;
public class MusicPlayer {
private IWavePlayer waveOut;
private AudioFileReader audioFile;
public void Load(string filePath) {
Stop();
audioFile = new AudioFileReader(filePath);
waveOut = new WaveOutEvent();
waveOut.Init(audioFile);
}
public void Play() => waveOut?.Play();
public void Pause() => waveOut?.Pause();
public void Stop() {
waveOut?.Stop();
audioFile?.Dispose();
waveOut?.Dispose();
}
public void SetPosition(double percent) {
if (audioFile != null) {
long position = (long)(audioFile.Length * percent);
audioFile.Position = position - (position % audioFile.WaveFormat.BlockAlign);
}
}
public TimeSpan CurrentTime => audioFile?.CurrentTime ?? TimeSpan.Zero;
public TimeSpan TotalTime => audioFile?.TotalTime ?? TimeSpan.Zero;
}
格式轉換功能
public void ConvertFormat(string inputPath, string outputPath, WaveFormat targetFormat) {
using (var reader = new AudioFileReader(inputPath))
using (var converter = new MediaFoundationResampler(reader, targetFormat)) {
WaveFileWriter.CreateWaveFile(outputPath, converter);
}
}
UI界面設計要點
- 播放列表:ListView/ListBox綁定ObservableCollection
- 進度條:TrackBar + Timer定時更新 (100ms間隔)
- 音量控制:WaveOutEvent.Volume 屬性 (0.0-1.0)
- 快進/快退:SetPosition(percent) + 按鈕長按事件
- 音頻可視化:FFT頻譜數據繪製 (進階)
參考資源
避坑指南
- 釋放資源:IDisposable模式正確釋放音頻流
- 線程安全:UI操作需Invoke回主線程
- 異常處理:文件不存在/格式不支持/解碼器缺失
- 大文件:考慮異步加載避免UI凍結