这个开发包是我从项目中提取并整理出来的,可以支持抓取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下载:点这里