如何在媒体基础上捕捉声音? [英] how to capture sound on media foundation?

查看:135
本文介绍了如何在媒体基础上捕捉声音?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想捕获存储到文件中的声音

i want to capture sound to store into file

我做了如下的事情:

HRESULT CTsAudio :: EnumAudioCapture(IMFMediaSource) ** ppMediaSource)

{

  IMFActivate    ** ppActivate;

  IMFAttributes   * pAttributes = NULL;

  UINT32    uSourceAcitvate = 0;

HRESULT CTsAudio::EnumAudioCapture(IMFMediaSource **ppMediaSource)
{
 IMFActivate   **ppActivate ;
 IMFAttributes  *pAttributes = NULL;
 UINT32   uSourceAcitvate = 0;

  HRESULT hr = MFCreateAttributes(& pAttributes,1);

  if(FAILED(hr))

  {

   return hr;

  }

 HRESULT hr = MFCreateAttributes(&pAttributes,1);
 if (FAILED(hr))
 {
  return hr;
 }

  hr = pAttributes-> SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID);

 hr = pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_GUID);

  if((FAILED(hr)))

  {

   return hr;

 }

 if ((FAILED(hr)))
 {
  return hr;
 }

  hr = MFEnumDeviceSources(pAttributes,& ppActivate,& uSourceAcitvate);

  if(SUCCEEDED(hr))

  {

   if(uSourceAcitvate> 0)

    {

    hr = ppActivate [0] - > ActivateObject(IID_PPV_ARGS(ppMediaSource));

   

     if(FAILED(hr))

    {

    hr = E_FAIL;

   }

  }

 hr = MFEnumDeviceSources(pAttributes, &ppActivate,&uSourceAcitvate);
 if (SUCCEEDED(hr))
 {
  if (uSourceAcitvate > 0)
  {
   hr = ppActivate[0]->ActivateObject(IID_PPV_ARGS(ppMediaSource));
   
   if (FAILED(hr))
   {
    hr = E_FAIL;
   }
  }

  

   for(UINT32 i = 0; i< uSourceAcitvate; i ++)

     {  // ppActivate [i] - > ; ShutdownObject();

      ppActivate [i] - > Release();

     }
  

  

 }

  else

  {

   hr = E_FAIL;

 }

  // CoTaskMemFree(ppActivate );;
  return hr;

}

  
  for (UINT32 i = 0;i < uSourceAcitvate;i++)
    { //ppActivate[i]->ShutdownObject();
     ppActivate[i]->Release();
    }
  
  
 }
 else
 {
  hr = E_FAIL;
 }
 //CoTaskMemFree(ppActivate);
 return hr;
}

IMFMediaSource   * pMeidaSource = NULL;

 

  IMFMediaType   * pMediaType = NULL;

IMFMediaSource  *pMeidaSource = NULL;
 
 IMFMediaType  *pMediaType = NULL;

  HRESULT hr = EnumAudioCapture(& pMeidaSource);

  if(FAILED(hr))

  {

   return hr;

 }

 HRESULT hr = EnumAudioCapture(&pMeidaSource);
 if (FAILED(hr))
 {
  return hr;
 }

  hr = MFCreateSourceReaderFromMediaSource(pMeidaSource,NULL,& m_pMediaSourceR eader);

 hr = MFCreateSourceReaderFromMediaSource(pMeidaSource,NULL,&m_pMediaSourceReader);

hr = m_pMediaSourceReader-> GetNativeMediaType(0,0,& pMediaType);

  

  hr = m_pMediaSourceReader-> SetCurrentMediaType(0,NULL,pMediaType);

  BOOL fSelected = TRUE;

  hr = m_pMediaSourceReader-> SetStreamSelection(0,TRUE);

  return hr;

hr = m_pMediaSourceReader->GetNativeMediaType(0,0,&pMediaType);
  
 hr = m_pMediaSourceReader->SetCurrentMediaType(0,NULL,pMediaType);
 BOOL fSelected = TRUE;
 hr = m_pMediaSourceReader->SetStreamSelection(0,TRUE);
 return hr;

和我使用m_pMediaSourceReader中的pMediaType设置IMFSinkWriter :: AddStream();

and i set IMFSinkWriter::AddStream() by using pMediaType from m_pMediaSourceReader;

并设置IMFSinkWriter :: SetInputStream()

and i set IMFSinkWriter::SetInputStream()

hr = pMediaType-> SetGUID(MF_MT_MAJOR_TYPE,MFMediaType_Audio);

if(SUCCEEDED(hr))

{

  hr = pMediaType-> ; SetGUID(MF_MT_SUBTYPE,MFAudioFormat_WMAudioV8);

}

hr = pMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio);
if (SUCCEEDED(hr))
{
 hr = pMediaType->SetGUID(MF_MT_SUBTYPE, MFAudioFormat_WMAudioV8);
}

HRESULT hr = MFCreateSinkWriterFromURL(L" bcbb.wmv" ,NULL,NULL和& m_pSinkWriter);

HRESULT hr = MFCreateSinkWriterFromURL(L"bcbb.wmv",NULL,NULL,&m_pSinkWriter);

我发现我无法在bcbb.wmv和IMFSinkWriter ::中获取任何数据:: WriterSample()返回S_OK 。     &NBSP;&NBSP;&NBSP;&NBSP;   bcbb.wmv为空。

i found that i can't get any data in bcbb.wmv and IMFSinkWriter::WriterSample() returns S_OK .          bcbb.wmv is empty.

有人帮忙!

 

或者你可以给我用一个简短的程序来描述一下?代码示例更好。

Or can you give me a brief procedure to describe that? a code example is better.

推荐答案

已删除


这篇关于如何在媒体基础上捕捉声音?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆