C#实现WAV音频单声道提取

上传人:cn****1 文档编号:512074382 上传时间:2023-11-17 格式:DOCX 页数:16 大小:308.73KB
返回 下载 相关 举报
C#实现WAV音频单声道提取_第1页
第1页 / 共16页
C#实现WAV音频单声道提取_第2页
第2页 / 共16页
C#实现WAV音频单声道提取_第3页
第3页 / 共16页
C#实现WAV音频单声道提取_第4页
第4页 / 共16页
C#实现WAV音频单声道提取_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《C#实现WAV音频单声道提取》由会员分享,可在线阅读,更多相关《C#实现WAV音频单声道提取(16页珍藏版)》请在金锄头文库上搜索。

1、C#实现WAV音频单声道提取作者:Joseph Pan (转载请注明出处http:/ )喜欢买碟或者卡拉ok的朋友一定不会对声道这个术语陌生。通常我们在音像店买回来 的VCD或者DVD都是双声道的形式,唱片商在录制唱片时往往提供了两个或多个声道, 以保存不同的音频内容,以形成立体声效。左声道保存的大多为一些背景声效,如卡拉OK 的消音伴唱。而右声道保存的往往是较为主要的声音,比如主唱的歌声。利用多声道技术, 听众可以清晰地分辨出各种乐器来自的方向,从而使音乐更富想象力,更加接近于临场感受。有时候我们只需要音频里的单声道内容,比如喜欢用电脑录制卡拉ok的朋友就经常为 了找歌曲的伴唱而流连于各大伴

2、奏网站。现在的网络翻唱非常流行,很多网络歌手就是先搜 索喜欢的歌曲的伴奏,然后利用Adobe Audition (前身就是大名鼎鼎的CoolEdit)录制自己 的演唱,然后加一些简单的降噪和压限处理,最后mix到伴奏的音轨里面。尽管利用Audition 也可以完成单声道的提取工作,但是操作起来比较复杂。其实对WAV的单声道提取并不困难。关键在于对WAV文件格式的理解。一、WAV的文件头WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范。所有的WAV都有一个文件头,这个文件头包含了音频流 的编码

3、参数。偏移地址字节数类型内容00H03H4字符资源交换文件标志(RIFF)04H07H4长整数从下个地址开始到文件尾的总字节数08H0BH4字符WAV文件标志(WAVE)0CH0FH4字符波形格式标志(FMT)10H13H4整数过滤字节(一般为00000010H)14H15H2整数格式种类(值为1,表示数据PCM “律编码的数据)16H17H2整数通道数,单声道为1,双声道为218H1BH4长整数米样频率1CH1FH4长整数波形数据传输速率(每秒平均字节数)20H21H2整数数据的调整数(按字节计算)22H23H2整数样本数据位数表1WAV的文件头由表1我们可以得到以下几个重要的信息:116H

4、17H处记录通道数,当值为1时,表示文件为单声道;当值为2时,表示文件为双声道。218H1BH处记录采样频率。它的取值与声卡的支持情况有关。常见的有8000、11025、22050、44100、48000、96000等。其中,44100是大多数歌曲文件采用的标准采样频率。322H23H处记录样本数据位数。即每一个采样的长度。常见的有8位和16位。这里还包含了另外一个信息:若样本的数据位数为n,对于双声道文件,则低n/2位用于存放 左声道;高n/2位用于存放右声道。根据这三点信息,我们可以自己编程实现单声道的提取。下面我们就来一步步动手实现。 由于程序涉及的只是简单的二进制文件读写操作,因此这里

5、只举C#作简单示例,其他语言 的处理与之大同小异。二、文件读取类的编写为了方便以后对WAV文件的研究,我们可以先单独写一个WAV文件读取类,专门获 取文件头的每一块信息:WaveAccess1/*WaveAccess2*提供wav文件头的访问3*和文件写入相关操作4 */55 class WaveAccess6 89 private byte riff;/410privatebyteriffSize;/411privatebytewaveID;/412privatebytefmtID;/413privatebytenotDefinition;/414privatebyte waveType;/

6、215 private byte channel;/2privatebyte sample;/4privatebyte send;/4privatebyte blockAjust;/2privatebyte bitNum;/2privatebyte unknown;/2privatebyte dataID;/4privatebyte dataLength;/4short data;privatestringlongFileName;161718192021222324252627282930313233343536373839404142434445464748public string Lo

7、ngFileNameget return longFileName; public string ShortFileNamegetint pos= LongFileName.LastIndexOf();return LongFileName.Substring(pos+ 1);public short Dataget return data; set data= value; public string Riff495051525354555657585960616263646566676869707172737475767778798081get return Encoding.Defaul

8、t.GetString(riff); set riff= Encoding.Default.GetBytes(value); public uint RiffSizeget return BitConverter.ToUInt32(riffSize,0); set riffSize= BitConverter.GetBytes(value); public string WaveIDget return Encoding.Default.GetString(waveID); set waveID= Encoding.Default.GetBytes(value); public string

9、FmtIDget return Encoding.Default.GetString(fmtID); set fmtID= Encoding.Default.GetBytes(value); public int NotDefinitionget return BitConverter.ToInt32(notDefinition,0); set notDefinition= BitConverter.GetBytes(value); public short WaveType828384858687888990919293949596979899100101102103104105106107

10、108109110111112113114get return BitConverter.ToInt16(waveType,0); set waveType= BitConverter.GetBytes(value); public ushort Channelget return BitConverter.ToUInt16(channel,0); set channel= BitConverter.GetBytes(value); public uint Sampleget return BitConverter.ToUInt32(sample,0); set sample= BitConv

11、erter.GetBytes(value); public uint Sendget return BitConverter.ToUInt32(send,0); set send= BitConverter.GetBytes(value); public ushort BlockAjustget return BitConverter.ToUInt16(blockAjust,0); ;set blockAjust= BitConverter.GetBytes(value); 115116117118119120121122123124125126127128129130131132133134

12、135136137138139140141142143144145146147public ushort BitNumget return BitConverter.ToUInt16(bitNum, 0);set bitNum= BitConverter.GetBytes(value); public ushort Unknowngetif (unknown= null)return 1;elsereturn BitConverter.ToUInt16(unknown,0);set unknown= BitConverter.GetBytes(value); public string Dat

13、alDget return Encoding.Default.GetString(datalD); set dataID= Encoding.Default.GetBytes(value); public uint DataLengthget return BitConverter.ToUInt32(dataLength,0);148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180set dataLength= BitConverter.GetBytes(value); public WaveAccess() public WaveAccess(string filepath)tryriff= ne

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号