此项目需求是针对.wav格式音频进行操作,转换成相应的.mp3格式的音频文件,对音频进行切割,最后以需求的形式输出,此篇会回顾运用到的一些知识点。

1.MDI子窗口的建立:

首先一个窗体能够创建多个MDI窗体,应当将IsMDIContainer属性设为true;以下为效果图:

控制窗体切换的是一个DotNetBar.TabStrip控件,style属性为Office2007Document,TabLayOutType:FixedWithNavigationBox

创建窗体的代码如下:

01 /// <summary> 
02  /// 创建MDI子窗体类 
03  /// </summary> 
04  classCreateMDIWindow 
05  
06       /// <summary> 
07      /// 当前程序的主窗体对象 
08      /// </summary> 
09      public staticForm MainForm { getset; } 
10       
11      /// <summary> 
12      /// 创建子窗口 
13      /// </summary> 
14      ///
15 <typeparam name="T">     窗口类型
16 </typeparam>      
17      public static void CreateChildWindow
18 <t>     () where T : Form, new() 
19      // where 子句还可以包括构造函数约束。 可以使用 new 运算符创建类型参数的实例;但类型参数为此必须受构造函数约束  
20      // new() 的约束。 new() 约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。            
21      
22          T form = null
23     
24          var childForms = MainForm.MdiChildren; 
25          //遍历窗体 
26          foreach (Form f inchildForms) 
27          
28              if (f isT) 
29              
30                  form = f asT; 
31                  break
32              
33          
34          //如果没有,则创建 
35          if(form == null
36          
37              //新建窗体 
38              form = newT(); 
39              //设定窗体的图标 
40              form.Icon = System.Drawing.Icon.FromHandle(Properties.Resources.MainIcon.GetHicon()); 
41              //设定窗体的主图标 
42              form.MdiParent = MainForm; 
43              //设定窗体的边框类型 
44              form.FormBorderStyle = FormBorderStyle.FixedToolWindow; 
45          
46          //窗口如何显示 
47          form.WindowState = FormWindowState.Maximized; 
48          form.Show(); 
49      
50  
51 </t>

前台点击按钮调用代码:CreateMDIWindow.CreateChildWindow ();  <>里为窗体的名称。

2.序列化与反序列化:

当一个系统你有默认的工作目录,默认的文件保存路径,且这些数据时唯一的,你希望每次打开软件都会显示这些数据,也可以更新这些数据,可以使用序列化与反序列化。

我们以项目存储根目录和选择项目为例:

代码如下:

01 [Serializable] 
02 public  classUserSetting 
03
04     /// <summary> 
05     /// 序列化存储路径 
06     /// </summary> 
07     private string FilePath{ get returnPath.Combine(Environment.CurrentDirectory, "User.data"); } } 
08    
09     /// <summary> 
10     /// 音频资源存储目录 
11     /// </summary> 
12     public  stringAudioResourceFolder { getset; } 
13    
14     /// <summary> 
15     /// 项目名称 
16     /// </summary> 
17     public stringSolution { getset; } 
18    
19     /// <summary> 
20     /// 构造函数,创建序列化存储文件 
21     /// </summary> 
22     publicUserSetting() 
23     
24         if(!File.Exists(FilePath)) 
25         
26             FileStream fs = File.Create(FilePath); 
27             fs.Close();//不关闭文件流,首次创建该文件后不能被使用买现成会被占用 
28         }       
29     
30    
31     /// <summary> 
32     /// 通过反序列化方法,获得保存的数据 
33     /// </summary>       
34     publicUserSetting ReadUserSetting()        
35     
36         using (FileStream fs = newFileStream(FilePath, FileMode.Open,FileAccess.Read)) 
37         
38             objectob = null
39             if(fs.Length > 0) 
40             
41                 SoapFormatter sf = newSoapFormatter(); 
42                 ob = sf.Deserialize(fs);                   
43             
44             return ob asUserSetting; 
45         
46     
47    
48     /// <summary> 
49     /// 通过序列化方式,保存数据 
50     /// </summary>       
51     public void SaveUserSetting(objectobj) 
52     
53         using (FileStream fs = newFileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write)) 
54         
55             SoapFormatter sf = newSoapFormatter(); 
56             sf.Serialize(fs,obj); 
57         
58     
59        
60 }

3.Datagridview动态生成:

根据设置的楼层生成相应楼层带button按钮的datagridview,并且每层按钮为每层选定选择音乐,代码如下:

01 /// <summary> 
02 /// 绑定楼层音乐属性 
03 /// </summary> 
04 private void BindData(int elevatorLow,intnumber) 
05
06     try 
07     
08         DataTable list = newDataTable(); 
09         list.Columns.Clear(); 
10         list.Columns.Add(newDataColumn("name"typeof(string))); 
11         list.Columns.Add(newDataColumn("musicPath"typeof(string)));              
12         for (inti =0; i < number; i++) 
13         
14             //不包括楼层0层 
15             if(elevatorLow != 0) 
16             
17                 list.Rows.Add(list.NewRow()); 
18                 list.Rows[i][0] = elevatorLow; 
19             
20             else{ i--; } 
21             elevatorLow++; 
22         
23         dataGridViewX1.DataSource = list; 
24     
25     catch(Exception ex) 
26     { MessageBox.Show(ex.ToString()); } 
27 }

选择音乐按钮事件:

01 private void dataGridViewX1_CellContentClick(objectsender, DataGridViewCellEventArgs e) 
02
03     try 
04     {          
05         //点击选择按钮触发的事件 
06         if(e.RowIndex >= 0) 
07         
08             DataGridViewColumn column = dataGridViewX1.Columns[e.ColumnIndex]; 
09             if (column isDataGridViewButtonColumn) 
10             
11                 OpenFileDialog openMusic = newOpenFileDialog(); 
12                 openMusic.AddExtension = true
13                 openMusic.Multiselect = true
14                 openMusic.Filter = "MP3文件(*.mp3)|*mp3";                    
15                 if(openMusic.ShowDialog() == DialogResult.OK) 
16                 
17                     dataGridViewX1.Rows[e.RowIndex].Cells[2].Value = Path.GetFileName(openMusic.FileName);                        
18                 
19             
20         
21     
22     catch(Exception ex) 
23     { MessageBox.Show(ex.ToString()); } 
24 }

4.获得音乐文件属性:

使用Shellclass获得文件属性可以参考  点击打开链接

代码如下:

01 /// <summary> 
02 /// 获得音乐长度 
03 /// </summary> 
04 /// <param name="filePath">文件的完整路径 
05 public static string[] GetMP3Time(stringfilePath) 
06
07     stringdirName = Path.GetDirectoryName(filePath); 
08     stringSongName = Path.GetFileName(filePath);//获得歌曲名称            
09     ShellClass sh = newShellClass(); 
10     Folder dir = sh.NameSpace(dirName); 
11     FolderItem item = dir.ParseName(SongName); 
12     stringSongTime = dir.GetDetailsOf(item, 27);//27为获得歌曲持续时间 ,28为获得音乐速率,1为获得音乐文件大小     
13     string[] time = Regex.Split(SongTime, ":"); 
14     returntime; 
15 }

5.音频操作:

音频的操作用的fmpeg.exe ,下载地址

fmpeg放在bin目录下,代码如下:

01 /// <summary> 
02 /// 转换函数 
03 /// </summary> 
04 /// <param name="exe">ffmpeg程序 
05 /// <param name="arg">执行参数      
06 public static void ExcuteProcess(string exe, stringarg) 
07
08     using (var p = newProcess()) 
09     {              
10             p.StartInfo.FileName = exe; 
11             p.StartInfo.Arguments = arg; 
12             p.StartInfo.UseShellExecute = false;    //输出信息重定向 
13             p.StartInfo.CreateNoWindow = true
14             p.StartInfo.RedirectStandardError = true
15             p.StartInfo.RedirectStandardOutput = true
16             p.Start();                    //启动线程 
17             p.BeginOutputReadLine(); 
18             p.BeginErrorReadLine(); 
19             p.WaitForExit();//等待进程结束                                       
20     
21 }

音频转换的代码如下:

01 private void btnConvert_Click(objectsender, EventArgs e) 
02
03     //转换MP3 
04     if(txtMp3Music.Text != ""
05     
06         string fromMusic = Statics.Setting.AudioResourceFolder + "\\"+ Statics.Setting.Solution+"\\" + cobFolders.Text + "\\" + txtMusic.Text;//转换音乐路径 
07         string toMusic = Statics.Setting.AudioResourceFolder + "\\"+ Statics.Setting.Solution+"\\" + cobFolders.Text + "\\"+ txtMp3Music.Text;//转换后音乐路径 
08         intbitrate = Convert.ToInt32(cobBitRate.Text) * 1000;//恒定码率 
09         stringHz = cobHz.Text;//采样频率 
10    
11         try 
12         
13             MP3Convertion.ExcuteProcess("ffmpeg.exe""-y -ab " + bitrate + " -ar "+ Hz + " -i \"" + fromMusic + "\" \"" + toMusic + "\""); 
14             if(cbRetain.Checked == false
15             
16                 File.Delete(fromMusic); 
17                 BindList(); 
18             
19             else 
20             
21                 foreach (ListViewItem lt inlistMusics.Items) 
22                 
23                     if(lt.Text == txtMusic.Text) 
24                     
25                         listMusics.Items.Remove(lt); 
26                     
27                 
28             
29    
30             //转换完成 
31             MessageBox.Show("转换完成"); 
32             txtMusic.Text = ""
33             txtMp3Music.Text = ""
34         
35         catch(Exception ex) 
36         { MessageBox.Show(ex.ToString()); } 
37     
38     else 
39     
40         MessageBox.Show("请选择你要转换的音乐");  
41     
42 }

音频切割的代码如下:

01 private void btnCut_Click(objectsender, EventArgs e) 
02
03     SaveFileDialog saveMusic = newSaveFileDialog(); 
04     saveMusic.Title = "选择音乐文件存放的位置"
05     saveMusic.DefaultExt = ".mp3"
06     saveMusic.InitialDirectory = Statics.Setting.AudioResourceFolder +"\\" + Statics.Setting.Solution+"\\" + cobFolders.Text; 
07     string fromPath = Statics.Setting.AudioResourceFolder + "\\"+ Statics.Setting.Solution +"\\"+ cobFolders.Text + "\\"+ txtMusic.Text;//要切割音乐的物理路径 
08     stringstartTime = string.Format("0:{0}:{1}", txtBeginM.Text, txtBeginS.Text).Trim();//歌曲起始时间 
09     intduration = (Convert.ToInt32(this.txtEndM.Text) * 60 + Convert.ToInt32(this.txtEndS.Text)) - (Convert.ToInt32(this.txtBeginM.Text) * 60 + Convert.ToInt32(this.txtBeginS.Text)); 
10     stringendTime = string.Format("0:{0}:{1}", duration / 60, duration % 60);//endTime是持续的时间,不是歌曲结束的时间 
11     if(saveMusic.ShowDialog() == DialogResult.OK) 
12     
13         stringsavePath = saveMusic.FileName;//切割后音乐保存的物理路径 
14         try 
15         
16             MP3Convertion.ExcuteProcess("ffmpeg.exe""-y -i \"" + fromPath + "\" -ss "+ startTime + " -t " + endTime + " -acodec copy \""+ savePath+"\"");//-acodec copy表示歌曲的码率和采样频率均与前者相同 
17             MessageBox.Show("已切割完成"); 
18         
19         catch(Exception ex) 
20         
21             MessageBox.Show(ex.ToString()); 
22         }                
23     
24 }

切割音频操作系统的知识点就总结道这了,就是fmpeg的应用。

C# 音频操作系统项目总结的更多相关文章

  1. EasyDarwin开源音频解码项目EasyAudioDecoder:EasyPlayer Android音频解码库(第二部分,封装解码器接口)

    上一节我们讲了如何基于ffmpeg-Android工程编译安卓上的支持音频的ffmpeg静态库:http://blog.csdn.net/xiejiashu/article/details/52524 ...

  2. EasyDarwin开源音频解码项目EasyAudioDecoder:基于ffmpeg的安卓音频(AAC、G726)解码库(第一部分,ffmpeg-android的编译)

    ffmpeg是一套开源的,完整的流媒体解决方案.基于它可以很轻松构建一些强大的应用程序.对于流媒体这个行业,ffmpeg就像圣经一样的存在.为了表达敬意,在这里把ffmpeg官网的一段简介搬过来,ff ...

  3. Ucan23操作系统项目地址

    期间耽误了近半年的时间.在昨天最终完毕了Ucan23OS, 项目托管在GitHub上,地址为: https://github.com/howardking/UCAN23OS 以下为操作系统的执行截图 ...

  4. 操作系统项目:向Linux内核添加一个系统调用

    内容: 向Linux增加一个系统调用 撰写一个应用测试程序调用该系统调用 使用ptrace或类似的工具对该测试程序进行跟踪调 环境: 1.vmware workstation 15.0.0 2.ubu ...

  5. 我发起了一个 操作系统 GUI 和 Tcp / IP 包 的 开源项目 DeviceOS

    操作系统 如果 不需要 处理 复杂多样 的 硬件 兼容性, 其实 并不算 大项目, 可以算 毕业设计 . 但是, GUI 和 Tcp / IP  这两个 部分 的 实现逻辑 很多 很复杂,  这  2 ...

  6. 物联网操作系统HelloX V1.79发布公告

    经过HelloX开发团队近半年的努力,在HelloX V1.78版本基础上,增加许多功能特性,并对V1.78版本的一些特性进行了进一步优化之后,正式形成HelloX V1.79测试版本.经相对充分的测 ...

  7. Cookiecutter: 更好的项目模板工具:(1)简介及可用资源汇总

    原文档地址:https://cookiecutter.readthedocs.io/en/latest/ 本系列只介绍cookiecutter的基础使用,而且会删除与功能使用无关的部分.深度使用及了解 ...

  8. EasyDarwin开源流媒体项目

    本文转自EasyDarwin CSDN官方博客:http://blog.csdn.net/easydarwin EasyDarwin是由国内开源流媒体团队维护和迭代的一整套开源流媒体视频平台框架,从2 ...

  9. [转帖](整理)GNU Hurd项目详解

    (整理)GNU Hurd项目详解 http://www.ha97.com/3188.html 发表于: 开源世界 | 作者: 博客教主 标签: GNU,Hurd,详解,项目 Hurd原本是要成为GNU ...

随机推荐

  1. 命令:less

    与more的区别 more在man手册中的英文原文是文件熟读过滤器(file perusal filter),其实可以理解为一种文本查看器. 它存在一些缺点: 必须事先加载完整个文件.因此在遇到大文件 ...

  2. hdu1527下沙小面的(二)

    B - 下沙小面的(2) Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  3. [ 转载 ] Java Jvm内存介绍

    一.基础理论知识 1.java虚拟机的生命周期: Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上 ...

  4. [BZOJ3309]DZY Loves Math(莫比乌斯反演+线性筛)

    $\sum\limits_{T=1}^{n}\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor\sum\limits_{d|T}f(d)\mu(\fr ...

  5. 【20181102T2】飞越行星带【智商题+最小瓶颈路】

    题面 [正解] 一眼不可做啊 --相当于求路线上穿过的点最小距离最大 最小最大--二分啊 现在相当于给一个直径,要判断这个直径是否能从左边穿到右边 我们可以在距离不超过直径的点连一条边,\(y=0\) ...

  6. Windows下修改Git bash的HOME路径

    Windows中使用http://git-scm.com/安装Git bash工具,默认的HOME和~路径一般都是C:\Users\用户名,每次得用命令切换到常用的Repository下,此操作重复而 ...

  7. android实现gif图播放、暂停、继续播放

    之前做过一个项目,在android上实现gif图的播放以及点击屏幕弹出窗口显示gif图片的暂停,之前一直用gifView的jar包实现gif图片的显示,但是在gif暂停.继续播放这块没有找到好的解决方 ...

  8. Python学习笔记(五)—列表的学习

    总结内容: 1.list的定义 2.list的取值 3.list数据的增加 4.list数据的删除 5.list数据的修改 6.list数据的查询 7.list方法的介绍 8.list的合并 9.多维 ...

  9. 事件冒泡 比bubble

    冒泡的概念就是 当子元素触发事件的时候 相应的祖宗十八代素也会触发相同的事件(前提父元素也添加了一样的事件)eg:儿子 有一个onclick 祖宗十八代 也有onclick 当点击儿子的时候 祖宗十八 ...

  10. CentOS6安装redmine

    Author: JinDate: 20140827System: CentOS release 6.5 (Final) 参考:http://www.redmine.org/projects/redmi ...