欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于C#實現(xiàn)簡單的音樂播放器

 更新時間:2024年05月09日 14:13:09   作者:不會寫前端的小魚  
這篇文章主要介紹了如何基于C#實現(xiàn)簡單的音樂播放器,考慮到需求中的界面友好和跨版本兼容性,我們可以選擇選擇Windows Forms作為開發(fā)平臺,Windows Forms提供了一個簡單而強大的方法來創(chuàng)建桌面應(yīng)用程序,文中通過代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下

一、功能需求

  • 播放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#實現(xiàn)萬物皆可排序的隊列方法詳解

    C#實現(xiàn)萬物皆可排序的隊列方法詳解

    本文詳細(xì)講解了C#實現(xiàn)萬物皆可排序隊列的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C#的Socket實現(xiàn)UDP協(xié)議通信示例代碼

    C#的Socket實現(xiàn)UDP協(xié)議通信示例代碼

    本篇文章主要介紹了C#的Socket實現(xiàn)UDP協(xié)議通信示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Unity使用攝像機實現(xiàn)望遠鏡效果

    Unity使用攝像機實現(xiàn)望遠鏡效果

    這篇文章主要為大家詳細(xì)介紹了Unity攝使用像機實現(xiàn)望遠鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • c# winform異步不卡界面的實現(xiàn)方法

    c# winform異步不卡界面的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于c# winform異步不卡界面的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 解析C#網(wǎng)絡(luò)編程中的Http請求

    解析C#網(wǎng)絡(luò)編程中的Http請求

    這篇文章主要介紹了C#網(wǎng)絡(luò)編程中的Http請求,不過這次也使我對C#網(wǎng)絡(luò)編程了解的更多,算是一次學(xué)習(xí)經(jīng)歷吧,文章結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • C#身份證驗證小例子

    C#身份證驗證小例子

    C#身份證驗證小例子,需要的朋友可以參考一下
    2013-04-04
  • C#最小二乘法擬合曲線成直線的實例

    C#最小二乘法擬合曲線成直線的實例

    這篇文章主要介紹了C#最小二乘法擬合曲線成直線的實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C#使用泛型隊列Queue實現(xiàn)生產(chǎn)消費模式

    C#使用泛型隊列Queue實現(xiàn)生產(chǎn)消費模式

    這篇文章介紹了C#使用泛型隊列Queue實現(xiàn)生產(chǎn)消費模式的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • C#同步和異步調(diào)用方法實例

    C#同步和異步調(diào)用方法實例

    c#同步和異步很簡單,這里給大家提供一個小例子供大家參考
    2013-11-11
  • C#實現(xiàn)多文件壓縮與解壓功能

    C#實現(xiàn)多文件壓縮與解壓功能

    這篇文章主要為大家詳細(xì)介紹了如何利用C#語言實現(xiàn)多文件壓縮與解壓功能,即選擇多個文件壓縮成ZIP文件和解壓ZIP文件,需要的可以參考一下
    2022-08-08

最新評論