C#播放音頻的正確姿勢:NAudio的簡介與基礎(chǔ)播放
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
前言各網(wǎng)查了一圈,NAudio相關(guān)中文資料較少。鑒于本人最近在使用此庫的播放音頻方面有所涉及,在此將自己的學(xué)習(xí)過程與經(jīng)驗(yàn)總結(jié)與大家分享,同時(shí)也歡迎大佬探討和指正。 簡介為什么使用NAudioNAudio為.NET平臺(tái)下的開源庫,采用ML-PL協(xié)議,開源地址:https://github.com/naudio/NAudio。截至今日,已有約2.4k的stars。 NAudio功能強(qiáng)大,且其入門容易。 強(qiáng)大在于:它支持許多音頻操作,可實(shí)現(xiàn)多種API播放與錄制、多種不同音頻格式、音頻格式轉(zhuǎn)換(重采樣、位深、聲道等)、音頻編碼、多通道播放、音頻效果處理等等(詳細(xì)介紹可以看Github readme)。
Demo來自于官方Readme 另一方面,基于NAudio本身的架構(gòu)值得學(xué)習(xí) 其框架系統(tǒng)、完善,但實(shí)際開箱即用的功能并不是十分的齊全(相對(duì)于Bass),對(duì)于一個(gè)喜愛倒騰的人來說,容易激發(fā)學(xué)習(xí)研究的興趣,其官方教程與例子很是齊全。 快速入門:https://github.com/naudio/NAudio#tutorials 深入學(xué)習(xí):https://markheath.net/category/naudio(作者博客) 與其他播放方式對(duì)比基于使用角度考慮,NAudio的優(yōu)勢在于,它是一個(gè)原生的.NET輕量庫(其底層與其他API交互,但透明于使用者)。在不需要COM、獨(dú)立SDK、手動(dòng)P/Invoke的同時(shí),對(duì)于音頻交互更加可控、并且可以完成比以上更加復(fù)雜的功能。當(dāng)然其也有一定的不足,例如目前無法跨平臺(tái),底層API強(qiáng)依賴于Windows(作者表示期待.NET Core的Span<T>的后續(xù)發(fā)展,時(shí)機(jī)成熟會(huì)考慮跨平臺(tái))。 目前常見的播放方案:
還有很多未列出。 例1:制作一個(gè)簡易的音樂播放器目標(biāo):制作一個(gè)Winform的音樂播放器,僅實(shí)現(xiàn)讀取mp3、播放、暫停、停止、進(jìn)度拖動(dòng)及顯示、音量控制功能。 為了直觀的展示,本例將弱化OOP封裝思想。 回顧開篇的代碼:
顯然,這只能完成最基礎(chǔ)的播放功能。而且對(duì)于一個(gè)GUI播放器而言,這樣做會(huì)帶來很多問題。 首先它會(huì)在播放時(shí)阻塞線程,其次當(dāng)播放完畢就會(huì)立刻釋放資源,無法對(duì)其進(jìn)行任何控制。 針對(duì)以上缺陷完善代碼:
以上完成了一個(gè)可以打開文件、播放、暫停、停止、釋放資源的基礎(chǔ)功能播放器。接下來完善一下進(jìn)度顯示以及進(jìn)度調(diào)整。
以上完成了進(jìn)度顯示以及進(jìn)度調(diào)整,里面包含了一些UI上的優(yōu)化后的交互邏輯。其中涉及到了個(gè)人常用的Task / Cancellation的線程模式,可用Timer代替。 那么最后一個(gè)功能,如何進(jìn)行音量控制?事實(shí)上,IWavePlayer接口包含了Volume這個(gè)屬性,所以如果僅僅要達(dá)成這個(gè)目標(biāo)十分簡單,只需進(jìn)行屬性設(shè)置即可:
然而,這樣做法并不推薦,因?yàn)閷?duì)于內(nèi)部的WaveOutEvent等IWavePlayer實(shí)現(xiàn),實(shí)際效果是從改變了系統(tǒng)的合成器中的音量,如圖: 也就意味著,這將改變整個(gè)應(yīng)用程序的音量,不利于之后進(jìn)行程序內(nèi)部混音。 那將如何實(shí)現(xiàn)內(nèi)部音量處理呢?這就涉及了DSP音頻處理。在NAudio中,通過實(shí)現(xiàn)接口ISampleProvider,得到WaveStream提供音頻原始數(shù)據(jù)并且進(jìn)行處理,再將處理后的數(shù)據(jù)返回。將多個(gè)ISampleProvider鏈接起來進(jìn)行順序處理,最終將最外層的ISampleProvider交給IWavePlayer進(jìn)行初始化Init()這樣的一個(gè)處理模式。也就是說,其實(shí)基于上面的代碼來看,AudioFileReader本身既是WaveStream,也實(shí)現(xiàn)了ISampleProvider。
說了這么多有點(diǎn)繞口,用簡潔的方法表示,就是將之前的 在NAudio內(nèi)置提供的DSP中,實(shí)現(xiàn)了音量處理相關(guān)的類VolumeSampleProvider,因此直接拿來用即可。 以上內(nèi)容推薦結(jié)合NAudio源碼食用 根據(jù)以上所述,更新代碼:
這樣就對(duì)原始音頻進(jìn)行了處理(改變音量),然后輸出。 完成后的全部代碼:
這樣本例目標(biāo)功能就實(shí)現(xiàn)完畢了,能實(shí)現(xiàn)最基礎(chǔ)但是同時(shí)也可靠的音頻播放功能。 注(坑):
相關(guān)源代碼會(huì)隨著本系列進(jìn)行更新(如果不鴿): 順便宣傳一下個(gè)人在應(yīng)用的一個(gè)NAudio相關(guān)的開源項(xiàng)目: 參考: 該文章在 2025/4/30 9:33:22 編輯過
|
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |