国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Windows(C#)音頻開發(fā)-Windows Core Audio(WASAPI)

這篇具有很好參考價值的文章主要介紹了Windows(C#)音頻開發(fā)-Windows Core Audio(WASAPI)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文的例子使用NAudio.CoreAudioApi實現(xiàn),全部為C#代碼

以下僅為個人理解,不一定都對,勿信~

閱讀這個文檔,最好具備C++知識,因為會用到Marshal命名空間進行指針操作

一、關(guān)于Windows Core Audio

Windows Core Audio API 是一種非常底層的音頻API,上層應(yīng)用為DirectSound或者WaveXXX接口等,WASAPI是其中的一部分。

Windows Core Audio API 構(gòu)成

Multimedia Device API(MMDevice):表示系統(tǒng)中的音頻設(shè)備節(jié)點(Audio Device Endpoint),Mmdeviceapi.h

Windows Audio Session API(WASAPI):用來操作音頻設(shè)備節(jié)點之間的音頻流(Audio Stream),Audioclient.h,Audiopolicy.h,Audiosessiontypes.h

DeviceTopology API:用來處理音頻設(shè)備節(jié)點拓撲結(jié)構(gòu)。可以設(shè)計音頻設(shè)備節(jié)點之間的數(shù)據(jù)流向,Devicetopology.h

EndpointVolume API:當音頻設(shè)備節(jié)點為聲卡獨占模式(Exclusive-mode)時,使用該API對Volume進行操作,Endpointvolume.h

以上頭文件位置,XXXX\Windows SDK\include,由于效率問題,這些接口以COM形式出現(xiàn),而不是.net或者.net freamwork

我的電腦中,通過VS安裝Windows SDK后,頭文件位置為C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um

一些常見C#庫都對其有映射,BASS.Net,NAudio。

以上接口調(diào)用順序:

CoCreateInstance -> IMMDeviceEnumerator -> IMMDevice -> WASAPI DTAPI EVAPI

各種例子,Microsoft Learn: Build skills that open doors in your career,Windows SDK and emulator archive | Microsoft Developer

二、用戶模式下的音頻組件 User-Mode Audio Components

User Client:QQ音樂

User Mode:Core Audio(Audio Endpoint)、Direct Sound(High-Level API)

Kernel Mode:驅(qū)動(Audio Driver)、聲音硬件(Audio Adapter)

Audio Endpoint Device:音頻設(shè)備節(jié)點,對聲音硬件的抽象,常見的聲音硬件有喇叭、耳機、話筒、麥克風

三、Audio Endpoint Device

Audio Endpoint:表示一個聲音設(shè)備

Audio Adapter:一個聲音設(shè)備處理聲音的流程,如A/D,D/A,輸出,輸入

MMDvice API用來處理和Audio Endpoint相關(guān)的操作。

實現(xiàn)方式:

C++

使用CoCreateInstance -> IMMDeviceEnumerator -> 其他API,包括:

IMMDevice、IMMEndpoint、IMMNotificationClient(熱插拔設(shè)備)

NAudio

MMDeviceEnumerator -> MMDevice

獲取到MMDevice后,調(diào)用Activate方法激活設(shè)備,隨后調(diào)用WASAPI,DTAPI,EVAPI

獲取到Audio Device后,就可以創(chuàng)建AudioClient實例進行WASAPI操作了

四、Audio Session

Audio Stream:音頻流,可以為Recording 或者 Playing

Audio Session:每一個Audio Stream都對應(yīng)一個Audio Stream,每一個Audio Session都對應(yīng)一個Audio Device

與上文提到的IMMNotificationClient,對應(yīng)Session也有事件處理接口IAudioSessionEvents,這些接口主要處理狀態(tài)變化、音量變化、開始Session、結(jié)束Session等和聲音處理相關(guān)的事件

獲取到Audio Device后可以通過AudioSessionManager來確認系統(tǒng)中有哪些Session

五、Audio Stream

獲取到Audio Device后,如果Activate成功,就可以得到AudioClient實例

通過AudioClient實例不僅可以獲取到Audio Session,還可獲取到Audio Stream

Audio Stream就是實際的音頻數(shù)據(jù),通過WASAPI對其進行操作文章來源地址http://www.zghlxwxcb.cn/news/detail-797271.html

六、Audio Render Client 一個播放音頻的例子

// 使用NAudio.WaveFileReader讀取wav文件
// 使用FileStream也可以,不過需要自己解析Wave Chunk
// 例子中使用的wav文件為48000,32bit,2-channel,PCM
// 因此每一幀的大小 frame = 32bit / 8 * 2 = 8 bytes
var reader = new WaveFileReader(odl.FileName);

// 每次讀取48000幀,也就是1秒鐘
// 每幀大小為4bytes
int frame = 48000;
var bytes = new Byte[frame * 8];
reader.Read(bytes, 0, frame * 8);

// 以下為Core Audio部分,使用的是NAudio.CoreAudioAPI的C#映射

// 獲取Core Audio Device遍歷接口
var enumer = new NAudio.CoreAudioApi.MMDeviceEnumerator();

// 獲取默認的Audio Device,Render表示輸出設(shè)備,Multimedia表示多媒體設(shè)備
// 備注:Capture是錄音設(shè)備,Console是交互設(shè)備,Communication是通訊設(shè)備
var device = enumer.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);

// 讀取文件的WAVE配置,并初始化給輸出設(shè)備
var format = reader.WaveFormat;

// Audio Device只是表示聲音設(shè)備,并不是真正處理聲音的抽象
// Audio Client才是處理聲音的抽象
var audioClient = device.AudioClient;
audioClient.Initialize(
     AudioClientShareMode.Shared,
     AudioClientStreamFlags.None,
     10000000,
     0,
     format,
     Guid.Empty);

// 獲取輸出設(shè)備每次可以填充的音頻緩沖區(qū)大小
// 單位是Frame,F(xiàn)rame與Byte的對應(yīng)關(guān)系要根據(jù)WaveFormat計算
var bufferSize = audioClient.BufferSize;

// 獲取輸出設(shè)備
var renderclient = audioClient.AudioRenderClient;

// 填充第一幀音頻輸出緩沖區(qū)
// 由于Core Audio是COM接口,要用Marshal.Copy完成指針內(nèi)存拷貝
var pData = renderclient.GetBuffer(frame);
Marshal.Copy(bytes, 0, pData, frame * 8);
renderclient.ReleaseBuffer(bufferSize, AudioClientBufferFlags.None);

// 開始播放音頻
audioClient.Start();

// 以下為循環(huán)填充,否則只播放一次緩沖區(qū)數(shù)據(jù)
var sec = 1;

var stop = false;
while (!stop)
{
    Thread.Sleep(1000);
    reader.Read(bytes, 0, frame * 8);
    pData = renderclient.GetBuffer(frame);
    Marshal.Copy(bytes, 0, pData, frame * 8);
    renderclient.ReleaseBuffer(bufferSize, AudioClientBufferFlags.None);
}

audioClient.Stop();

renderclient.Dispose();
renderclient = null;
audioClient.Dispose();
audioClient = null;
device.Dispose();
device = null;

七、Audio Capture 一個錄音的例子

// 與Audio Render部分的邏輯相同

var device = this.captureComboBox.SelectedItem as NAudio.CoreAudioApi.MMDevice;
var format = device.AudioClient.MixFormat;
var writer = new WaveFileWriter("capture.wav", format);
var audioClient = device.AudioClient;
audioClient.Initialize(
     AudioClientShareMode.Shared,
     AudioClientStreamFlags.AutoConvertPcm,
     10000000, // sec
     0,
     format,
     Guid.Empty);
var bufferSize = audioClient.BufferSize;
var captureclient = audioClient.AudioCaptureClient;

var sec = 1;

audioClient.Start();

while (!stop)
{
    // 0 表示沒有錄音
    var packageSize = captureclient.GetNextPacketSize();
    while (packageSize != 0)
    {
        int numFramestoRead = 0;
        AudioClientBufferFlags flags = AudioClientBufferFlags.None;
        IntPtr package = captureclient.GetBuffer(out numFramestoRead, out flags);
        captureclient.ReleaseBuffer(numFramestoRead);
        var length = numFramestoRead * 8;
        var buffer = new byte[length];
        Marshal.Copy(package, buffer, 0, length);
        writer.Write(buffer, 0, length);
        packageSize = captureclient.GetNextPacketSize();
    }
}

writer.Close();
writer.Dispose();
writer = null;

audioClient.Stop();
captureclient.Dispose();
captureclient = null;
audioClient.Dispose();
audioClient = null;
device.Dispose();
device = null;

到了這里,關(guān)于Windows(C#)音頻開發(fā)-Windows Core Audio(WASAPI)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • flutter開發(fā)實戰(zhàn)-just_audio實現(xiàn)播放音頻暫停音頻設(shè)置音量等

    flutter開發(fā)實戰(zhàn)-just_audio實現(xiàn)播放音頻暫停音頻設(shè)置音量等

    flutter開發(fā)實戰(zhàn)-just_audio實現(xiàn)播放音頻暫停音頻設(shè)置音量等 最近開發(fā)過程中遇到需要播放背景音等音頻播放,這里使用just_audio來實現(xiàn)播放音頻暫停音頻設(shè)置音量等 在pubspec.yaml引入just_audio 在iOS上,video_player使用的是AVPlayer進行播放。 在Android上,video_player使用的是ExoPlayer。 2.

    2024年02月13日
    瀏覽(22)
  • 音頻編輯開發(fā)SDK Audio DJ Studio for .NET Crack

    音頻編輯開發(fā)SDK Audio DJ Studio for .NET Crack

    11.7版本--Audio DJ Studio for .NET 是 MultiMedia Soft 開發(fā)的 .NET Windows Forms 自定義控件,可以輕松地向使用 Microsoft Visual Studio 編寫的 Winform 和 WPF 應(yīng)用程序 添加聲音播放和混音功能;由于與 DirectShow 編解碼器和 BASS 庫的集成,兩者都允許對最常見的聲音格式(如 MP3、WAV、Ogg Vorbis 和許

    2023年04月19日
    瀏覽(23)
  • C# Winform編程 NAudio 音頻庫

    C# Winform編程 NAudio 音頻庫

    項目=NuGet包管理器 搜索NAudio點擊安裝,自動安裝依賴庫。 安裝成功后工具箱會新增NAudio.WinForms控件 NAudio為.NET平臺下的開源庫,采用ML-PL協(xié)議,開源地址:https://github.com/naudio/NAudio支持多種音頻操作,可實現(xiàn)多種API播放與錄制、多種不同音頻格式、音頻格式轉(zhuǎn)換(重采樣、位

    2024年01月23日
    瀏覽(14)
  • C#程序設(shè)計——Windows應(yīng)用程序開發(fā),1、初步掌握Windows應(yīng)用程序的設(shè)計方法。2、掌握常用窗體控件的使用方法。

    C#程序設(shè)計——Windows應(yīng)用程序開發(fā),1、初步掌握Windows應(yīng)用程序的設(shè)計方法。2、掌握常用窗體控件的使用方法。

    初步掌握Windows應(yīng)用程序的設(shè)計方法。 掌握常用窗體控件的使用方法。 1、設(shè)計一個Windows應(yīng)用程序,創(chuàng)建一個用于添加學生個人基本信息的窗體,窗體下方法同時滾動信息“天行健,君子以自強不息!”。 ? 要示如下: 如圖1所示,設(shè)計窗體界面控件的布局 圖1 學生信息管理

    2024年02月10日
    瀏覽(39)
  • 【.NET Core】C#預(yù)處理器指令

    【.NET Core】C#預(yù)處理器指令

    預(yù)處理器指令 是指編譯器在實際編譯開始之前對信息進行預(yù)處理。通常是簡化源程序在不同的環(huán)境中運行。盡管編譯器沒有單獨的預(yù)處理器,但是本文所說的指令的處理方式與有預(yù)處理器時一樣??梢允褂眠@些指令來幫助條件編譯。不同于C和C++指令,不能使用這些指令來創(chuàng)

    2024年01月17日
    瀏覽(26)
  • 【c#,.NET】Entity Framework Core基礎(chǔ)詳解

    【c#,.NET】Entity Framework Core基礎(chǔ)詳解

    目錄 ? 一、EF Core概述 1.1 什么是ORM?? 1.2 EF Core的性能怎么樣? 二、EF Core入門 2.1 什么是Migration數(shù)據(jù)庫遷移: 2.2? EF Core數(shù)據(jù)的增刪改查 2.2.1 增加數(shù)據(jù) 2.2.2 查詢數(shù)據(jù) ?2.2.3 修改和刪除數(shù)據(jù) 三、EF Core的實體類配置 3.1 約定大于配置 3.2 EF Core兩種配置方式 3.2.1 Data Annotation 3.2.2?

    2024年02月04日
    瀏覽(51)
  • 【C#】.net core 6.0 依賴注入生命周期

    【C#】.net core 6.0 依賴注入生命周期

    給自己一個目標,然后堅持一段時間,總會有收獲和感悟! 對于.net core而言,依賴注入生命周期有三種瞬態(tài)(Transient)、作用域(Scoped)和單例(Singleton),無論使用哪種生命周期,都需要確保對象的線程安全性,并正確地處理依賴關(guān)系。 在了解依賴注入的生命周期前,我

    2024年02月03日
    瀏覽(89)
  • C# 靜態(tài)構(gòu)造函數(shù)未執(zhí)行 .net core框架

    代碼如下,在執(zhí)行Encoding.GetEncoding(“gb2312”);方法后報錯,說沒有找到對應(yīng)編碼,經(jīng)測試,發(fā)現(xiàn)是靜態(tài)構(gòu)造函數(shù)未執(zhí)行。 將代碼改成這樣就恢復(fù)正常了: 推測是編譯器認為靜態(tài)構(gòu)造函數(shù)無用,被優(yōu)化掉了。 也可能是靜態(tài)函數(shù)的調(diào)用方式并非在類加載時調(diào)用,而是在實例化

    2024年02月10日
    瀏覽(18)
  • C# 將音頻PCM數(shù)據(jù)封裝成wav文件

    之前實現(xiàn)了《C++ 將音頻PCM數(shù)據(jù)封裝成wav文件》,最近將其改成了C#版本。使用C#實現(xiàn)錄音功能時還是需要寫wav文件的,直接用C#實現(xiàn)也是比較簡單的,這樣可以免去不必要的依賴。 首先需要構(gòu)造wav頭部,wav文件音頻信息全部保存在頭部,我們要做的就是在PCM數(shù)據(jù)的前面加入w

    2024年02月07日
    瀏覽(21)
  • 用 C# 實現(xiàn)獨占音頻設(shè)備降低其它程序的音量

    C#調(diào)用 Windows 輔助功能 API \\\"AccSetRunningUtilityState\\\" 函數(shù)實現(xiàn)音頻避閃功能 音頻閃避是指當自身應(yīng)用程序,例如輔助功能程序,正在播放音頻的時候,降低其他應(yīng)用程序的音量。這樣可以讓用戶更清楚地聽到自身應(yīng)用程序的音頻,例如文字轉(zhuǎn)語音或者導航提示。Windows API 提供了一

    2024年02月03日
    瀏覽(10)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包