求个采集摄像头文件到C++的WMV的例子

银点 2013-05-18 09:10:11
以前都是用ffdshow 存为MP4的

现在要改成WMV的,在graph上简单了,但是我MediaControl->Run()的时候总是出错

用graphedit查看,graph都建立好了,连接也正常,文件名也设置了

HRESULT WMVCapture::BuildGraph()
{
HRESULT hr = S_OK;

hr = AddFilter(&VideoSourceFilter,CLSID_VideoInputDeviceCategory,L"FaceTime HD Camera (Built-in)");

if(FAILED(hr))
{

return hr;
}


hr = AddFilter(&AsfWriter,CLSID_LegacyAmFilterCategory,L"WM ASF Writer");
if(FAILED(hr))
{

return hr;
}
IConfigAsfWriter *pAsf = NULL;
hr = AsfWriter->QueryInterface( IID_IConfigAsfWriter, (void**)&pAsf );
if(pAsf != NULL)
{
hr = pAsf->ConfigureFilterUsingProfileGuid(WMProfile_V80_BESTVBRVideo);
pAsf->Release();
pAsf = NULL;
}


hr = AsfWriter->QueryInterface(IID_IFileSinkFilter, (void**) &FileSink);
if(FAILED(hr))
{

return hr;
}

hr = CaptureGraph->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
VideoSourceFilter, NULL,AsfWriter);
if(FAILED(hr))
{

return hr;
}

this->CaptureState = READY;
return hr;

}

HRESULT WMVCapture::StartCapture(FileName)
{
//HRESULT hr = FileSink->SetMode(1); //AM_FILE_OVERRITE
// if(FAILED(hr))
// return hr;
HRESULT hr;

if(FAILED(hr = FileSink->SetFileName(FileName,NULL)))
return hr;
hr = MediaControl->Run();
if(SUCCEEDED(hr))
this->CaptureState = RUNNING;
return hr;

}

...全文
68 点赞 收藏 6
写回复
6 条回复
银点 2013年05月18日
引用 5 楼 dream238 的回复:
[quote=引用 4 楼 silverpot 的回复:] 用GraphEdit手动建的graph就录制就不报错
尝试改变下顺序,在RenderStream之前就设置好输出的文件路径。 另外,0x800705AA “Insufficient System Resources” ,说明了你的摄像头可能已经被其他程序占用了,确保你的程序使用时没有其他程序正在使用设备。 [/quote] 谢谢
回复 点赞
ArcRain 2013年05月18日
引用 4 楼 silverpot 的回复:
用GraphEdit手动建的graph就录制就不报错
尝试改变下顺序,在RenderStream之前就设置好输出的文件路径。 另外,0x800705AA “Insufficient System Resources” ,说明了你的摄像头可能已经被其他程序占用了,确保你的程序使用时没有其他程序正在使用设备。
回复 点赞
银点 2013年05月18日
用GraphEdit手动建的graph就录制就不报错
回复 点赞
银点 2013年05月18日
这是我在网上搜到的信息: IMediaControl::Run method failed with 0x800705AA “Insufficient System Resources”
回复 点赞
银点 2013年05月18日
引用 1 楼 dream238 的回复:
[quote=引用 楼主 silverpot 的回复:] 以前都是用ffdshow 存为MP4的 现在要改成WMV的,在graph上简单了,但是我MediaControl->Run()的时候总是出错 用graphedit查看,graph都建立好了,连接也正常,文件名也设置了

HRESULT WMVCapture::BuildGraph()
{
	HRESULT hr = S_OK;

	hr = AddFilter(&VideoSourceFilter,CLSID_VideoInputDeviceCategory,L"FaceTime HD Camera (Built-in)");

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

	hr = AddFilter(&AsfWriter,CLSID_LegacyAmFilterCategory,L"WM ASF Writer");
	if(FAILED(hr))
	{
		
		return hr;
	}
	IConfigAsfWriter *pAsf = NULL;
	hr = AsfWriter->QueryInterface( IID_IConfigAsfWriter, (void**)&pAsf );
	if(pAsf != NULL)
	{
		hr = pAsf->ConfigureFilterUsingProfileGuid(WMProfile_V80_BESTVBRVideo);
		pAsf->Release();
		pAsf = NULL;
	}


	hr = AsfWriter->QueryInterface(IID_IFileSinkFilter, (void**) &FileSink);
  if(FAILED(hr))
	{
		
		return hr;
	}
	
	hr = CaptureGraph->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
						VideoSourceFilter, NULL,AsfWriter);
	if(FAILED(hr))
	{
		
		return hr;
	}
	
	this->CaptureState = READY;
	return hr;

}

HRESULT WMVCapture::StartCapture(FileName)
{
	//HRESULT hr = FileSink->SetMode(1);  //AM_FILE_OVERRITE
	//  if(FAILED(hr))
	//	return hr;
	HRESULT hr;
	
	if(FAILED(hr = FileSink->SetFileName(FileName,NULL)))
        return hr;
	hr = MediaControl->Run(); 
	if(SUCCEEDED(hr))
		this->CaptureState = RUNNING;
	return hr;

}
看看MediaControl->Run(); 的返回值是什么? 这里有个简单的例子可以看看:http://msdn.microsoft.com/en-us/library/windows/desktop/dd318630(v=vs.85).aspx[/quote] 感谢你的快速回复,你说的那个例子我看过了。但是我还是没有找到我的程序的问题在哪儿 MediaControl->Run()返回回值是:0x800705AA 我没有找到是什么意思
回复 点赞
ArcRain 2013年05月18日
引用 楼主 silverpot 的回复:
以前都是用ffdshow 存为MP4的 现在要改成WMV的,在graph上简单了,但是我MediaControl->Run()的时候总是出错 用graphedit查看,graph都建立好了,连接也正常,文件名也设置了

HRESULT WMVCapture::BuildGraph()
{
	HRESULT hr = S_OK;

	hr = AddFilter(&VideoSourceFilter,CLSID_VideoInputDeviceCategory,L"FaceTime HD Camera (Built-in)");

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

	hr = AddFilter(&AsfWriter,CLSID_LegacyAmFilterCategory,L"WM ASF Writer");
	if(FAILED(hr))
	{
		
		return hr;
	}
	IConfigAsfWriter *pAsf = NULL;
	hr = AsfWriter->QueryInterface( IID_IConfigAsfWriter, (void**)&pAsf );
	if(pAsf != NULL)
	{
		hr = pAsf->ConfigureFilterUsingProfileGuid(WMProfile_V80_BESTVBRVideo);
		pAsf->Release();
		pAsf = NULL;
	}


	hr = AsfWriter->QueryInterface(IID_IFileSinkFilter, (void**) &FileSink);
  if(FAILED(hr))
	{
		
		return hr;
	}
	
	hr = CaptureGraph->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
						VideoSourceFilter, NULL,AsfWriter);
	if(FAILED(hr))
	{
		
		return hr;
	}
	
	this->CaptureState = READY;
	return hr;

}

HRESULT WMVCapture::StartCapture(FileName)
{
	//HRESULT hr = FileSink->SetMode(1);  //AM_FILE_OVERRITE
	//  if(FAILED(hr))
	//	return hr;
	HRESULT hr;
	
	if(FAILED(hr = FileSink->SetFileName(FileName,NULL)))
        return hr;
	hr = MediaControl->Run(); 
	if(SUCCEEDED(hr))
		this->CaptureState = RUNNING;
	return hr;

}
看看MediaControl->Run(); 的返回值是什么? 这里有个简单的例子可以看看:http://msdn.microsoft.com/en-us/library/windows/desktop/dd318630(v=vs.85).aspx
回复 点赞
发动态
发帖子
多媒体/流媒体开发
创建于2007-08-27

2051

社区成员

2.0w+

社区内容

专题开发/技术/项目 多媒体/流媒体开发
社区公告
暂无公告