一个windows音频抓取开发包的使用教程

 

        这个开发包是我从项目中提取并整理出来的,可以支持抓取windows vista以上操作系统的音频源数据;支持的抓取的音频源包括系统声音和麦克风。同时还封装了一个音频的编解码库——AAC,并封装成了高集成度的接口,方便coder使用。

        下面贴上开发包的接口文件和demo,以供参考:

#define LIBAUDIO_API __declspec(dllexport)

#ifndef _LIB_AUDIO_H_
#define _LIB_AUDIO_H_

// 音频播放状态
typedef enum
{
	STOP = 0, PLAY  = 1, PAUSE = 2
}AUDIO_STATUS;

// 音频源类型
typedef enum
{
	AUDIO_MIX = 0,   // 系统音频源
	AUDIO_MIC = 1    // 麦克风音频源
}AUDIO_SOURCE;


// AAC编码器接口
class IAudioAACEncoder
{
public:
	// 编码PCM音频数据为AAC音频数据
	// pData : PCM数据缓冲区
	// nLen  :  PCM数据缓冲区大小
	// pStream : 输入输出参数, 编码后的AAC数据将会拷贝到这个缓冲区中
	// nStreanLen : 输入输出参数, 编码前表示pStream的原始大小;编码后表示编码后的数据大小
	virtual BOOL EncoderStream(void *pData, INT nLen, void *pStream, INT &nStreanLen) = 0;

	// 特殊用途, 给MP4录制音频时使用
	// ppAsc    : 输出参数, 将内部指针赋值给它
	// pnAscLen : 输出参数
	virtual BOOL GetSpecificInfo(UCHAR **ppAsc, ULONG *pnAscLen) = 0;
};


// AAC解码器接口
class IAudioAACDecoder
{
public:
	// 解码AAC音频数据为PCM音频数据
	// pData : AAC数据缓冲区
	// nLen  :  AAC数据缓冲区大小
	// pStream : 输入输出参数, 解码后的PCM数据将会拷贝到这个缓冲区中
	// nStreanLen : 输入输出参数, 解码前表示pStream的原始大小;解码后表示编码后的数据大小
	virtual BOOL DecoderStream(void *pData, INT nLen, void *pStream, INT &nStreanLen) = 0;
};

// 音频播放接口
class IAudioPlay
{
public:
	// 播放PCM音频
	// pStream    : PCM音频数据
	// nStreanLen : PCM音频数据长度
	virtual void PlayPCM(BYTE *pStream, INT nStreanLen) = 0;
	// 播放AAC音频
	// pStream    : AAC音频数据
	// nStreanLen : AAC音频数据长度
	virtual void PlayAAC(BYTE *pStream, INT nStreamLen) = 0;

	// 设置音频解码器
	// 如果没有设置音频解码器,PlayAAC函数将不起作用
	virtual void SetDecoder(IAudioAACDecoder *pDecoder) = 0;
	virtual IAudioAACDecoder* GetDecoder() = 0;
};

// 音频捕获接口
class IAudioCapture
{
public:
	virtual BOOL PlayAudio(void) = 0;
	virtual BOOL PauseAudio(void) = 0;
	virtual BOOL StopAudio(void) = 0;

	// 设置音频编码器
	// 如果没有设置编码器,则回调函数中返回的是PCM数据
	// 否则返回的就是AAC数据
	virtual void SetEncoder(IAudioAACEncoder *pEncoder) = 0;
	virtual IAudioAACEncoder* GetEncoder() = 0;

	virtual INT  GetVolume(void) = 0;
	virtual BOOL SetVolume(INT nVolume) = 0;

	virtual INT  GetSamplesPerSec(void) = 0; 
	virtual INT  GetChannels(void) = 0;
	virtual INT  GetBitsPerSample(void) = 0;

	virtual AUDIO_SOURCE GetAudioSource(void) = 0;
	virtual AUDIO_STATUS GetCurrentStatus(void) = 0;
};

// 音频数据回调接口
class IAudioDataCallBack
{
public:
	// 数据回调,捕获到的音频数据(PCM数据)将通过这个接口通知给用户
	// pAudio : 音频捕获接口对象
	// pData  : 音频数据(依赖于SetEncoder,如果设置了编码器,则出来的数据就是编码后的数据;如果没有设置,则出来的就是原始PCM数据)
	// nSize  : 数据长度
	virtual void OnAudioDataCallBack(IAudioCapture *pAudio, void* pData, INT nSize) { return; }
};


extern "C"
{
	// 创建音频捕获接口对象
	// eAudioSource  : 指定音频源,可以是麦克风(如果有的话),也可以是系统音频
	// pCallBack     : 音频数据回调接口
	// 备注:
	//    仅仅支持vista以上系统.
	LIBAUDIO_API IAudioCapture*    CreateAudioCapture(AUDIO_SOURCE eAudioSource, IAudioDataCallBack *pCallBack);
	LIBAUDIO_API void              DestoryAudioCapture(IAudioCapture *pAudio);

	// 创建AAC编码器对象
	// nSamplesPerSec  : 每秒样本数
	// nChannels       : 通道数
	// 备注:
	//     nSamplesPerSec和nChannels参数来自于音频源参数
	LIBAUDIO_API IAudioAACEncoder* CreateAACEncoder(INT nSamplesPerSec, INT nChannels);
	LIBAUDIO_API void              DestoryAACEncoder(IAudioAACEncoder *pAudioEncoder);

	// 创建AAC解码器对象
	// nSamplesPerSec  : 每秒样本数
	// nChannels       : 通道数
	// 备注:
	//     nSamplesPerSec和nChannels参数来自于音频源参数
	LIBAUDIO_API IAudioAACDecoder* CreateAACDecoder(INT nSamplesPerSec, INT nChannels);
	LIBAUDIO_API void              DestoryAACDecoder(IAudioAACDecoder *pAudioDecoder);

	// 创建音频播放对象
	// nSamplesPerSec  : 每秒样本数
	// nBitsPerSample  : 每个样本多少bit
	// nChannels       : 通道数
	// 备注:
	//     nSamplesPerSec,nBitsPerSample和nChannels参数来自于音频源参数
	LIBAUDIO_API IAudioPlay*       CreateAudioPlay(INT nSamplesPerSec, INT nBitsPerSample, INT nChannels);
	LIBAUDIO_API void              DestoryAudioPlay(IAudioPlay *pAudioPlay);
}

#endif
#include "libaudio.h"

#pragma comment(lib,"libaudio.lib")

// 音频播放对象
static IAudioPlay *play = NULL;

// 数据回调接口
class CAudioData : public IAudioDataCallBack
{

public:
	// 数据回调,捕获到的音频数据(PCM数据)将通过这个接口通知给用户
	// pAudio : 音频捕获接口对象
	// pData  : 音频数据(依赖于SetEncoder,如果设置了编码器,则出来的数据就是编码后的数据;如果没有设置,则出来的就是原始PCM数据)
	// nSize  : 数据长度
	virtual void OnAudioDataCallBack(IAudioCapture *pAudio, void* pData, INT nSize)
	{ 
		printf("pData=%p, nSize=%d\n", pData, nSize);
		play->PlayAAC((BYTE*)pData, nSize);
		return; 
	}
};


void test_libaudio()
{
	CAudioData *pAudioData = new CAudioData();
	
	// 创建音频抓取对象
	IAudioCapture *pAudioCapture = CreateAudioCapture(AUDIO_MIC, pAudioData);
	if (pAudioCapture)
	{
		//
		// 设置音频抓取对象的编码器
		// 备注:可以不用设置。不设置的话,默认回调函数中传回的数据是PCM的。设置的话,就会自动将PCM编码成AAC。
		IAudioAACEncoder *pEncoder = CreateAACEncoder(pAudioCapture->GetSamplesPerSec(), pAudioCapture->GetChannels());
		pAudioCapture->SetEncoder(pEncoder);

		// 创建一个音频播放对象(用于验证抓取的数据)
		play = CreateAudioPlay(pAudioCapture->GetSamplesPerSec(), pAudioCapture->GetBitsPerSample(), pAudioCapture->GetChannels());
		
		// 给音频播放对象设置解码器
		// 备注: 这一步与音频抓取对象的编码器是对应的,一个自动编码,一个自动解码
		IAudioAACDecoder *pDecoder = CreateAACDecoder(pAudioCapture->GetSamplesPerSec(), pAudioCapture->GetChannels());
		play->SetDecoder(pDecoder);

		// 启动抓取对象,开始抓取数据
		pAudioCapture->PlayAudio();
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	test_libaudio();

	char ch = getchar();
	return 0;
}

SDK下载:点这里

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值