从.mp3到.wav的音频格式转换

  当实际开发时,经常会遇到格式转化的问题,或是文本编码格式(看我另一篇文本编码转换文章链接:https://blog.csdn.net/jinglell/article/details/99679463),或是这次说到的音频编码格式。
  我遇到的需求是,将微信小程序录音得来的.mp3转换为科大讯飞语音识别的.wav/.pcm。
  我在解决问题时,尝试过很多方法,比如构造.wav文件头,使用NAudio.dll等,这两种方式我先贴出来,当时并没有解决我的问题:
  1.构造.wav文件头

     /// <summary>/// wave文件头/// </summary>private struct WAVE_Header{public int RIFF_ID;           //4 byte , 'RIFF'public int File_Size;         //4 byte , 文件长度public int RIFF_Type;         //4 byte , 'WAVE'public int FMT_ID;            //4 byte , 'fmt'public int FMT_Size;          //4 byte , 数值为16或18,18则最后又附加信息public short FMT_Tag;          //2 byte , 编码方式,一般为0x0001public ushort FMT_Channel;     //2 byte , 声道数目,1--单声道;2--双声道public int FMT_SamplesPerSec;//4 byte , 采样频率public int AvgBytesPerSec;   //4 byte , 每秒所需字节数,记录每秒的数据量public ushort BlockAlign;      //2 byte , 数据块对齐单位(每个采样需要的字节数)public ushort BitsPerSample;   //2 byte , 每个采样需要的bit数public int DATA_ID;           //4 byte , 'data'public int DATA_Size;         //4 byte , }/// <summary>/// 根据数据段的长度,生产文件头/// </summary>/// <param name="data_len">音频数据长度</param>/// <returns>返回wav文件头结构体</returns>WAVE_Header getWave_Header(int data_len){WAVE_Header wav_Header = new WAVE_Header();wav_Header.RIFF_ID = 0x46464952;        //字符RIFFwav_Header.File_Size = data_len + 36;wav_Header.RIFF_Type = 0x45564157;      //字符WAVEwav_Header.FMT_ID = 0x20746D66;         //字符fmtwav_Header.FMT_Size = 16;wav_Header.FMT_Tag = 0x0001;wav_Header.FMT_Channel = 1;             //单声道wav_Header.FMT_SamplesPerSec = 16000;   //采样频率wav_Header.AvgBytesPerSec = 32000;      //每秒所需字节数wav_Header.BlockAlign = 2;              //每个采样1个字节wav_Header.BitsPerSample = 16;           //每个采样8bitwav_Header.DATA_ID = 0x61746164;        //字符datawav_Header.DATA_Size = data_len;return wav_Header;}

这个方式应该是可以的,是最原始最基础的,不过当时我并没有找到科大讯飞的音频格式要求,我对音频的了解也很少,所以转换出来的音频全是噪音,等找到时发现人家科大讯飞给了更好的工具,所以并没有再去修改这里的参数等尝试。
  2.NAudio转码

var inputFileName = "XXX.mp3";
var outputFileName = inputFileName.Substring(0, inputFileName.Length - 3) + "wav";var builder = new Mp3FileReader.FrameDecompressorBuilder(wf => new Mp3FrameDecompressor(wf));
using (var reader = new Mp3FileReader(inputFileName, builder))
{WaveFileWriter.CreateWaveFile(outputFileName, reader);
}

大致就是这样,这是我刚从网上找的,很简单的几句,不过就是读取不了我从微信小程序录下来的音频!0_0!
所以最后我找到了第三个方法,而且我发现官网给的也是这个工具:ffmpeg!我先试了试转码后能不能直接识别,发现可以之后,所以我想能不能直接在.NET里直接调用ffmpeg.exe这类exe文件?一查,真的可以!好了,问题解决了!
大致参考了一下,先下载好ffmpeg.exe然后放到项目里

然后查看科大讯飞官方说明:

https://www.xfyun.cn/doc/asr/voicedictation/Audio.html#%E9%9F%B3%E9%A2%91%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E8%BD%AC%E6%8D%A2%E5%B7%A5%E5%85%B7ffmpeg


但是官网并没有给出ffmpeg.exe下载链接,我发出来,链接: https://download.csdn.net/download/jinglell/11569562

解压后打开bin文件夹,我们这次需要的只是ffmpeg.exe,
下面是具体用法:

     #region 音频格式转换/// <summary>/// 音频格式转换/// </summary>/// <param name="input"></param>/// <returns></returns>public string mp32wav( string input ){//string output = input.Substring(0, input.Length - 3) + "wav";string absoluteUrl = GetConfigValue("AudioAbsoluteFolderTemp");//绝对路径string relativeUrl = GetConfigValue("AudioRelativeFolderTemp");//相对路径string catalog = DateTime.Now.ToString("yyyyMMdd");string filePath = System.IO.Path.Combine( absoluteUrl, catalog );if (!System.IO.Directory.Exists(filePath)){System.IO.Directory.CreateDirectory(filePath);}string fileName = CreateFileName(".wav");string output = System.IO.Path.Combine(filePath, fileName);//返回URL路径string returnURL = System.IO.Path.Combine(relativeUrl, catalog, fileName).Replace("\\", "/");string strCmd = "-y -i "+ input +" -acodec pcm_s16le -f s16le -ac 1 -ar 16000 "+output;System.Diagnostics.Process p = new System.Diagnostics.Process();p.StartInfo.FileName = "D:\\ffmpeg\\bin\\ffmpeg.exe";//要执行的程序名称 p.StartInfo.Arguments = " " + strCmd;p.StartInfo.UseShellExecute = true;p.StartInfo.RedirectStandardInput = false;//可能接受来自调用程序的输入信息 p.StartInfo.RedirectStandardOutput = false;//由调用程序获取输出信息 p.StartInfo.RedirectStandardError = false;//重定向标准错误输出p.StartInfo.CreateNoWindow = false;//不显示程序窗口p.Start();//启动程序p.WaitForExit();//等待程序执行完退出进程if (System.IO.File.Exists(output)){//return returnURL;return output;}return "";}#endregion

这里我是直接转码后存到了我的本地服务器,本地IIS资源服务器具体配置网上有很多教程不再赘述。

微信小程序+.NET(五) 音频格式转换-从.mp3到.wav相关推荐

  1. 【微信小程序】微信小程序--倒放音频的实现

    微信小程序–倒放音频的实现 注:灵感来源与玩法参考:https://www.bilibili.com/video/av76976000 设计思路: 1.微信小程序端:使用微信开发者工具实现微信小程序端 ...

  2. 微信小程序录音与音频播放控制功能

    微信小程序录音与音频播放控制功能 1.录音 1.1 案例 2.音频播放控制 2.1 案例   小程序继承了微信强大的语音处理功能,提供了录音.音频播放控制和背景音乐等功能,它们的功能不同,但有相似性. ...

  3. 关于微信小程序iOS端时间格式兼容问题

    关于微信小程序iOS端时间格式兼容问题 在自己开发中,当时间格式为 2020-06-29 08:00 ,需要将时间转为其他格式时,Android端转换成功,iOS端报错或是转为NaN. 解决方法: 1 ...

  4. 【微信小程序】微信小程序实现在线音频播放

    此处实现微信小程序播放音频用的是微信的 wx.createInnerAudioContext() API JS部分代码为: const innerAudioContext = wx.createInn ...

  5. AI微信小程序源码下载照片AI转换动漫照片源码安装简单无需服务器域名

    这是一款转动漫脸的一款微信小程序源码 该款小程序源码无需服务器和域名 搭建安装简单 有多种风格转换模式可自选 安装教程: 首先解压源码然后把源码上传到微信开发者工具打开 另外设置一个合法域名 合法域名 ...

  6. 树莓派搭建微信小程序服务器传音频(局域网)

    微信小程序代码: 微信小程序采用微信开发者工具进行开发,采用wx.uploadfile传音频,后端用python.flask写的,很简单,就是request接收一下file,然后用树莓派自带的音频播放 ...

  7. 上传声音 微信小程序_微信小程序之----audio音频播放

    audio audio为音频组件,我们可以轻松的在小程序中播放音频. audio组件属性如下: 属性名类型默认值说明 id String video 组件的唯一标识符, src String 要播放音 ...

  8. 微信小程序框架(五)-全面详解(学习总结---从入门到深化)

    目录 UI框架_TDesign 引入TDesign UI框架_TDesign组件 Rate 评分 Toast 轻提示 UI框架_Vant 使用方式 引入组件 UI框架_Vant组件 Overlay 遮 ...

  9. uniapp 在 H5、App、微信小程序中使用 svga 格式动画详细示例教程,附插件源码及示例源码(常见于网页直播刷礼物特效功能)

    前言 兼容 h5 网页,微信小程序 和 App. 本文详细讲解在 uni-app项目中,如何实现 svga 格式动画的引入及展示. 组件源码及使用文档都有! 你直接复制本文的源码,即可得到封装好的 s ...

  10. 微信小程序入门五上滑加载下拉刷新

    之前谈到文章列表的数据加载,是一次性全部加载,这样是不友好的.这章介绍加载和刷新. 效果图: 先介绍在IDE中,怎么模拟上滑这个操作.开始我是用鼠标点击文章列表,然后先上移动.结果一直没有结果,以为是 ...

最新文章

  1. 找不到第三方怎么理赔_车子被撞,找不到肇事者怎么办?
  2. 哈希表查找速度为什么那么快?快在哪里了?
  3. 成功解决building ‘snappy._snappy‘ extension error: Microsoft Visual C++ 14.0 is required. Get it with “B
  4. 暴力求解法 之 简单枚举
  5. AI基础:Pandas简易入门
  6. 解决JBoss只能通过localhost访问不能通过IP的问题
  7. 很久没更新博客了,再发协同开发中SVN使用规范
  8. 2021技术人新展望
  9. java web 有哪些标签库_java web中jsp常用标签
  10. Google 的 C++ 代码规范
  11. git由于网络原因导致 please make sure you have the correct access rights and the repository exists
  12. 初学python-练习_4使用python编写本地登录程序(带注册)
  13. 尼姑一般怎么自称_电池又一重大事故!选铅酸,还是锂电?听听电池老师傅怎么说!...
  14. jntoo.php,小舍微信分销拼团系统V6.0三级分销系统最新版源码+支持多商户入驻+拼团+微商城+分销...
  15. 高版本SDK编译生成的apk放入低版本android源码中集成编译
  16. 管理好项目——带好技术团队的秘籍
  17. u盘装华为服务器系统教程,华为服务器u盘重装系统
  18. 添加图书的代码C语言,C语言图书系统代码.doc
  19. Educational Codeforces Round 61 (Rated for Div. 2)(A、B、C、D、E、F)
  20. svn迁移(linux服务器,从旧服务器迁移到新服务器)

热门文章

  1. HTML5基础基础练习题
  2. 酒店预订系统web端Android端,基于WEB的酒店客房预订系统的设计与实现
  3. 计算机平面设计是什么学的什么,计算机平面设计主要学什么?
  4. win10关机后cpu风扇还在转_电脑关机后CPU风扇还在转的原因和解决办法
  5. 网易不进垃圾箱html,腾讯QQ、网易126、163邮箱发送邮件进入垃圾箱及收不到邮件怎么办?...
  6. Qt 样式表、绘图事件设置渐变色
  7. 集成App Linking服务后无法正确跳转到应用的解决方案
  8. hosts文件是什么? Windows、Mac、Linux的hosts文件在哪里?
  9. matlab gmm,GMM聚类及Matlab代码实现
  10. C#桌面办公应用-工资管理系统系列二