音频

DirectShow技术

DirectShow包含了音视频的内容,是音视频处理的框架。DirectShow会使用DirectSound等技术来管理设备,完成音频数据采集,音频播放等。DirectShow是面向程序应用开发的音视频处理开发框架。
音频架构图

DirectSound

微软doc链接

音频输入采集

获取所有音频采集设备

  • 相关函数DirectSoundCaptureEnumerateDSEnumCallback
  • DirectSound的这个接口并不能枚举获取到所有的音频输入设备,对于某些采集卡内置声道无法获取到
  • DSEnumCallbak只能获取到设备的GUID、描述信息(设备显示的名称)、路径id。而且描述信息只有32个字符,可能无法显示完整的设备名称。

创建Capture、Buffer

HRESULT CreateCaptureBuffer(LPDIRECTSOUNDCAPTURE8 pDSC, 
                            LPDIRECTSOUNDCAPTUREBUFFER8* ppDSCB8)
{
  HRESULT hr;
  DSCBUFFERDESC               dscbd;
  LPDIRECTSOUNDCAPTUREBUFFER  pDSCB;
  WAVEFORMATEX                wfx =
    {WAVE_FORMAT_PCM, 2, 44100, 176400, 4, 16, 0};
    // wFormatTag, nChannels, nSamplesPerSec, mAvgBytesPerSec,
    // nBlockAlign, wBitsPerSample, cbSize
 
  if ((NULL == pDSC) || (NULL == ppDSCB8)) return E_INVALIDARG;
  dscbd.dwSize = sizeof(DSCBUFFERDESC);
  dscbd.dwFlags = 0;
  dscbd.dwBufferBytes = wfx.nAvgBytesPerSec;
  dscbd.dwReserved = 0;
  dscbd.lpwfxFormat = &wfx;
  dscbd.dwFXCount = 0;
  dscbd.lpDSCFXDesc = NULL;
 
  if (SUCCEEDED(hr = pDSC->CreateCaptureBuffer(&dscbd, &pDSCB, NULL)))
  {
    hr = pDSCB->QueryInterface(IID_IDirectSoundCaptureBuffer8, (LPVOID*)ppDSCB8);
    pDSCB->Release();  
  }
  return hr;
}

从Capture Buffer中读取数据

  • 使用循环不断调用GetCurrentPositionLockUnlock读取Buffer中的值
  • 使用SetNotificationPositions设置事件(Event)触发的读取点。当Capture Buffer在某个Position可读时触发事件,此时再去读取。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值