一、Windows 音頻體系結(jié)構(gòu)
Windows的音頻應(yīng)用程序大部分通過微軟提供的上層api完成音頻處理和數(shù)據(jù)流抓取刮刑〉脖疲基于api封裝的媒體庫或應(yīng)用包括Media Foundation部念,MME(waveIn/waveOut)穴翩,Directsound等。Wasapi:Windows audio session API
最高級別 Api
最高級別 Api 用于應(yīng)用程序開發(fā)荸哟。?這些 Api 中當(dāng)前正在使用和支持假哎。
XAML?MediaElement 類(C#,VB敲茄, C++)
HTML音頻對象并視頻對象<標(biāo)記>(由網(wǎng)站和 Windows Web 應(yīng)用)
Windows.Media.Capture 命名空間(C#位谋,VB, C++)
Microsoft 媒體基礎(chǔ)(C++)
這些較舊的 Api 已棄用堰燎。
Windows.Media.MediaControlContract
低級別 Api
對于音頻流掏父,建議這些低級別 Api。
Wasapi 就可以了(高性能秆剪,但更復(fù)雜)
IXAudio2?(通常用于游戲)
二赊淑、音頻API和音頻采集和設(shè)備之間的調(diào)用關(guān)系
Audio Engine:
混合并處理音頻流
加載音頻處理對象,它們是處理音頻信號的特定于硬件的插件
?? Audio Service:
?安裝或控制音頻流
?實施winows策略仅讽,完成背景音頻播放處理等
?? (audio)EndPoint device:
?(音頻)輸入輸出設(shè)備:speaker陶缺,microphone等
?? Shared Mode & Exclusive Mode
?共享模式和排它模式,前者共享設(shè)備洁灵,后者獨享設(shè)備
?? Core Audio API:
?一系列音頻相關(guān)的API組合饱岸,可以相互組合完成音頻控制,音頻流捕獲和音頻控制等操作
2.?常用api介紹
2.1?IAudioClient
客戶端設(shè)備句柄徽千,通過?IMMDevice Activate獲取苫费。
IMMDevice?通過IMMDeviceEnumerator枚舉或者直接獲取當(dāng)前默認(rèn)的輸入輸出設(shè)備。相關(guān)對象和api:IMMDeviceEnumerator?EnumAudioEndpoints双抽、GetDefaultAudioEndpoint
其中GetDefaultAudioEndpoint的第一個參數(shù)eRender?設(shè)置為輸出設(shè)備speaker百框,eCapture為輸入設(shè)備microphone。
例如:
immDevice->Activate(__uuidof(IAudioClient),?CLSCTX_ALL,?NULL,
?reinterpret_cast<void**>(&audioClient)
對應(yīng)audioClient的capture服務(wù)牍汹。啟動服務(wù)前铐维,需要初始化audioClient.
audioClient->GetService(__uuidof(IAudioCaptureClient),
?reinterpret_cast<void**>(outCaputureClient));
一組相關(guān)的音頻流柬泽,獲取當(dāng)前會話,可以單獨控制當(dāng)前會話的音量等屬性嫁蛇。
IAudioClient :: Initialize?初始化時會將音頻流分配不同的會話锨并。
相關(guān)接口:IAudioSessionManager::GetAudioSessionControl
通過該接口,可以獲取音頻session控制和volume控制
通過該接口可以控制音頻流各個通道的音量
相關(guān)接口:IAudioClient::GetService
3.?音頻采集
通過擴展屏中的音頻抓取通過audioClient和audioCaptureClient在共享模式下抓取默認(rèn)speaker音頻數(shù)據(jù)睬棚。
3.1
IMMDeviceEnumerator* deviceEnum
::CoCreateInstance(CLSID_MMDEVICE_ENUMERATOR,?nullptr,?CLSCTX_ALL,
IID_MMDEVICE_ENUMERATOR,?reinterpret_cast<void**>(&deviceEnum))
3.2
IMMDevice* device
deviceEnum->GetDefaultAudioEndpoint(eRender,?eConsole, &device)
3.3
IAudioClient* audioClient
device->Activate(IID_IAUDIO_CLIENT,?CLSCTX_ALL,?NULL,
?reinterpret_cast<void**>(&audioClient))
3.4
WAVEFORMATEX* wavFmtX
IAudioCaptureClient**?outCaputureClient
audioClient->GetMixFormat(&wavFmtX)琳疏;
audioClient->Initialize(
?AUDCLNT_SHAREMODE_SHARED,
?AUDCLNT_STREAMFLAGS_LOOPBACK,
?hnsBufferDuration,
?0,
wavFmtX,
?nullptr);
audioClient->GetService(IID_IAUDIO_CAPTURE_CLIENT,
?reinterpret_cast<void**>(outCaputureClient));
3.5
audioClient->Start()
3.6
循環(huán)獲取數(shù)據(jù)
audioCaptureClient->GetBuffer(&audioData, &framesReadNum, &flag, &devPos, &pcPos)
3.7
audioClient->Stop();
audioCaptureClient->Release();
audioClient->Release();
三、代碼示例
采集示例:https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/capturing-a-stream
CoInitialize(NULL);
pFile = fopen("D://00.work//record.pcm", "wb");
fwrite(pData, numFramesAvailable*pwfx->nBlockAlign,1,? pPcmFile);
播放示例:https://docs.microsoft.com/zh-cn/windows/win32/coreaudio/rendering-a-stream
CoInitialize(NULL);
fp = fopen("D://00.work//record.pcm", "rb");
fread(pData, numFramesAvailable*pwfx->nBlockAlign,1,?fp);
示例詳解:http://www.reibang.com/p/968f684ecd83
關(guān)鍵數(shù)據(jù)結(jié)構(gòu):WAVEFORMATEX?
//設(shè)置屬性-1
//pwfx->wFormatTag = WAVE_FORMAT_PCM;
//pwfx->wBitsPerSample = 16;//FOSSID
//pwfx->cbSize = 0; //該字段一般為0闸拿,否則標(biāo)識的是擴展格式的信息?WAVEFORMATEXTENSIBLE
//pwfx->nBlockAlign = pwfx->nChannels * pwfx->wBitsPerSample / 8;//FOSSID
//pwfx->nAvgBytesPerSec = pwfx->nSamplesPerSec * pwfx->nBlockAlign;//FOSSID
//設(shè)置屬性-1 end
////設(shè)置屬性-2
//tmpWfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
//tmpWfx.Samples.wValidBitsPerSample = 32;
//tmpWfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
//tmpWfx.Format.wBitsPerSample = 32;
//tmpWfx.Format.cbSize = 22;
//tmpWfx.Format.nChannels = 2;
//tmpWfx.Format.nSamplesPerSec = 48000;
//tmpWfx.Format.nBlockAlign = tmpWfx.Format.nChannels * tmpWfx.Format.wBitsPerSample / 8;
//tmpWfx.Format.nAvgBytesPerSec = tmpWfx.Format.nSamplesPerSec * tmpWfx.Format.nBlockAlign;
////設(shè)置屬性-2-end
WAVEFORMATEX *pwfx = NULL;
WAVEFORMATEXTENSIBLE tmpWfx = { 0 };
WAVEFORMATEXTENSIBLE* ptmpWfx = (WAVEFORMATEXTENSIBLE*)pwfx;
https://blog.csdn.net/yi7900/article/details/7481599
在windows平臺上,WebRTC采用的是Windows Core Audio和Windows Wave技術(shù)來管理音頻設(shè)備书幕,還提供了一個混音管理器新荤。利用音頻設(shè)備,可以實現(xiàn)聲音輸出台汇,音量控制等功能苛骨。源代碼在webrtc\modules\audio_device\main目錄下,包含接口和各個平臺的源代碼苟呐。