C#實現簡單音樂文件解析播放——Windows程序設計作業2

1. 作業內容

????編寫一個C#程序,要求實現常見音樂文件的播放功能,具體要求如下:
????1). 播放MP3文件: 程序應能夠讀取MP3文件,并播放其中的音頻。
????2). 播放OGG文件: 應能夠播放ogg文件。
????3). 用戶界面: 一個簡單的窗口,包含播放和暫停按鈕以及文件選擇功能。
????4). 異常處理: 程序應能夠處理可能出現的異常,如文件不存在、文件讀取錯誤等。
????5). 兼容性: 確保代碼在多個C#版本上均可運行。

2. 設計思路分析與難點

2.1 架構選擇

????考慮到需求中的界面友好和跨版本兼容性,我們可以選擇選擇Windows Forms作為開發平臺,Windows Forms提供了一個簡單而強大的方法來創建桌面應用程序,并且與C#高度兼容,在開發過程,我們選擇.NETFramework 4.8.0進行程序設計。

2.2 設計思路

????1). 界面設計: 使用Windows Forms工具箱中的控件如按鈕、標簽和文件對話框構建用戶界面。
????2). 功能編碼: 使用OpenFileDialog允許用戶選擇音頻文件。 根據文件擴展名調用相應的播放器對象進行播放。 播放控制,包括開始、暫停和停止。
????3). 異常處理: 捕獲并響應各種可能的運行時錯誤,如文件讀取失敗、文件格式不支持等,為用戶提供清晰的錯誤信息。

2.3 難點分析

????1). 文件格式支持: 處理多種音頻格式(MP3,OGG等)要求使用不同的庫,這可能導致代碼復雜度增加。
????2). 異常處理: 音頻文件的播放中可能遇到多種異常情況,如文件損壞、編解碼器不支持等。

3. 窗體設計

????按照需求和功能分析,實現窗體如下:
窗體設計
????其中,各控件實現功能如下:
????Label:展示當前播放的歌曲。
????ListBox:展示選擇的歌曲列表。
????AxWindowsMediaPlayer:用于播放常規格式音樂(ogg無法用此播放)。
????OpenFileDialog:用于選擇音樂文件。
????Button:用于選擇歌曲文件、停止播放、下一曲的功能實現。
????TrackBarl:用于音量控制。

4. 代碼實現

4.0 類成員變量定義

List<string> localmusiclist = new List<string> { };
private WaveOutEvent waveOut = new WaveOutEvent();
private VorbisWaveReader currentVorbisReader;

????在類中,我們需要定義類成員變量,localmusiclist在音樂播放應用中用來追蹤和管理用戶加載的音樂文件集合,waveOut用于播放ogg文件,currentVorbisReader為當前使用的ogg文件實例。

4.1 文件選擇功能

????函數定義:

private void button1_Click(object sender, EventArgs e)
{//功能實現見下方
}

????具體實現:

string[] files = { };openFileDialog1.Filter = "選擇音頻|*.mp3;*.flac;*.wav;*.ogg";
//同時打開多個文件
openFileDialog1.Multiselect = true;

????在這部分,我們采用buttonopenFileDialog控件來實現文件的選擇,Filter用于篩選文件類型,使得用戶只能選擇音樂文件,不能選擇其他文件導致后續功能無法實現報錯,同時初始化一個files文件存放音樂文件的文件名。

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){listBox1.Items.Add(file);localmusiclist.Add(file);}
}

????這里我們對選擇的文件進行處理,首先,將所有變量清空,防止有殘留影響后續程序執行,之后,將文件名添加到ListBox中,顯示出來用于選擇音樂,同時,利用localmusiclist變量存儲文件名,并且作為類成員變量進行傳輸,方便后續對音樂的操作。

openFileDialog1.ShowDialog() == DialogResult.OK

????其中,if條件判斷openFileDialog是否接收到文件,不然不執行后續程序。

4.2 列表顯示功能

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]);}
}

????在ListBox控件中,存在一個事件監聽SelectedIndexChanged,利用該事件,我們可以去獲取用戶切換列表,SelectedIndex是獲取目前列表中選擇的序號,通過該序號和之前的localmusiclist,我們可以獲取到音樂信息并且進行傳參調用函數,進行后續的音樂播放。
ListBox中的列表信息
????同時,將Label的內容設置為音樂文件的信息并展示。
Label信息展示

4.3 音樂選擇功能

????函數定義:

private void musicplay(string filename)
{//功能實現見下方
}

????具體實現:

string extension = Path.GetExtension(filename).ToLower();

????首先,獲取當前文件名的后綴信息,判斷文件類型。

if (extension == ".ogg")
{if (currentVorbisReader != null){// 確保先停止當前播放再釋放資源if (waveOut.PlaybackState != PlaybackState.Stopped){waveOut.Stop();}currentVorbisReader.Dispose();}currentVorbisReader = new VorbisWaveReader(filename);waveOut.Init(currentVorbisReader);waveOut.Play();
}

????針對不同的文件類型,采用不同的處理方式:若是ogg文件,調用NAudio第三方庫總的VorbisWave類來實現播放音樂。
????在播放新的音樂時,先檢測當前是否有正在進行播放或者是暫停播放的ogg音樂,先進行處理再播放當前歌曲,可以防止同時初始化兩次WaveOut產生播放異常。

else
{axWindowsMediaPlayer1.URL = filename;axWindowsMediaPlayer1.Ctlcontrols.play();
}

????若是其他類型的文件,使用C#原生庫中的WindowsMediaPlayer控件實現播放。

4.4 暫停播放

private void button2_Click(object sender, EventArgs e)
{if (waveOut.PlaybackState == PlaybackState.Playing){waveOut.Pause(); // 暫停播放OGG}axWindowsMediaPlayer1.Ctlcontrols.stop(); // 停止其他格式的播放
}

????音樂暫停功能也需要先區分類型,如果waveOut的播放狀態為正在播放,調用函數暫停音樂,否則就是調用WindowsMediaPlayer的暫停函數。

4.5 播放下一首&&循環播放

????函數定義:

private void button3_Click(object sender, EventArgs e)
{//功能實現見下方
}

????具體實現:

if(localmusiclist.Count > 0)
{//記錄下一首音樂的索引int index = (listBox1.SelectedIndex + 1);axWindowsMediaPlayer1.URL = localmusiclist[index];musicplay(axWindowsMediaPlayer1.URL);label1.Text = Path.GetFileNameWithoutExtension(localmusiclist[index]);listBox1.SelectedIndex = index;
}

????這里采用索引來得到下一首音樂URL,再進行播放,同時更改Label的信息顯示與SelectedIndex的當前索引。

if (index >= localmusiclist.Count())
{index = 0;
}

????在索引大于當前音樂列表的時候,將Index重置為零,從而實現循環播放功能。

4.6 音量控制

private void trackBar1_Scroll(object sender, EventArgs e)
{axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
}

????直接將WindowsMediaPlayer的屬性和TrackBar設置的值進行關聯即可實現音樂播放事的音樂控制了。

5. 完整代碼

????代碼倉庫:hmcy-zbx的windows課程設計作業

6. 總結&改進思路

????本次作業旨在通過導入第三方庫輔助自己的程序設計與學習更復雜的控件使用和控件之間的聯系,通過本次作業,我對于C#的控件使用掌握的更加深入了。
????盡管當前程序能實現較多的音樂文件格式播放,但是不能夠實現最新的音樂文件解析,例如:ape文件與aac文件。
????并且,缺少高級音頻功能的設置,例如增加音頻效果處理(如均衡器、聲音增強等)和支持音頻流的直接下載和播放。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10344.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10344.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10344.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

阿里云Redis創建使用

說明&#xff1a;本文介紹如何使用阿里云Redis&#xff0c;包括開通、連接、使用&#xff1b; 開通 進入官網Redis產品頁&#xff0c;點擊免費試用&#xff08;白嫖&#xff09;&#xff1b; 選擇中間這個&#xff0c;云數據庫Redis版&#xff1b; 開通完成后&#xff0c;可在…

如何在Java項目中使用Spring Boot快速連接達夢數據庫(DM)

前言 在Java開發領域&#xff0c;Spring Boot憑借其簡潔快速的特性成為現代應用開發的首選框架。本文將詳細介紹如何在Spring Boot項目中整合JDBC以快速連接達夢數據庫(DM)&#xff0c;并提供一個簡單的示例來驗證連接是否成功。 一、環境準備與依賴配置 在開始之前&#xf…

零代碼平臺助力中國石化江蘇油田實現高效評價體系

概述&#xff1a; 中國石化集團江蘇石油勘探局有限公司面臨著評價體系依賴人工處理數據、計算繁瑣且容易出錯的挑戰。為解決這一問題&#xff0c;他們決定借助零代碼平臺明道云開發江蘇油田高質量發展經濟指標評價系統。該系統旨在實現原始數據批量導入與在線管理、權重及評分…

QT設計模式:建造者模式

基本概念 建造者模式是一種創建型設計模式&#xff0c;它允許你創建復雜對象的過程獨立于該對象的組成部分以及它們的組裝方式。這樣可以構造出不同的對象表示。 在建造者模式中&#xff0c;將創建對象的過程和對象的表示分離&#xff0c;通過一步步的構建&#xff0c;可以得…

FFmpeg常用API與示例(四)——過濾器實戰

1.filter 在多媒體處理中&#xff0c;filter 的意思是被編碼到輸出文件之前用來修改輸入文件內容的一個軟件工具。如&#xff1a;視頻翻轉&#xff0c;旋轉&#xff0c;縮放等。 語法&#xff1a;[input_link_label1]… filter_nameparameters [output_link_label1]… 1、視…

C++中調用python函數(VS2017+WIN10+Anaconda虛擬環境)

1.利用VS創建C空項目 step1 文件——新建——項目 step2 Visual C—— Windows桌面——Windows桌面向導 step3 選擇空項目 step4 源文件——新建項——添加 step5 Visual C——C文件&#xff08;.cpp&#xff09; 2.配置環境 Step1. 更換成Release與X64 Step2. 打開項目屬性&…

文本提取新技能:學會按行數批量提取,輕松應對各種需求

在數字化時代&#xff0c;文本處理成為我們日常生活和工作中不可或缺的一部分。無論是從網頁、文檔還是數據庫中提取信息&#xff0c;文本提取技能都顯得尤為重要。而按行數批量提取文本內容&#xff0c;更是文本處理中的一項高效且實用的技能。本文將介紹辦公提效工具如何按行…

在Spring Boot應用安裝SSL證書

目錄 前提條件 步驟一&#xff1a;下載SSL證書 步驟二&#xff1a;在Spring Boot安裝SSL證書 步驟三&#xff1a;驗證SSL證書是否安裝成功 前提條件 已通過數字證書管理服務控制臺簽發證書SSL證書綁定的域名已完成DNS解析&#xff0c;即您的域名與主機IP地址相互映射已在W…

ASP.NET學生信息管理系統

摘 要 本文介紹了在ASP.net環境下采用“自上而下地總體規劃&#xff0c;自下而上地應用開發”的策略開發一個管理信息系統的過程。通過分析某一學校學生管理的不足&#xff0c;創建了一套行之有效的計算機管理學生的方案。文章介紹了學生管理信息系統的系統分析部分&#xff0c…

微信投票源碼系統至尊版 吸粉變現功能二合一

源碼簡介 微信投票系統在營銷和社交互動中發揮著多方面的作用&#xff0c;它能夠提升用戶的參與度和品牌曝光度&#xff0c;還是一種有效的數據收集、營銷推廣和民主決策工具。 分享一款微信投票源碼系統至尊版&#xff0c;集吸粉變現功能二合一&#xff0c;全網獨家支持禮物…

已經安裝tensorflow,仍報錯No module named ‘tensorflow‘

在安裝某些python虛擬環境的教程文章中&#xff0c;經常看到有評論區說安裝了但是調用顯示無模塊&#xff0c;例如pytorch和tensorflow等等。 其實跟之前我寫過的一篇文章解決方法類似&#xff0c;就是python項目中需要應用哪個虛擬環境&#xff0c;這個項目的python解釋器就選…

企業網絡需求及適合的解決方案

近年來&#xff0c;企業網絡通信需求可謂五花八門&#xff0c;變幻莫測。它不僅為企業的生產、辦公、研發、銷售提供全面賦能&#xff0c;同時也讓企業業務規模變大成為了可能。 在當前的技術格局下&#xff0c;中大型企業常見的技術方案有很多&#xff0c;而同時也有各自不可替…

商務英語口語成人考級外語培訓之BECkao考級口語篇

在口語考試中&#xff0c;不管實際內容你能說出多少&#xff0c;但準備一些套話&#xff0c;至少還能撐撐場子你們說是不是&#xff1f; 內容闡述 描述事實 1.Im going to describe/present/explain/give you some information about... 2.Id like to say a few words about...…

德國儲能項目鋰電池儲能集裝箱突發火災:安全挑戰再引關注

2024年4月27日&#xff0c;德國尼爾莫爾商業區的一起鋰電池儲能集裝箱火災事件引起了全球關注。這起事故不僅導致兩名消防員在救援過程中受傷&#xff0c;更暴露了儲能系統在安全領域亟待解決的重要問題。 根據德國消防隊的出警記錄&#xff0c;火災發生在晚上9點前不久。消防人…

機器學習算法應用——神經網絡回歸任務、神經網絡分類任務

神經網絡回歸任務&#xff08;4-3&#xff09; 神經網絡回歸任務&#xff0c;通常指的是使用神經網絡模型進行回歸分析。回歸分析是一種統計學方法&#xff0c;用于研究一個或多個自變量&#xff08;預測變量&#xff09;與一個因變量&#xff08;響應變量&#xff09;之間的關…

漲薪技術 —— 搞定Appium工作中常見應用操作!

前言 Appium 是一個開源、跨平臺的自動化測試工具&#xff0c;用于測試原生和輕量移動應用&#xff0c;支持 iOS, Android 和 FirefoxOS 平臺。此工具在測試工作中也較長用到&#xff0c;接下來給大家介紹日常中的操作。 1、應用操作 1.1獲取應用的包名和界面名 當我們從一…

日報表定時任務優化歷程

報表需求背景 報表是一個很常見的需求&#xff0c;在項目中后期往往會需要加多種維度的一些統計信息&#xff0c;今天就來談談上線近10個月后的一次報表優化優化之路&#xff08;從一天報表跑需要五分鐘&#xff0c;優化至秒級&#xff09; 需求&#xff1a;對代理商進行日統計…

基礎I/O:文件系統調用接口

文章目錄 文件系統調用接口open系統調用接口和C語言封裝文件描述符fd重定向 文件系統調用接口 open NAME//打開、創建 - 打開并可能創建文件或設備open, creat - open and possibly create a file or deviceSYNOPSIS#include <sys/types.h>#include <sys/stat.h>…

【C++算法】隊列相關經典算法題

1. N叉樹的層序遍歷 首先我們遇到這個題目&#xff0c;沒有任何思路&#xff0c;我們就可以來模擬一下層序的流程&#xff0c;首先我們肯定是訪問根節點1&#xff0c;訪問之后呢就是訪問下一層的最左節點3&#xff0c;此時第一層的節點1已經訪問過了就可以不要了&#xff0c;然…

[GESP樣題 四級] 填幻方和幸運數

B3940 [GESP樣題 四級] 填幻方 題目 在一個NN 的正方形網格中&#xff0c;每個格子分別填上從 1 到 NN 的正整數&#xff0c;使得正方形中任一行、任一列及對角線的幾個數之和都相等&#xff0c;則這種正方形圖案就稱為“幻方”&#xff08;輸出樣例中展示了一個33 的幻方&am…