如何在媒体基础上捕捉声音? [英] how to capture sound on media foundation?
问题描述
我想捕获存储到文件中的声音
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屋!