音频采集-windows采集-----05-----obs源码wasapi模块分离demo

环境:
系统:windows。
编译器:vs2022。
依赖库:Avrt.lib。
在这里插入图片描述

一 项目说明

本项目是从obs源码中抽离wasapi的音频采集模块,用于更好说明如何在windows采集音频数据,对于合并到商业级项目是非常好的代码。
在这里插入图片描述

二 代码说明

调用的代码比较简单,main.cpp:

#include <iostream>
#include <Windows.h>
#include <thread>
#include <chrono>
#include <string>
#include "win-wasapi.h"

using namespace std;

bool initialize_com(void)
{
	const HRESULT hr = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
	const bool success = SUCCEEDED(hr);
	return success;
}

int main() {

	if (!initialize_com()) {
		return -1;
	}

	const HMODULE hRtwq = LoadLibrary(L"RTWorkQ.dll");
	if (hRtwq) {
		typedef HRESULT(STDAPICALLTYPE* PFN_RtwqStartup)();
		PFN_RtwqStartup func =
			(PFN_RtwqStartup)GetProcAddress(hRtwq, "RtwqStartup");
		func();
	}

	AudioCapture ac;
	int ret = ac.open();
	if (ret < 0) {
		return -1;
	}

	//std::this_thread::sleep_for(std::chrono::seconds(100));
	string s;
	cin >> s;

	ac.close();

	return 0;
}

主要是封装了AudioCapture类。

class WASAPISource;
class AudioCapture {
public:
	AudioCapture();

	virtual ~AudioCapture();

	virtual int open();

	virtual void close();

protected:
	WASAPISource* _wasapi_source;
};

实现:

AudioCapture::AudioCapture() {
	_wasapi_source = NULL;
}

AudioCapture::~AudioCapture() {

}

int AudioCapture::open() {
	auto wasapi_source = new WASAPISource(false, NULL, SourceType::DeviceOutput);
	if (!wasapi_source)
		return -1;

	_wasapi_source = wasapi_source;
	return 0;
}

void AudioCapture::close() {
	if (_wasapi_source) {
		delete _wasapi_source;
		_wasapi_source = NULL;
	}
}

就是对WASAPISource的封装,WASAPISource的内容就是obs的源码。

三 运行和关闭

  1. f5启动程序,此时程序等待捕获音频数据;
  2. 在电脑随便播放一个带音频的文件,例如xxx.mp4。
  3. 捕获到音频数据,我内部会将音频数据保存为名叫wasapi.pcm的pcm文件。
  4. 关闭直接点击窗口右上角的关闭按钮就行。

在这里插入图片描述

四 播放

# 请改成自己电脑对应的采样率、通道号、采样格式, 因为不同电脑可能不一样
ffplay -ar 48000 -ac 2 -f f32le wasapi.pcm

在这里插入图片描述

音视频流媒体资料领取和开发合作,加qq:1282840736

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值