基于C#實現(xiàn)簡單的音樂播放器
一、功能需求
- 播放
MP3
文件:可播放MP3文件 - 播放
OGG
文件:可播放OGG文件 - 用戶界面:一個簡單的窗口,包含播放和暫停按鈕及文件選擇功能
- 異常處理:程序能處理可能處理可能出現(xiàn)的異常,如文件不存在、文件讀取錯誤等
- 兼容性:確保代碼能在多個c#版本上運行
二、設(shè)計思路分析
架構(gòu)選擇
考慮到需求中的界面友好和跨版本兼容性,我們可以選擇選擇
Windows Forms
作為開發(fā)平臺,Windows Forms
提供了一個簡單而強大的方法來創(chuàng)建桌面應(yīng)用程序,并且與C#高度兼容,在開發(fā)過程,我們選擇.NETFramework 4.8.0進行程序設(shè)計。設(shè)計思路
界面設(shè)計: 使用
Windows Forms
工具箱中的控件如按鈕、標(biāo)簽和文件對話框構(gòu)建用戶界面。功能編碼: 使用
OpenFileDialog
允許用戶選擇音頻文件。 根據(jù)文件擴展名調(diào)用相應(yīng)的播放器對象進行播放。 播放控制,包括開始、暫停和停止。異常處理: 捕獲并響應(yīng)各種可能的運行時錯誤,如文件讀取失敗、文件格式不支持等,為用戶提供清晰的錯誤信息。
難點分析
文件格式支持: 處理多種音頻格式(
MP3
,OGG
等)要求使用不同的庫,這可能導(dǎo)致代碼復(fù)雜度增加。異常處理: 音頻文件的播放中可能遇到多種異常情況,如文件損壞、編解碼器不支持等。
三、窗體設(shè)計
按照需求設(shè)計窗體,并進行一定的美化
- Label:展示當(dāng)前播放的歌曲
- Listbox:展示歌曲列表
- AxWindowsMediaPlayer:播放常規(guī)音樂
- Button:選擇歌曲文件、停止播放、下一曲
- TraceBarl:用于音量控制
四、代碼實現(xiàn)
頭文件引入
using AxWMPLib; using NAudio.Vorbis; using NAudio.Wave; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement;
類成員變量定義
List<string> localmusiclist = new List<string> { }; private WaveOutEvent waveOut = new WaveOutEvent(); private VorbisWaveReader currentVorbisReader;
在類中,
localmusiclist
在音樂播放時用來追蹤和管理用戶加載的音樂文件集合,waveOut
用于播放ogg
文件,currentVorbisReader
為當(dāng)前播放ogg
文件的狀態(tài)
按鈕控件
歌曲文件選擇
private void button1_Click(object sender, EventArgs e) { string[] files = { }; openFileDialog1.Filter = "選擇音頻|*.mp3;*.flac;*.wav;*.ogg"; //同時打開多個文件 openFileDialog1.Multiselect = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { //清空原有列表 listBox1.Items.Clear(); localmusiclist.Clear(); if (files != null) { Array.Clear(files, 0, files.Length); } files = openFileDialog1.FileNames; string[] array = files; foreach (string file in array) { string extension = Path.GetExtension(file).ToLower(); if (extension == ".mp3" || extension == ".flac" || extension == ".wav" || extension == ".ogg") { listBox1.Items.Add(file); localmusiclist.Add(file); } else { MessageBox.Show($"不支持的文件格式:{file}", "文件錯誤", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } }
這里我們通過
Filter
方法來限制用戶選擇的音樂文件,防止后續(xù)播放功能報錯,并在選擇文件之后將選擇的音樂列表放置到ListBox
中,同時邏輯判斷刪除已有的列表,并將歌曲播放列表放入localmusiclist
中,再通過openFileDialog來判斷文件是否讀取成功。
暫停播放按鈕
private void button2_Click(object sender, EventArgs e) { if (waveOut.PlaybackState == PlaybackState.Playing) { waveOut.Pause(); // 暫停播放OGG } axWindowsMediaPlayer1.Ctlcontrols.stop(); // 停止其他格式的播放 }
用
if
條件判斷,如果在播放ogg就停止播放ogg,如果播放的是普通文件就停止普通播放器就行
播放下一首按鈕
private void button3_Click(object sender, EventArgs e) { if (localmusiclist.Count > 0) { int index = (listBox1.SelectedIndex + 1); if (index >= localmusiclist.Count()) { index = 0; } axWindowsMediaPlayer1.URL = localmusiclist[index]; musicplay(axWindowsMediaPlayer1.URL); label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]); listBox1.SelectedIndex = index; } }
判斷
Count
是否大于0,以此來判斷是否能執(zhí)行下一首播放的邏輯,如果index
大于localmusiclist
的長度,就將index
置0,以此來循環(huán)播放列表,在播放時調(diào)用musicplay
函數(shù)來播放音樂,同時用Label
來顯示當(dāng)前播放音樂的信息。
音樂選擇控件
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (localmusiclist.Count > 0) { axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex]; musicplay(axWindowsMediaPlayer1.URL); label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]); } }
當(dāng)listBox1中的音樂選擇發(fā)生改變時,會觸發(fā)該事件函數(shù),若localmusiclist.Count > 0,就用musicplay播放選擇中的音樂,并更新label1的值
音樂播放函數(shù)
private void musicplay(string filename) { string extension = Path.GetExtension(filename).ToLower(); try { if (extension == ".ogg") { if (currentVorbisReader != null) { // 確保先停止當(dāng)前播放再釋放資源 if (waveOut.PlaybackState != PlaybackState.Stopped) { waveOut.Stop(); } currentVorbisReader.Dispose(); } currentVorbisReader = new VorbisWaveReader(filename); waveOut.Init(currentVorbisReader); waveOut.Play(); } else { if (currentVorbisReader != null) { // 確保先停止當(dāng)前播放再釋放資源 if (waveOut.PlaybackState != PlaybackState.Stopped) { waveOut.Stop(); } currentVorbisReader.Dispose(); } axWindowsMediaPlayer1.URL = filename; axWindowsMediaPlayer1.Ctlcontrols.play(); } } catch (Exception ex) { MessageBox.Show($"無法播放文件:{filename}\n\n錯誤信息:{ex.Message}", "播放錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
首先獲取文件后綴名,然后判斷后綴名是否為ogg,若為普通文件,則用c#自帶的內(nèi)置播放器即可完成播放,否則則需要下載安裝NAudio的第三方庫中的Vorbis和Wave類來實現(xiàn)播放音樂,在播放時要檢查是否正在播放ogg音樂,若是則停止播放當(dāng)前音樂再播放其他音樂,同時這里使用try捕獲播放錯誤來防止讀取文件產(chǎn)生的錯誤導(dǎo)致程序卡死。
音量控制組件
private void trackBar1_Scroll(object sender, EventArgs e) { axWindowsMediaPlayer1.settings.volume = trackBar1.Value; }
這里將axWindowsMediaPlayer1的按鈕聯(lián)動到traceBar1上,實現(xiàn)用traceBar1來控制音量。
五、完整代碼
```c# using AxWMPLib; using NAudio.Vorbis; using NAudio.Wave; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace _4._23上課code { public partial class Form1 : Form { List<string> localmusiclist = new List<string> { }; private WaveOutEvent waveOut = new WaveOutEvent(); private VorbisWaveReader currentVorbisReader; public Form1() { InitializeComponent(); } private void musicplay(string filename) { string extension = Path.GetExtension(filename).ToLower(); try { if (extension == ".ogg") { if (currentVorbisReader != null) { // 確保先停止當(dāng)前播放再釋放資源 if (waveOut.PlaybackState != PlaybackState.Stopped) { waveOut.Stop(); } currentVorbisReader.Dispose(); } currentVorbisReader = new VorbisWaveReader(filename); waveOut.Init(currentVorbisReader); waveOut.Play(); } else { if (currentVorbisReader != null) { // 確保先停止當(dāng)前播放再釋放資源 if (waveOut.PlaybackState != PlaybackState.Stopped) { waveOut.Stop(); } currentVorbisReader.Dispose(); } axWindowsMediaPlayer1.URL = filename; axWindowsMediaPlayer1.Ctlcontrols.play(); } } catch (Exception ex) { MessageBox.Show($"無法播放文件:{filename}\n\n錯誤信息:{ex.Message}", "播放錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { string[] files = { }; openFileDialog1.Filter = "選擇音頻|*.mp3;*.flac;*.wav;*.ogg"; //同時打開多個文件 openFileDialog1.Multiselect = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { //清空原有列表 listBox1.Items.Clear(); localmusiclist.Clear(); if (files != null) { Array.Clear(files, 0, files.Length); } files = openFileDialog1.FileNames; string[] array = files; foreach (string file in array) { string extension = Path.GetExtension(file).ToLower(); if (extension == ".mp3" || extension == ".flac" || extension == ".wav" || extension == ".ogg") { listBox1.Items.Add(file); localmusiclist.Add(file); } else { MessageBox.Show($"不支持的文件格式:{file}", "文件錯誤", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (localmusiclist.Count > 0) { axWindowsMediaPlayer1.URL = localmusiclist[listBox1.SelectedIndex]; musicplay(axWindowsMediaPlayer1.URL); label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[listBox1.SelectedIndex]); } } private void trackBar1_Scroll(object sender, EventArgs e) { axWindowsMediaPlayer1.settings.volume = trackBar1.Value; } private void button2_Click(object sender, EventArgs e) { if (waveOut.PlaybackState == PlaybackState.Playing) { waveOut.Pause(); // 暫停播放OGG } axWindowsMediaPlayer1.Ctlcontrols.stop(); // 停止其他格式的播放 } private void button3_Click(object sender, EventArgs e) { if (localmusiclist.Count > 0) { int index = (listBox1.SelectedIndex + 1); if (index >= localmusiclist.Count()) { index = 0; } axWindowsMediaPlayer1.URL = localmusiclist[index]; musicplay(axWindowsMediaPlayer1.URL); label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]); listBox1.SelectedIndex = index; } } private void Form1_Load(object sender, EventArgs e) { } } } ```
六、總結(jié)
以上就是基于C#實現(xiàn)簡單的音樂播放器的詳細(xì)內(nèi)容,更多關(guān)于C#音樂播放器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#的Socket實現(xiàn)UDP協(xié)議通信示例代碼
本篇文章主要介紹了C#的Socket實現(xiàn)UDP協(xié)議通信示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01C#使用泛型隊列Queue實現(xiàn)生產(chǎn)消費模式
這篇文章介紹了C#使用泛型隊列Queue實現(xiàn)生產(chǎn)消費模式的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10