打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
DirectShow 视频录制保存为avi文件
我喝多了
>《DirectShow》
2014.10.30
关注
void
CXunLeiPlayDlg::OnCapstart()
//开始录制
{
CString str;
CFileDialog FileDlg(FALSE,_T(
"AVI"
),NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T(
"视频文件|*.avi|"
),
this
);
if
(FileDlg.DoModal()==IDOK)
{
str = FileDlg.GetPathName();
}
if
(str.IsEmpty())
{
MessageBox(_T(
"请选择或输入文件"
));
return
;
}
ICaptureGraphBuilder2 * pBuilder = NULL;
pGraph = NULL;
pMediaControl = NULL;
IBaseFilter *pMux =NULL;
IBaseFilter *pWriter=NULL;
IBaseFilter *pCompress=NULL;
IFileSinkFilter2 *pSink;
//枚举视频设备
ICreateDevEnum *pDevEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (
void
**)&pDevEnum);
IEnumMoniker *pClassEnum = NULL;
pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
ULONG
cFetched;
if
(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (
void
**)&pSrc);
pMoniker->Release();
}
pClassEnum->Release();
//列举视频压缩设备
pDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pClassEnum, 0);
while
(pClassEnum->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag* pProp= NULL;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (
void
**)&pProp);
VARIANT varName;
varName.vt = VT_BSTR;
pProp->Read(L
"FriendlyName"
, &varName,0);
CString str = varName.bstrVal;
if
(str.Find(_T(
"Microsoft Video 1"
),0)!= -1)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (
void
**)&pCompress);
pMoniker->Release();
break
;
}
VariantClear(&varName);
}
pClassEnum->Release();
if
(pCompress==NULL)
{
MessageBox(_T(
"没有发现Microsoft Video 1压缩器!"
),_T(
"提示"
),MB_ICONASTERISK);
return
;
}
CoCreateInstance(CLSID_CaptureGraphBuilder2,0,CLSCTX_INPROC_SERVER,IID_ICaptureGraphBuilder2,(
void
**)&pBuilder);
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (
void
**)&pGraph);
pBuilder->SetFiltergraph(pGraph);
pGraph->QueryInterface(IID_IMediaControl,(
void
**)&pMediaControl);
pGraph->AddFilter(pSrc,L
"avi"
);
pGraph->AddFilter(pCompress,L
"com"
);
CoCreateInstance(CLSID_AviDest,NULL, CLSCTX_ALL,
IID_IBaseFilter,(
void
**)&pMux);
pGraph->AddFilter(pMux,L
"Mux"
);
CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_ALL,
IID_IBaseFilter, (
void
**)&pWriter);
pGraph->AddFilter(pWriter,L
"Writer"
);
pWriter->QueryInterface(IID_IFileSinkFilter2,(
void
**)&pSink);
pSink->SetFileName(str.AllocSysString(),NULL);
//压缩器输入\输出引脚
IAMVideoCompression * pAMCompress ;
IPin * pComOut,*pComIn ;
pComIn = FindPin(pCompress,PINDIR_INPUT);
pComOut = FindPin(pCompress,PINDIR_OUTPUT);
pComOut->QueryInterface(IID_IAMVideoCompression,(
void
**)&pAMCompress);
HRESULT
hret;
hret = pAMCompress->put_KeyFrameRate(8);
IPin* pOutpin = FindPin(pSrc,PINDIR_OUTPUT);
//pSrc的输出引脚
IPin* pInpin,*pOut;
//pMux的输入\输出引脚
pInpin = FindPin(pMux,PINDIR_INPUT);
pOut= FindPin(pMux,PINDIR_OUTPUT);
IPin* pInpin1= FindPin(pWriter,PINDIR_INPUT);
//pWriter的输入引脚
//连接引脚
HRESULT
result ;
result = pGraph->ConnectDirect(pOutpin,pComIn,NULL);
result = pGraph->ConnectDirect((IPin *)pComOut,pInpin,NULL);
result = pGraph->ConnectDirect(pOut,pInpin1,NULL);
pMediaControl->Run();
pAMCompress->Release();
m_IsRecorded = TRUE;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
【热】
打开小程序,算一算2024你的财运
DirectShow开发的基本技巧
用DirectShow实现视频采集(二)
directshow 中 x Objects left active 问题的解决(转载)
DirectShow系统设备的枚举
TechThink - 北京东方金谷
CoCreateInstance运行原理
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×