录制声卡和麦克风

这篇博客介绍了如何利用Core Audio API进行声卡和麦克风的录音操作。由于未实现混音功能,因此一次只能录制一种音频源,并将结果保存为test.pcm文件,格式为PCM,采样率为48000,位宽32,通道数2。作者提供了代码示例,并分享了运行效果及使用ffplay播放音频的命令。
摘要由CSDN通过智能技术生成

本篇博客使用core audio api录制声卡和麦克风,但是不能同时来,因为这里没有做混音,所以同时只能录制一种,录制的音频会保存成test.pcm,格式是PCM,参数是(48000 32 2),不多说了,直接上代码,希望对各位小伙伴有用。

AudioCapT.h

#pragma once
#include <windows.h>
#include <windowsx.h>
#include <mmdeviceapi.h>
#include <Audioclient.h>
#include <process.h>
#include <avrt.h>
#include <list>

typedef struct
{
    INT        iDataLen;
    LPBYTE    pData;
}Audio_Data, * PAudio_Data;

typedef std::list<PAudio_Data> AudioList;

class CAudioCapT
{
public:

    enum {SPEAKER = 1,MICPHONE};

public:
    CAudioCapT();
    ~CAudioCapT();
    //开始捕获
    bool Start();
    //停止捕获
    bool Stop();

    void SaveFormat(WAVEFORMATEX * wf);

    void SetDeiveType(int nType);

    int GetDeviceType();
    
    Audio_Data * GetAudio();

    bool Init();

    IMMDevice * GetDevice();

    HANDLE GetStartEventHandle();

    HANDLE GetStopEventHandle();

    WAVEFORMATEX * GetWaveFormat();

    AudioList * GetAudioList();

    void ClearAudioList();

    DWORD GetDataSize();

    bool m_bStop;

protected:
    bool m_bInit;
    HANDLE m_hThreadCapture;
    static UINT __stdcall _CaptureThreadProc(LPVOID param);

    void OnCaptureData(LPBYTE pData, INT iDataLen);

    WAVEFORMATEX m_WaveFormat;

    int m_nDeviceType = 0;

    AudioList m_al;

    CRITICAL_SECTION m_cs;

    IMMDevice * m_pDevice = NULL;

    HANDLE m_hEventStarted = NULL;

    HANDLE m_hEventStop = NULL;

    IMMDevice * GetDefaultDevice(int nType);

    DWORD m_dwDataSize;
};

AudioCapT.cpp

#include "stdafx.h"
#include "AudioCapT.h"

#define REFTIMES_PER_SEC  10000000
#define REFTIMES_PER_MILLISEC  10000

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

CAudioCapT::CAudioCapT()
{
    m_dwDataSize = 0;
    m_bInit = false;
    m_hThreadCapture = NULL;
    m_bStop = false;
    ::InitializeCriticalSection(&m_cs);
}


CAudioCapT::~CAudioCapT()
{
    Audio_Data * pTmp = NULL;

    for (std::list<Audio_Data *>::iterator it = m_al.begin(); it != m_al.end(); it++)
    {
        pTmp = *it;
        if (pTmp)
        {
            if (pTmp->pData)
                delete[] pTmp->pData;
            delete pTmp;
        }
    }

    m_al.clear();
    ::DeleteCriticalSection(&m_cs);
}

voi
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孟建行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值