Core Audioによるサウンドカード出力のキャプチャ
10092 ワード
関連するインタフェースは次のとおりです. IMMDeviceEnumerator IMMDevice IAudioClient IAudioCaptureClient
主なプロセス:マルチメディアデバイス列挙器(IMMDeviceEnumerator) を作成するマルチメディアデバイス列挙器により音声カードインターフェース(IMMDevice) を取得する.サウンドカードインタフェースにより取得するサウンドカードクライアントインタフェース .サウンドカードクライアントインターフェース(IAudioClient)を介してサウンドカード出力のオーディオパラメータを取得する、サウンドカードを初期化する、サウンドカード出力バッファのサイズを取得する、サウンドカード出力の収集をオン/停止する .サウンドカード採取クライアントインターフェース(IAudioCaptureClient)により採取サウンドカード出力データを取得し、内部バッファを制御 .サウンドカード出力クライアントインターフェース(IAudionderClient)により収集した音声データを音声出力装置のキャッシュ部に書き込むことができ、出力装置はIAudioClient::GetService関数によりIAudionderClientインターフェースを取得することができる.
コードの例:
//まずオーディオデバイスを列挙します.このとき、あなたのマシンで使用可能なすべてのデバイスを取得し、使用するデバイスを指定することができます.
hr = CoCreateInstance(
転載先:https://www.cnblogs.com/poissonnotes/p/7479570.html
主なプロセス:
コードの例:
//まずオーディオデバイスを列挙します.このとき、あなたのマシンで使用可能なすべてのデバイスを取得し、使用するデバイスを指定することができます.
hr = CoCreateInstance(
CLSID_MMDeviceEnumerator, NULL,
CLSCTX_ALL, IID_IMMDeviceEnumerator,
(void**)&pEnumerator);
EXIT_ON_ERROR(hr)
hr = pEnumerator->GetDefaultAudioEndpoint(
eCapture, eConsole, &pDevice);
EXIT_ON_ERROR(hr)
// ,
hr = pDevice->Activate(
IID_IAudioClient, CLSCTX_ALL,
NULL, (void**)&pAudioClient);
EXIT_ON_ERROR(hr)
hr = pAudioClient->GetMixFormat(&pwfx);
EXIT_ON_ERROR(hr)
// , , , , ,
hr = pAudioClient->Initialize(
AUDCLNT_SHAREMODE_SHARED,
0,
hnsRequestedDuration,
0,
pwfx,
NULL);
EXIT_ON_ERROR(hr)
// buffersize,
hr = pAudioClient->GetBufferSize(&bufferFrameCount);
EXIT_ON_ERROR(hr)
// , ,
hr = pAudioClient->GetService(
IID_IAudioCaptureClient,
(void**)&pCaptureClient);
EXIT_ON_ERROR(hr)
// Notify the audio sink which format to use.
hr = pMySink->SetFormat(pwfx);
EXIT_ON_ERROR(hr)
// Calculate the actual duration of the allocated buffer.
hnsActualDuration = (double)REFTIMES_PER_SEC *
bufferFrameCount / pwfx->nSamplesPerSec;
hr = pAudioClient->Start(); // Start recording.
EXIT_ON_ERROR(hr)
// Each loop fills about half of the shared buffer.
while (bDone == FALSE)
{
// ,
Sleep(hnsActualDuration/REFTIMES_PER_MILLISEC/2);
hr = pCaptureClient->GetNextPacketSize(&packetLength);
EXIT_ON_ERROR(hr)
while (packetLength != 0)
{
// ,
hr = pCaptureClient->GetBuffer(
&pData,
&numFramesAvailable,
&flags, NULL, NULL);
EXIT_ON_ERROR(hr)
if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
{
pData = NULL;
}
hr = pMySink->CopyData(
pData, numFramesAvailable, &bDone);
EXIT_ON_ERROR(hr)
hr = pCaptureClient->ReleaseBuffer(numFramesAvailable);
EXIT_ON_ERROR(hr)
hr = pCaptureClient->GetNextPacketSize(&packetLength);
EXIT_ON_ERROR(hr)
}
}
hr = pAudioClient->Stop();
EXIT_ON_ERROR(hr)
audacity
転載先:https://www.cnblogs.com/poissonnotes/p/7479570.html