Dialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CVideoCompressDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CVideoCompressDlg::OnOK()
{
}
//查找引脚
IPin* CVideoCompressDlg::FindPin(IBaseFilter *pFilter, PIN_DIRECTION dir)
{
IEnumPins* pEnumPins;
IPin* pOutpin;
PIN_DIRECTION pDir;
pFilter->EnumPins(&pEnumPins);
while (pEnumPins->Next(1,&pOutpin,NULL)==S_OK)
{
pOutpin->QueryDirection(&pDir);
if (pDir==dir)
{
return pOutpin;
}
}
return 0;
}
void CVideoCompressDlg::OnSourceBrown()
{
CFileDialog fDlg(TRUE,"","",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"AVI文件|*.avi");
if (fDlg.DoModal()==IDOK)
{
CString strFile = fDlg.GetPathName();
m_SourceFile.SetWindowText(strFile);
}
}
void CVideoCompressDlg::OnDesBrown()
{
CFileDialog fDlg(FALSE,"avi","one",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"AVI文件|*.avi");
CString strFile;
if (fDlg.DoModal()==IDOK)
{
strFile= fDlg.GetPathName();
DeleteFile(strFile); // 如果文件存在,则先删除文件
m_DesFile.SetWindowText(strFile);
}
}
void CVideoCompressDlg::OnStartCompress()
{
CString srcFile,dstFile;
m_SourceFile.GetWindowText(srcFile);
m_DesFile.GetWindowText(dstFile);
if (srcFile.IsEmpty()|| dstFile.IsEmpty())
{
MessageBox("源文件或目标文件不能为空!","提示");
return;
}
if (srcFile==dstFile)
{
MessageBox("源文件与目标文件不能相同!","提示");
return;
}
ICaptureGraphBuilder2 * pBuilder = NULL;
pGraph = NULL;
pMediaControl = NULL;
pCompress = NULL;
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);
pBuilder->SetOutputFileName( &MEDIASUBTYPE_Avi, dstFile.AllocSysString(), &pMux, NULL);
pGraph->AddSourceFilter(srcFile.AllocSysString(), L"Source Filter", &pSrc);
//列举视频压缩器
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pClassEnum = NULL;
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void **)&pDevEnum);
ULONG cFetched;
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("Microsoft Video 1",0)!= -1)
{
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pCompress);
pMoniker->Release();
break;
}
VariantClear(&varName);
}
pClassEnum->Release();
pMoniker->Release();
if (pCompress==NULL)
{
MessageBox("没有发现Microsoft Video 1
压缩器!","提示",MB_ICONASTERISK);
return;
}
pGraph->AddFilter(pCompress,L"Compressor");
HRESULT ret;
IPin * pSourceOut;
IPin* pCompressIn,* pCompressOut;
pCompressIn = FindPin(pCompress,PINDIR_INPUT) ;
pCompressOut = FindPin(pCompress,PINDIR_OUTPUT);
IAMVideoCompression * pAMCompress ;
pCompressOut->QueryInterface(IID_IAMVideoCompression,(void**)&pAMCompress);
HRESULT hret;
hret = pAMCompress->put_KeyFrameRate(8);
pBuilder->RenderStream(NULL,NULL,pSrc,pCompress,pMux);
HRESULT hr = pMux->QueryInterface(IID_IMediaSeeking, (void**)&pSeek);
pGraph->QueryInterface(IID_IMediaEventEx, (void **)&pEvent);
hret = pEvent->SetNotifyWindow((OAHWND)m_hWnd,CM_NOTIFY,0);
pMediaControl->Run();
m_IsCompressing = TRUE;
}
void CVideoCompressDlg::OnCancel()