NAudio 使用心得
一直做得比较多的是Web,客户端一直接触的比较少,现在因为组内有历史产品是用Winform写的,在开发过程中遇到些坑介绍下。
想看NAudio使用介绍的同学可以直接跳到方案二
应用背景和需求:
Winform中嵌套了webbrowser用来显示聊天信息,Winform用计时器主动拉服务器新消息后直接生成html添加到webbrowser。
现在从服务器获取的消息类型中增加了语音类型。语音类型消息为json格式,包含语音文件url地址、语音长度、智能翻译信息。
实现思路:
方案1、直接在webbrowser中生成html5 audio标签,使用浏览器的播放功能
方案2、在webbrowser中生成链接,使用window.external.XXXXX调用Winform程序内的组件播放语音
方案一尝试过程
webbrowser的内核默认使用的是最低版本的IE,也就是IE6、7,众所周知对html5是妥妥不支持的。
好在原来接触过第三方插件html5media.js,在低版本IE的情况下,可以将audio标签替换成object标签,并使用内置的Flowplayer Flash插件进行播放,经过测试,低版本IE果然是支持的。
部署方法:直接在webbrowser头部增加对html5media.js的引用,注意:内网环境需要自己下载插件部署到自己的服务器上,不能直接使用官网CDN的地址。安装方法就是无脑拷贝整个文件夹过去就行了,不要遗漏了内置的flowplayer.swf等组件。
在IE中先测试运行,直接报沙箱错误,无法访问flowplayer.swf,搜索了一下,把本地测试文件部署了IIS测试站点,访问正常了,找了一个MP3文件可以完美播放。
由于公司的语音文件格式是aac的,所以我拿实际语音文件测试,发现flowplayer不能支持aac文件。。。。。。。。。。好吧,你赢了。
兼容插件看来用不了了,要不直接把webbrowser内核替换成Chrome内核呢?
网上有很多现成的插件,尝试了Gecko和Cef,Gecko的码完之后发现仍然不支持audio标签,内核的确是chrome,Cef看其它网友说对audio标签也不支持,我就果断放弃了。
方案一走不通。
方案二尝试过程
.NET搜索Winform播放语音,第一个插件就是NAudio。目前版本到1.8,GitHub开源
可以直接nuget安装,包安装管理命令行输入install-package NAudio
即可安装。由于我的项目代码是Framework2.0,Nuget提示我项目Framework太低。
无奈最近一个支持Framework2.0的版本是1.6,于是install-package NAudio -version 1.6
,NAudio是一个相当干净的插件,除了他自己的NAudio.dll没有加入任何其它依赖的dll文件,根据源码看,主要应该都是调用的system32下的dll。
OK,试验一下播放MP3文件,没问题。
试验一下播放AAC文件,不行。。。查询官网,需要Media Foundation Transforms,只有Win7以上支持,而且只有NAudio 1.7以上支持
无奈,想到了一个hack方法,通过另一个安装了Media Foundation组件winserver 2012服务器IIS站点作为中转,使用NAudio将语音转换为wav格式后,发送给客户端使用。
试了下,果然可以了!试着部署到测试服务器,运行报错
需要安装组件media foundation,安装后还报错
想到可能是测试服务器到语音url链接不通,尝试换了一个url,在服务器上直接访问通过后,再尝试运行报另外一个错
应该是由于server2012不支持url读取语音文件导致,使用webclient先下载下来后再从本地读取,然后删除文件
测试成功!
参考文档
https://www.codeproject.com/articles/501521/how-to-convert-between-most-audio-formats-in-net
http://stackoverflow.com/a/18333982/7706556
Media Foundation Transforms