【音视频】音频采集-WASAPI(四)

本文详细介绍了使用WASAPI进行音频采集的技术,该技术适用于Windows Vista及以后的操作系统。主要流程包括初始化采集器,设置音频属性和渲染器,以及开启音频采集线程分别进行麦克风和扬声器的采集。通过这些步骤,可以获取到pcm格式的音频数据。
摘要由CSDN通过智能技术生成

本篇主要介绍音频的采集技术,使用的是WASAPI技术。

技术简介

WASAPI全称是Windows Audio Session API(Windows音频会话API),是从Windows Vista之后引入的UAA(Universal Audio Architecture)音频架构所属的API。

主要流程和代码

1、初始化采集器

int WasapiCaptor::init(bool isMic, const std::string& deviceId, const std::string& deviceName)
{
   
	int err = ERROR_CODE_OK;

	if (!m_comInited) {
   
		err = ERROR_CODE_COM_INIT_FAILED;
		return err;
	}

	if (m_inited) {
   
		return err;
	}

	m_isMic = isMic;
	m_deviceId = deviceId;
	m_deviceName = deviceName;

	do {
   
		HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL,
			__uuidof(IMMDeviceEnumerator), (void**)&m_deviceEnumerator);
		if (FAILED(hr)) {
   
			err = ERROR_CODE_COM_CREATE_INSTANCE_FAILED;
			break;
		}

		hr = m_deviceEnumerator->GetDevice(HELPER::StringConverter::convertUtf8ToUnicode(m_deviceId).c_str(), &m_endpointDevice);
		if (FAILED(hr)) {
   
			err = ERROR_CODE_COM_GET_AUDIO_ENDPOINT_FAILED;
			break;
		}

		hr = m_endpointDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, nullptr, (void**)&m_captureClient);
		if (FAILED(hr)) {
   
			err = ERROR_CODE_COM_ACTIVE_DEVICE_FAILED;
			break;
		}

		hr = m_captureClient->GetMixFormat(&m_waveFmt);
		if (FAILED(hr)) {
   
			err = ERROR_CODE_COM_GET_MIX_FORMAT_FAILED;
			break;
		}

		initFromMixFormat(m_waveFmt);

		DWORD streamFlags = AUDCLNT_STREAMFLAGS_EVENTCALLBACK;
		if (!m_isMic) {
   
			streamFlags |= AUDCLNT_STREAMFLAGS_LOOPBACK;
		}
		hr = m_captureClient->Initialize(AUDCLNT_SHAREMODE_SHARED, streamFlags, WASAPI_CAPTOR_REF_TIME_PER_SEC, 0, m_waveFmt, nullptr);
		if (FAILED(hr)) {
   
			err = ERROR_CODE_COM_INIT_AUDIO_CLIENT_FAILED;
			break;
		}

		// For ouotput mode, capture event will not signal when there is nothing rendering,
		// so we run a render thread and rendering silent pcm data all the time.
		if (!m_isMic) {
   
			err = initRenderer();
			HCMDR_ERROR_CODE_BREAK(err);
		}

		hr = m_captureClient->GetBufferSize(&m_captureSampleCount);
		if (FAILED(hr)) {
   
			err = ERROR_CODE_COM_GET_BUFFER_SIZE_FAILED;
			break;
		}

		hr = m_captureClient->GetService(__uuidof(IAudioCaptureClient), (void**)&m_captor);
		if (FAILED(hr)) {
   
			err = ERROR_CODE_COM_GET_CAPTOR_FAILED;
			break;
		
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值