环境:
系统: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的源码。
三 运行和关闭
- f5启动程序,此时程序等待捕获音频数据;
- 在电脑随便播放一个带音频的文件,例如xxx.mp4。
- 捕获到音频数据,我内部会将音频数据保存为名叫wasapi.pcm的pcm文件。
- 关闭直接点击窗口右上角的关闭按钮就行。
四 播放
# 请改成自己电脑对应的采样率、通道号、采样格式, 因为不同电脑可能不一样
ffplay -ar 48000 -ac 2 -f f32le wasapi.pcm
音视频流媒体资料领取和开发合作,加qq:1282840736