Audio Capture在应用程序中不起作用,但在GraphStudioNext中有效。 [英] Audio Capture does not work in the application but works in GraphStudioNext.
本文介绍了Audio Capture在应用程序中不起作用,但在GraphStudioNext中有效。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
这是C ++代码:
Here is the C++ code:
#include <atlbase.h>
#include <atlimage.h>
#include <Dshow.h>
#pragma comment(lib, "Strmiids.lib")
#include "Qedit.h"
void init_capture();
CComPtr<IGraphBuilder> pGraph; //менеджер графа фильтров
CComPtr<ICaptureGraphBuilder2> pBuild; //граф фильтра аудио\видео захвата
CComPtr<IBaseFilter> pCapture; //аудиофильтр
CComPtr<IBaseFilter> pAudioRenderer; //аудиофильтр
CComPtr<ICreateDevEnum> pDevEnum;
CComPtr<IEnumMoniker> pEnum;
CComPtr<IMoniker> pMoniker;
CComPtr<IMediaControl> pMediaControl;
CComPtr<IMediaEventEx> pEvent;
CComPtr<IBaseFilter> pAudioGrabberF;
CComPtr<ISampleGrabber> pAudioGrabber;
void CCapture_Audio_MFCDlg::init_capture()
{
HWND parameter_hwnd = m_hWnd;
HRESULT hr;
{
//Создание графа-фильтров - Create the Capture Graph Builder
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );
if (SUCCEEDED(hr))
{
//Создание менеджера графа фильтров - Create the Filter Graph Manager
hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
if (SUCCEEDED(hr))
{
//Initialize the Capture Graph Builder
pBuild->SetFiltergraph(pGraph);
// Find system device enumerator to find a video capture device.
hr = CoCreateInstance(CLSID_SystemDeviceEnum, 0, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (LPVOID*)&pDevEnum);
if(SUCCEEDED(hr))
{
//создает счетчик для определенной категории устройств
hr = pDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, &pEnum, 0);
if(SUCCEEDED(hr))
{
if( pEnum->Next(1, &pMoniker,0) == S_OK )
{
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)&pCapture);
if(SUCCEEDED(hr))
{
pGraph->AddFilter(pCapture, L"Capture Filter");
// CLSID_NullRenderer
hr = CoCreateInstance(CLSID_AudioRender, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pAudioRenderer);
if (SUCCEEDED(hr))
{
// L"Null Filter"
pGraph->AddFilter(pAudioRenderer, L"Audio Renderer Filter");
// Create the Sample Grabber filter.
hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&pAudioGrabberF));
if (SUCCEEDED(hr))
{
hr = pGraph->AddFilter(pAudioGrabberF, L"Sample Grabber");
if (SUCCEEDED(hr))
{
hr = pAudioGrabberF->QueryInterface(IID_ISampleGrabber, (void**)&pAudioGrabber);
if (SUCCEEDED(hr))
{
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(mt));
mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
hr = pAudioGrabber->SetMediaType(&mt);
if (SUCCEEDED(hr))
{
hr = pAudioGrabber->SetOneShot(TRUE);
if (SUCCEEDED(hr))
{
hr = pAudioGrabber->SetBufferSamples(TRUE);
if (SUCCEEDED(hr))
{
hr = pBuild->RenderStream(/*&PIN_CATEGORY_PREVIEW*/NULL, NULL/*&MEDIATYPE_Video*/, pCapture, pAudioGrabberF, pAudioRenderer); //3,4,5 Параметры - фильтры, которые объединены в граф
//hr = pBuild->RenderStream(/*&PIN_CATEGORY_PREVIEW*/NULL, NULL/*&MEDIATYPE_Video*/, pCapture, NULL, pAudioRenderer); //3,4,5 Параметры - фильтры, которые объединены в граф
HWND hWnd = parameter_hwnd;
// Set the owner window to receive event notices.
hr = pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);
hr = pEvent->SetNotifyWindow((OAHWND)hWnd, 0, 0);
// Run the graph.
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
hr = pMediaControl->Run();
SaveGraphFile(pGraph, L"c:\\temp\\audio_capture.grf");
}
}
}
_FreeMediaType(mt);
}
}
}
}
}
}
}
}
}
}
}
}
音频捕获在MFC应用程序中不起作用,但在GraphStudioNext中有效。
代码
Audio Capture does not work in the MFC application but works in GraphStudioNext.
Code with
hr = pBuild->RenderStream(/*&PIN_CATEGORY_PREVIEW*/NULL, NULL/*&MEDIATYPE_Video*/, pCapture, NULL, pAudioRenderer); //3,4,5 Параметры - фильтры, которые объединены в граф
而不是
instead of
hr = pBuild->RenderStream(/*&PIN_CATEGORY_PREVIEW*/NULL, NULL/*&MEDIATYPE_Video*/, pCapture, pAudioGrabberF, pAudioRenderer); //3,4,5 Параметры - фильтры, которые объединены в граф
适用于应用程序和GraphStudioNext。
所以使用samplagrabber不起作用。
init_capture( );在
works both in the application and in GraphStudioNext.
So with samplagrabber does not work.
init_capture(); is called in
BOOL CCapture_Audio_MFCDlg::OnInitDialog()
// Release the format block for a media type.
void _FreeMediaType(AM_MEDIA_TYPE& mt)
{
if (mt.cbFormat != 0)
{
CoTaskMemFree((PVOID)mt.pbFormat);
mt.cbFormat = 0;
mt.pbFormat = NULL;
}
if (mt.pUnk != NULL)
{
// pUnk should not be used.
mt.pUnk->Release();
mt.pUnk = NULL;
}
}
代码有什么问题?
What is wrong in the code?
推荐答案
这是解决方案:
应该使用FALSE作为此函数的参数,不要停止图形捕获所有音频帧。
Here is the solution:
One should use FALSE as argument to this function to do not stop the graph to capture all the audio frames.
hr = pAudioGrabber->SetOneShot(FALSE);
这篇关于Audio Capture在应用程序中不起作用,但在GraphStudioNext中有效。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文