关于OpenAL 音频采集的问题.

考虑到OpenAL已经是一套成熟的音频播放,采集框架,而且是跨平台的,所以我们经常会用它来做音频播放,采集。便于在iOS/Android/Mac 上都可以跑。

之前我们已经贴了一个在iOS上播放音频的代码。这次我们贴上音频采集的代码。采集比播放代码更简单。

#ifndef OPENALAUDIOCAPTURE_H
#define OPENALAUDIOCAPTURE_H

#include 
#include 

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

你可能感兴趣的:(音视频开发,OpenAL,ffmpeg,音视频,iOS,Android)