1.什么是wav格式
WAV为微软公司(Microsoft)开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范,用于保存Windows平台的音频信息资源。 通常使用三个参数来表示声音,量化位数,取样频率和采样点振幅。量化位数分为8位,16位,24位三种,声道有单声道和立体声之分,单声道振幅数据为n*1矩阵点,立体声为n*2矩阵点,取样频率一般有11025Hz(11kHz) ,22050Hz(22kHz)和44100Hz(44kHz) 三种。
标准格式化的WAV文件和CD格式一样,也是44.1K的取样频率,16位量化数字,因此在声音文件质量和CD相差无几。
2. WAV文件的组成
偏移地址
大小
字节
数据块
类型
内容
00H~03H
4
4字符
资源交换文件标志(RIFF)
04H~07H
4
长整数
从下个地址开始到文件尾的总字节数
08H~0BH
4
4字符
WAV文件标志(WAVE)
0CH~0FH
4
4字符
波形格式标志(fmt ),最后一位空格。
10H~13H
4
整数
过滤字节(一般为00000010H),若为00000012H则说明数据头携带附加信息(见“附加信息”)。
14H~15H
2
整数
格式种类(值为1时,表示数据为线性PCM编码)
16H~17H
2
整数
通道数,单声道为1,双声道为2
18H~1BH
4
长整数
采样频率
1CH~1FH
4
长整数
波形数据传输速率(每秒平均字节数)
20H~21H
2
整数
DATA数据块长度,字节。
22H~23H
2
整数
PCM位宽
随后
2字节
2
整数
附加信息(可选,由上方过滤字节确定)
......................以上为对wav格式的基本了解,最近碰到一个需要合并音频文件的需求,奈何对此文件了解过少,最后借助于NAudio
git地址: https://github.com/naudio/NAudio,结合文件流进行处理。

3.话不多说上代码。首先是安装Naudio的包。
3.1.上传音频文件并调用合并方法【伪代码】
public void UploadOrCombineAudioFile()
{HttpFileCollection files = HttpContext.Current.Request.Files;if (files == null || files.Count < 1)return;string upfileType = HttpContext.Current.Request.Form["upfileType"];//文件格式类型/*...省略符...*/int maxSize = 1024 * 1024 * 100;//单文件上传最大限制List<string> dirDic = new List<string> { ".mp3", ".mp4", ".pcm", ".wav" };//文件格式限制string uploadPath =  HttpContext.Current.Server.MapPath("~/AudioFile/TempFile/");//临时路径if (!Directory.Exists(uploadPath))Directory.CreateDirectory(uploadPath);string fileType = string.Empty;for (var i = 0; i < files.Count; i++){var postedfile = files[i];var inputStream = postedfile.InputStream;if (inputStream.Length > 0){string thisfileName = files[i].FileName;fileType = Path.GetExtension(thisfileName);if (postedfile.InputStream == null || postedfile.InputStream.Length >  maxSize || !dirDic.Contains(fileType.ToLower()))return;/*...我是省略符...*/int ReadLen = 0;string uploadFileName = uploadPath + thisfileName;byte[] bytes = new byte[10240];using (FileStream stream = new FileStream(uploadFileName,  FileMode.OpenOrCreate))//保存文件到指定待合并文件路径下
            {while ((ReadLen = inputStream.Read(bytes, 0, bytes.Length)) > 0){stream.Write(bytes, 0, ReadLen);}}}}List<string> filepaths = new List<string>(Directory.GetFiles(uploadPath));//获取待合并文件路径//文件合并后路径string savePath =  HttpContext.Current.Server.MapPath("~/AudioFile/ComBineFile/" +  DateTime.Now.ToString("yyyyMMdd") + "/");if (!Directory.Exists(savePath))Directory.CreateDirectory(savePath);/*...我是省略符...*/byte[] buffer = new byte[10240];string savefullName = savePath + DateTime.Now.ToString("yyyyMMddHHmmssff") +  upfileType;if (upfileType.ToLower().Equals(".mp3"))CombineMp3(filepaths, savefullName);//mp3合并else if ((upfileType.ToLower().Equals(".wav")))CombineWav(filepaths, savefullName);//wav合并/*...我是省略符...*/return;
}

3.2  .mp3格式合并
//命名空间
using System.IO;
using NAudio;
using NAudio.Wave;/// <summary>
/// Mp3格式合并
/// </summary>
/// <param name="inputFiles">待合并文件路径</param>
/// <param name="outputfullName">输出文件名</param>
private void CombineMp3(List<string> inputFiles, string outputfullName)
{using (FileStream outputStream = new FileStream(outputfullName,  FileMode.OpenOrCreate)){foreach (string file in inputFiles){Mp3FileReader reader = new Mp3FileReader(file);if ((outputStream.Position == 0) && (reader.Id3v2Tag != null)){outputStream.Write(reader.Id3v2Tag.RawData, 0,  reader.Id3v2Tag.RawData.Length);}Mp3Frame frame;while ((frame = reader.ReadNextFrame()) != null){outputStream.Write(frame.RawData, 0, frame.RawData.Length);}}}
}

3.3.wav格式合并
/// <summary>
/// wav格式合并
/// </summary>
/// <param name="inputFiles">待合并文件</param>
/// <param name="outputfullName">输出文件名</param>
private void CombineWav(List<string> inputFiles, string outputfullName)
{WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(new  WaveFileReader(inputFiles[0]));using (WaveFileWriter waveFileWriter = new WaveFileWriter(outputfullName,  waveStream.WaveFormat)){foreach (string file in inputFiles){waveStream = WaveFormatConversionStream.CreatePcmStream(new  WaveFileReader(file));byte[] bytes = new byte[waveStream.Length];waveStream.Position = 0;waveStream.Read(bytes, 0, (int)waveStream.Length);waveFileWriter.Write(bytes, 0, bytes.Length);}}
}

未完待续....

转载于:https://www.cnblogs.com/axqa/p/11468800.html

C# 使用NAudio合并mp3、wav音频文件相关推荐

  1. python切割音频文件_python切割和合并wav音频文件

    切割wav音频文件 如果没有pydub需要使用pip install pydub来安装模块 from pydub import AudioSegment from pydub.utils import ...

  2. 两个音轨合并_Okoker MP3 Joiner合并两个音频文件的方法

    Okoker MP3 Joiner是一款可以在电脑上合并音乐的软件,我们可以将多个音乐片段加载到软件中然后合并成为一首歌曲或者可以将很多歌曲中的精彩部分制作成串烧,软件的功能强大,使用起来也比较简单, ...

  3. C语言解析WAV音频文件

    转载:http://www.cnblogs.com/LexMoon/p/wave-c.html 1.C语言解析WAV音频文件 代码地址: Github : https://github.com/Cas ...

  4. Java程序获取和修改.wav音频文件的内部结构

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/79498075冷血之心的博客) wav音频文件是一种无损的音频文件, ...

  5. 音频制作与转换—WAV音频文件

    音频制作与转换-WAV音频文件 在音视频制作或转换中,常需要面临如下选择: 是否选择WAV这种音频文件格式:选择何种编码格式:如何设置采样频率(Hz.kHz).采样精度(bit).码率(kBps.比特 ...

  6. 如何用C语言编写wav读取函数,C++读取WAV音频文件的头部数据的实现方法

    C++读取WAV音频文件的头部数据的实现方法 前言: 在这里分享一下自己的心得,希望和大家一起分享技术,如果有什么不足,还请大家指正.写出这篇目的,就是希望大家一起成长,我也相信技术之间没有高低,只有 ...

  7. Windows Phone 8初学者开发—第21部分:永久保存Wav音频文件

    第21部分:永久保存Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Begi ...

  8. c语言 文件 long double 读取,读取*.wav音频文件

    1.wav音频文件的格式 wav文件由文件头和采样数据2部分组成. 文件头又分为RIFF(Resource Interchange File Format).WAVE文件标识段 和 声音数据格式说明段 ...

  9. java 双声道音频_java实现切割wav音频文件的方法详解【附外部jar包下载】

    本文实例讲述了java实现切割wav音频文件的方法.分享给大家供大家参考,具体如下: import it.sauronsoftware.jave.Encoder; import it.sauronso ...

  10. python播放wav文件_python3 写一个WAV音频文件播放器的代码

    环境:ubuntu 16.04 python3.5 pycharm 包 : wave pyaudio sys 上代码:AudioPlayer.py # coding:utf-8 # author:ki ...

最新文章

  1. Dynamo:亚马逊的高可用键值存储
  2. PHP base64
  3. MacOS系统自带截图快捷键
  4. python telnetlib详解 执行循环命令_Python3+telnetlib实现telnet客户端
  5. 优化MyBatis配置文件中的配置
  6. 【PHP设计模式 02_JieKou.php】面向接口开发
  7. 水利水电专业英语(2.5k行超全)
  8. 无法访问局域网的文件服务器,局域网共享文件夹不能访问
  9. Mac上命令行安装证书p12文件及描述文件mobileprovision
  10. redis基础知识:数据结构SDS
  11. 【Unity】UGUI系列教程——拼接一个简单界面
  12. LFtoolBox0.4工具包解码Lytro光场图像及子孔径图像获取
  13. 我的职业理想 有关计算机应用300字,我的理想职业作文300字三篇
  14. Freeswitch如何支持G729转码开源版本
  15. 什么是api应用程序接口?
  16. 机器人开发--丝杠与导轨
  17. IP地址和子网掩码计算
  18. Jor简报表sql传参数
  19. 我的VMware认证设计专家(VCDX)之路
  20. GLSL (4)Uniform

热门文章

  1. 银行业智能运维的探索与实践
  2. 单页面网站优化技巧有哪些?
  3. facebook,twitter,pinterest的分享功能代码--js+html
  4. 如何删除电脑上的$RECYCLE.BIN文件夹
  5. 爬虫之汽车之家/抽屉新热榜/煎蛋网
  6. android应用层学习经验
  7. Math类常用方法大全
  8. python发送cmd命令_python 执行终端/控制台命令的例子 如何使用python在同一个控制台发送cmd命令...
  9. 微信账号注销了能恢复吗
  10. android转发短信到邮箱,利用短信通知的方式在Tasker中实现收到Android手机短信自动转发到邮箱...