求个采集摄像头文件到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;

}

...全文
163 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧