Audio Capture在应用程序中不起作用,但在GraphStudioNext中有效。 [英] Audio Capture does not work in the application but works in GraphStudioNext.

查看:47
本文介绍了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屋!

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