捕获video&audio录制AVI文件

 

*. Filter Graph 如下:

 

 

 

       [NOTE]    AVI MUX filter 接入视频流从capture filter的capture pin端口上,然后打包生成AVI流;

 

        对于声音流也能够连接到AVI MUX filter上,这样的话mux将会交错(interleave)两个流

 

        对于File Write filter是将avi stream写入硬盘。

 

1.构建File Write Filter。                    通过ICaptureGraphBuilder2::SetOutPutFileName方法

/*假设ICaptureGraphBuilder2对象实例化完成,pBuild*/
IBaseFilter 	*pMux;
hr = pBuild->SetOutPutFileName(
		&MEDIASUBTYPE_Avi,
		L"C:\\Example.avi",
		&pMux,		//用来接受指向mux的指针,实例化了IBaseFilter
		NULL,	);	        //(Optional) Receives a pointer to the file sink.

 

2.调用ICaptureGraphBuilder2::RenderStream方法来连接capture filter到avi mux.

/*假设ICaptureGraphBuilder2对象实例化完成,pBuild*/
hr = pBuild->RenderStream(
		&PIN_CATEGORY_CAPTURE,
		&MEIDATYPE_Video,
		pCap,			//pointer to capture filter
		NULL,			//中间filter,可选
		pMux);			//Mux or file sink filter
//释放mux filter
pMux->Release();

 

3.捕获音频

为了捕获音频,调用RenderStream函数时类型设置为MEDIATYPE_Audio.如果你需要同时捕获video 和 audio从不同的设备上,那么请你试用Master Stream.其能防止视频音频的抖动。原理是avi mux filter 会匹配视频流的回放playback rate,其来匹配声音流. 调用IConfigAviMux::SetMasterStream函数,在avi mux filter上。

/*假设IBaseFilter * pMux 已经初始化成功,*/
IConfigAviMux 	*pConfigMux = NULL;
hr = pMux->QueryInterface(  IID_IConfigAviMux,   (void **)&pConfigMux);
if  ( SUCCESSED(hr))
{
	pConfigMux->SetMasterStream(1);            //谁First RenderStream,Audio or video; 0,1
	pConfigMux->Release();
} 

 

4.how avi mux filter 交错audio 和 video.

         通过调用IConfigInterleaving::put_Mode方法。在avi mux filter对象上操作

/*假设IBaseFilter * pMux 已经初始化成功,*/
IConfigInterleaving 		*pInterleave = NULL;
hr = pMux->QueryInterface(  IID_IConfigInterleaving,  (void **)&pInterleave);
if( SUCCESSED(hr))
{
	pInterleave->put_Mode(	INTERLEAVE_CAPTURE	);
	pInterleave->Release();
}
//the flag INTERLEAVE_CAPTURE表示AVI Mux 执行交错时按照一个特定率,该率是与视频捕获率匹配

 

5.编码视频流

你可以在capture filter 和 Avi mux filter之间添加编码器Encoder利用System Device Enumerator 或者Filter Mapper来选择一个编码filter.

IBaseFilter 	*pEncoder;
/*创建该编码器filter,System Device Enumerator OR Filter mapper*/
pGraph->AddFilter(	pEncoder, L"Encoder");

/*调用SetOutputFileName 生成writer file filter 和 mux filter*/

//渲染流 ,(连接各个filter)
hr  = pBuilder->RenderStream( &PIN_CATEGORY_CAPTURE,
			&MEDIATYPE_Video,
			pCap,
			pEncoder,			//主角登场
			pMux);
 pEncoder->Release();
//编码器可能支持IAMVideoCompression或者气压接口用来设置编码参数

 

[POST BY Leon Chan,suse]

posted @ 2010-10-31 12:10  hungryMan  阅读(1572)  评论(0编辑  收藏  举报