C# 音頻操作系統項目總結
此項目需求是針對.wav格式音頻進行操作,轉換成相應的.mp3格式的音頻文件,對音頻進行切割,最后以需求的形式輸出,此篇會回顧運用到的一些知識點。
1.MDI子窗口的建立:
首先一個窗體能夠創建多個MDI窗體,應當將IsMDIContainer屬性設為true;以下為效果圖:
控制窗體切換的是一個DotNetBar.TabStrip控件,style屬性為Office2007Document,TabLayOutType:FixedWithNavigationBox
創建窗體的代碼如下:
////// 創建MDI子窗體類 /// class CreateMDIWindow { ////// 當前程序的主窗體對象 /// public static Form MainForm { get; set; } ////// 創建子窗口 /// ///窗口類型 public static void CreateChildWindow() where T : Form, new() // where 子句還可以包括構造函數約束。 可以使用 new 運算符創建類型參數的實例;但類型參數為此必須受構造函數約束 // new() 的約束。 new() 約束可以讓編譯器知道:提供的任何類型參數都必須具有可訪問的無參數(或默認)構造函數。 { T form = null; var childForms = MainForm.MdiChildren; //遍歷窗體 foreach (Form f in childForms) { if (f is T) { form = f as T; break; } } //如果沒有,則創建 if (form == null) { //新建窗體 form = new T(); //設定窗體的圖標 form.Icon = System.Drawing.Icon.FromHandle(Properties.Resources.MainIcon.GetHicon()); //設定窗體的主圖標 form.MdiParent = MainForm; //設定窗體的邊框類型 form.FormBorderStyle = FormBorderStyle.FixedToolWindow; } //窗口如何顯示 form.WindowState = FormWindowState.Maximized; form.Show(); } }
前臺點擊按鈕調用代碼:CreateMDIWindow.CreateChildWindow
2.序列化與反序列化:
當一個系統你有默認的工作目錄,默認的文件保存路徑,且這些數據時唯一的,你希望每次打開軟件都會顯示這些數據,也可以更新這些數據,可以使用序列化與反序列化。
我們以項目存儲根目錄和選擇項目為例:
代碼如下:
[Serializable] public class UserSetting { ////// 序列化存儲路徑 /// private string FilePath{ get { return Path.Combine(Environment.CurrentDirectory, "User.data"); } } ////// 音頻資源存儲目錄 /// public string AudioResourceFolder { get; set; } ////// 項目名稱 /// public string Solution { get; set; } ////// 構造函數,創建序列化存儲文件 /// public UserSetting() { if (!File.Exists(FilePath)) { FileStream fs = File.Create(FilePath); fs.Close();//不關閉文件流,首次創建該文件后不能被使用買現成會被占用 } } ////// 通過反序列化方法,獲得保存的數據 /// public UserSetting ReadUserSetting() { using (FileStream fs = new FileStream(FilePath, FileMode.Open,FileAccess.Read)) { object ob = null; if (fs.Length > 0) { SoapFormatter sf = new SoapFormatter(); ob = sf.Deserialize(fs); } return ob as UserSetting; } } ////// 通過序列化方式,保存數據 /// public void SaveUserSetting(object obj) { using (FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write)) { SoapFormatter sf = new SoapFormatter(); sf.Serialize(fs,obj); } } }
3.Datagridview動態生成:
根據設置的樓層生成相應樓層帶button按鈕的datagridview,并且每層按鈕為每層選定選擇音樂,代碼如下:
///選擇音樂按鈕事件:/// 綁定樓層音樂屬性 /// private void BindData(int elevatorLow,int number) { try { DataTable list = new DataTable(); list.Columns.Clear(); list.Columns.Add(new DataColumn("name", typeof(string))); list.Columns.Add(new DataColumn("musicPath", typeof(string))); for (int i =0; i < number; i++) { //不包括樓層0層 if (elevatorLow != 0) { list.Rows.Add(list.NewRow()); list.Rows[i][0] = elevatorLow; } else { i--; } elevatorLow++; } dataGridViewX1.DataSource = list; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
private void dataGridViewX1_CellContentClick(object sender, DataGridViewCellEventArgs e) { try { //點擊選擇按鈕觸發的事件 if (e.RowIndex >= 0) { DataGridViewColumn column = dataGridViewX1.Columns[e.ColumnIndex]; if (column is DataGridViewButtonColumn) { OpenFileDialog openMusic = new OpenFileDialog(); openMusic.AddExtension = true; openMusic.Multiselect = true; openMusic.Filter = "MP3文件(*.mp3)|*mp3"; if (openMusic.ShowDialog() == DialogResult.OK) { dataGridViewX1.Rows[e.RowIndex].Cells[2].Value = Path.GetFileName(openMusic.FileName); } } } } catch(Exception ex) { MessageBox.Show(ex.ToString()); } }4.獲得音樂文件屬性:
使用Shellclass獲得文件屬性可以參考 點擊打開鏈接
代碼如下:
////// 獲得音樂長度 /// /// 文件的完整路徑 public static string[] GetMP3Time(string filePath) { string dirName = Path.GetDirectoryName(filePath); string SongName = Path.GetFileName(filePath);//獲得歌曲名稱 ShellClass sh = new ShellClass(); Folder dir = sh.NameSpace(dirName); FolderItem item = dir.ParseName(SongName); string SongTime = dir.GetDetailsOf(item, 27);//27為獲得歌曲持續時間 ,28為獲得音樂速率,1為獲得音樂文件大小 string[] time = Regex.Split(SongTime, ":"); return time; }
5.音頻操作:
音頻的操作用的fmpeg.exe ,下載地址
fmpeg放在bin目錄下,代碼如下:///音頻轉換的代碼如下:/// 轉換函數 /// /// ffmpeg程序 /// 執行參數 public static void ExcuteProcess(string exe, string arg) { using (var p = new Process()) { p.StartInfo.FileName = exe; p.StartInfo.Arguments = arg; p.StartInfo.UseShellExecute = false; //輸出信息重定向 p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.RedirectStandardOutput = true; p.Start(); //啟動線程 p.BeginOutputReadLine(); p.BeginErrorReadLine(); p.WaitForExit();//等待進程結束 } }
private void btnConvert_Click(object sender, EventArgs e) { //轉換MP3 if (txtMp3Music.Text != "") { string fromMusic = Statics.Setting.AudioResourceFolder + "\\" + Statics.Setting.Solution+"\\" + cobFolders.Text + "\\" + txtMusic.Text;//轉換音樂路徑 string toMusic = Statics.Setting.AudioResourceFolder + "\\" + Statics.Setting.Solution+"\\" + cobFolders.Text + "\\" + txtMp3Music.Text;//轉換后音樂路徑 int bitrate = Convert.ToInt32(cobBitRate.Text) * 1000;//恒定碼率 string Hz = cobHz.Text;//采樣頻率 try { MP3Convertion.ExcuteProcess("ffmpeg.exe", "-y -ab " + bitrate + " -ar " + Hz + " -i \"" + fromMusic + "\" \"" + toMusic + "\""); if (cbRetain.Checked == false) { File.Delete(fromMusic); BindList(); } else { foreach (ListViewItem lt in listMusics.Items) { if (lt.Text == txtMusic.Text) { listMusics.Items.Remove(lt); } } } //轉換完成 MessageBox.Show("轉換完成"); txtMusic.Text = ""; txtMp3Music.Text = ""; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } else { MessageBox.Show("請選擇你要轉換的音樂"); } }音頻切割的代碼如下:
private void btnCut_Click(object sender, EventArgs e) { SaveFileDialog saveMusic = new SaveFileDialog(); saveMusic.Title = "選擇音樂文件存放的位置"; saveMusic.DefaultExt = ".mp3"; saveMusic.InitialDirectory = Statics.Setting.AudioResourceFolder +"\\" + Statics.Setting.Solution+"\\" + cobFolders.Text; string fromPath = Statics.Setting.AudioResourceFolder + "\\" + Statics.Setting.Solution +"\\"+ cobFolders.Text + "\\" + txtMusic.Text;//要切割音樂的物理路徑 string startTime = string.Format("0:{0}:{1}", txtBeginM.Text, txtBeginS.Text).Trim();//歌曲起始時間 int duration = (Convert.ToInt32(this.txtEndM.Text) * 60 + Convert.ToInt32(this.txtEndS.Text)) - (Convert.ToInt32(this.txtBeginM.Text) * 60 + Convert.ToInt32(this.txtBeginS.Text)); string endTime = string.Format("0:{0}:{1}", duration / 60, duration % 60);//endTime是持續的時間,不是歌曲結束的時間 if (saveMusic.ShowDialog() == DialogResult.OK) { string savePath = saveMusic.FileName;//切割后音樂保存的物理路徑 try { MP3Convertion.ExcuteProcess("ffmpeg.exe", "-y -i \"" + fromPath + "\" -ss " + startTime + " -t " + endTime + " -acodec copy \"" + savePath+"\"");//-acodec copy表示歌曲的碼率和采樣頻率均與前者相同 MessageBox.Show("已切割完成"); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } }切割音頻操作系統的知識點就總結道這了,就是fmpeg的應用。
轉自:http://blog.csdn.net/kaoleba126com/article/details/7570745
本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!