考虑到OpenAL已经是一套成熟的音频播放,采集框架,而且是跨平台的,所以我们经常会用它来做音频播放,采集。便于在iOS/Android/Mac 上都可以跑。
之前我们已经贴了一个在iOS上播放音频的代码。这次我们贴上音频采集的代码。采集比播放代码更简单。
#ifndef OPENALAUDIOCAPTURE_H
#define OPENALAUDIOCAPTURE_H
#include <OpenAL/al.h>
#include <OpenAL/alc.h>
using namespace std;
class OpenALAudioCapture
{
public:
OpenALAudioCapture();
~OpenALAudioCapture();
private:
ALCdevice* m_CaptureDevice;
unsigned char m_audioData[1920];
ALint value;
int m_captureLength;
bool m_bRecordAudio;
public:
void initOpenALCaptureParams(char* deviceName,int sampleRate,int format,int captureLen);
void startCaptureAudio();
int captureAudioToBuffer(unsigned char* outBuffer);
void stopCaptureAudio();
};
#endif // OPENALAUDIOCAPTURE_H
#include "openalaudiocapture.h"
OpenALAudioCapture::OpenALAudioCapture()
{
m_captureLength=0;
m_bRecordAudio=false;
}
OpenALAudioCapture::~OpenALAudioCapture()
{
alcCaptureCloseDevice(m_CaptureDevice);
}
void OpenALAudioCapture::initOpenALCaptureParams(char* deviceName,int sampleRate,int format,int captureLen)
{
m_bRecordAudio=false;
m_captureLength=captureLen;
m_CaptureDevice = alcCaptureOpenDevice(deviceName, sampleRate, format, captureLen);
}
void OpenALAudioCapture::startCaptureAudio()
{
if(m_CaptureDevice==NULL){
return;
}
alcCaptureStart(m_CaptureDevice);
alDistanceModel(AL_NONE);
m_bRecordAudio=true;
}
int OpenALAudioCapture::captureAudioToBuffer(unsigned char* outBuffer)
{
if(!m_bRecordAudio){
return -1;
}
memset(m_audioData,0,sizeof(m_audioData));
alcGetIntegerv(m_CaptureDevice, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(ALshort), &value);
if(value > 0 ){
alcCaptureSamples(m_CaptureDevice, (ALCvoid *)m_audioData, value);
//得到buffer后做相应的处理.
return value;
}
return 0;
}
void OpenALAudioCapture::stopCaptureAudio()
{
alcCaptureStop(m_CaptureDevice);
m_bRecordAudio=false;
}
初始化的时候,要初始化一些参数。
initOpenALCaptureParams("USB PnP Audio",8000,AL_FORMAT_MONO16,960);
这个地方需要注意的是,音频采集,如果我们使用的是 16位的,双通道的( channel =2 ),我们得到的Buffer, 一定要 x 4 才是我们真正采集到的数据。
如果我们采集的时候,用的 8位的,channel=1,则不需要。 这里则需要 x 2 . 所以我们采集的时候是960, 我们m_audioBuffer[1920] 是2倍的关系. 初学者要注意.
initOpenALCaptureParams("USB PnP Audio",8000,AL_FORMAT_MONO16,960);
小广告:
FFmpeg音视频高级开发实战5 iOS/Android/windows/Linux
http://edu.csdn.net/course/detail/2314