DirectShow如何设置压缩文件的质量和大小
directshow吧
全部回复
仅看楼主
level 1
iqll001 楼主
我已经可以压缩成AVI了,但是压的太厉害了点,代码如下//枚举压缩器
////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT hr;
ICreateDevEnum *pSysDevEnum = NULL; //创建枚举器指针
pCompress = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void **)&pSysDevEnum); //创建枚举器
// Obtain a class enumerator for the video compressor category.
IEnumMoniker *pEnumCat = NULL;
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0); //返回枚举参数
if (hr == S_OK)
{
// Enumerate the monikers.
IMoniker *pMoniker;
ULONG cFetched;
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK) //开始枚举压缩器
{
IPropertyBag *pPropBag;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
// To retrieve the friendly name of the filter, do the following:
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (SUCCEEDED(hr))
{
CString str(varName.bstrVal);
SysFreeString(varName.bstrVal);
if(str == "Microsoft MPEG-4 Video Codec V2")
{
hr = pMoniker->BindToObject(0,0,IID_IBaseFilter,(void**)&pCompress);
pMoniker->Release();
break;
}
}
VariantClear(&varName);
}
pEnumCat->Release();
pMoniker->Release();
m_pGB->AddFilter(pCompress,L"Compressor"); //添加过滤器
HRESULT ret =NULL;
IPin * pSourceOut = NULL;
IPin* pCompressIn,* pCompressOut=NULL;
IAMVideoCompression * pAMCompress = NULL; //压缩参数设置
IAMStreamConfig *pStreamConfig = NULL; //压缩参数设置
AM_MEDIA_TYPE *pmt;
m_pCapture->FindInterface(NULL,NULL,m_pBF,IID_IAMStreamConfig,(void**)&pStreamConfig);
pStreamConfig-> GetFormat(&pmt);
if (pmt-> formattype == FORMAT_VideoInfo)
{
((VIDEOINFOHEADER *)(pmt-> pbFormat))->dwBitRate = 10000;
pStreamConfig-> SetFormat(pmt);
}
FreeMediaType(*pmt);
pCompressIn = FindPin(pCompress,PINDIR_INPUT) ; //查找输入引脚
pCompressOut = FindPin(pCompress,PINDIR_OUTPUT); //查找输出引脚
pStreamConfig-> QueryInterface(IID_IAMVideoCompression, (void **)&pAMCompress);
pCompressOut->QueryInterface(IID_IAMVideoCompression,(void**)&pAMCompress);
HRESULT hret;
hret = pAMCompress->put_KeyFrameRate(10);
hret = pAMCompress->put_Quality(1.0);
pStreamConfig-> Release();
pAMCompress->Release();高手指教下
2011年08月09日 09点08分 1
1