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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM