100分求教!!!用directshow 分割AVI视频文件..(高手请进!!!)

flyayi2006 2007-06-26 07:56:43
directshow 把timeline保存成AVI文件,怎么做?
在SDK帮助中,有以下这一段,
Writing a Project to a File
long NumGroups;
pTimeline->GetGroupCount(&NumGroups);

// Loop through the groups and get the output pins.
for (i = 0; i < NumGroups; i++)
{
IPin *pPin;
if (pRender->GetGroupOutputPin(i, &pPin) == S_OK)
{
IBaseFilter *pCompressor;
// Create a compressor filter. (Not shown.)
// Set compression parameters. (Not shown.)

// Connect the pin.
pBuilder->RenderStream(NULL, NULL, pPin, pCompressor, pMux);
pCompressor->Release();
pPin->Release();
}
}

现在的问题,预览正常,但是保存后,文件增大,颜色失真。
我想是没有压缩的问题,那么
// Create a compressor filter. (Not shown.)
// Set compression parameters. (Not shown.)
上面的句子怎么理解,我知道SDK里有自带AVI Compressor Filter,
但是怎么加到上面的代码里呢?
我对directshow的理解还很浅薄,请大家指教和帮助!!谢谢了 !

...全文
427 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
feng0112 2007-07-12
  • 打赏
  • 举报
回复
HRESULT RenderStream(
const GUID *pCategory,
IUnknown *pSource,
IBaseFilter *pfCompressor,
IBaseFilter *pfRenderer
);
第三格参数为压缩filter的指针, NULL为不压缩!
你首先找到压缩filter的CLSID,如果是内核模式的filter需要通过名字匹配去创建!这些DSHOW的帮助文档里都有介绍!!
然后创建好后得到这个压缩的指针, 加入到那个参数就号了!!
//用CLSID 去创建
HRESULT CBasicFilter::CreateFilter(const CLSID clsidFilter)
{
HRESULT hr = NOERROR;
hr = CoCreateInstance(clsidFilter, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&m_pBaseFilter);

return hr;
}

//用名字去创建
HRESULT CBasicFilter::CreateFilterByName(const CLSID clsidCategory, LPCTSTR szFilterName)
{
if (_tcsclen(szFilterName) <=0)
{
return E_FAIL;
}

CComPtr<IEnumMoniker> pEmMoniker;
CComPtr<ICreateDevEnum> pCreateDevEnum;

ULONG cFetched;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)&pCreateDevEnum);

FAILED_RETURN(hr);

hr = pCreateDevEnum->CreateClassEnumerator(clsidCategory, &pEmMoniker, 0);

if (hr != NOERROR)
{
return E_FAIL;
}

pEmMoniker->Reset();

CComPtr<IMoniker> pMoniker = NULL;

while((hr = pEmMoniker->Next(1, &pMoniker, &cFetched)) == NOERROR)
{
CComPtr<IPropertyBag> pBag;

hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);

if(SUCCEEDED(hr))
{
VARIANT var;

var.vt = VT_BSTR;

hr = pBag->Read(L"FriendlyName", &var, NULL);

if (hr == NOERROR)
{

TCHAR szTmpName[MAX_DEVICE_NAME];
#ifndef UNICODE //if not define UNICODE
WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, szTmpName, MAX_DEVICE_NAME_LEN, NULL, NULL);
#else
_tcscpy(szTmpName, var.bstrVal);

#endif
SysFreeString(var.bstrVal);

if(_tcscmp(szFilterName, szTmpName)==0)
{
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&m_pBaseFilter);

return hr;
}

}

}

pMoniker = NULL;
}

return E_INVALIDARG;
}
希望你能明白这些!
feng0112 2007-07-04
  • 打赏
  • 举报
回复
楼主, 你对filter怎么加如果还不清楚的话希望你先去学习dshow的基本使用,这个要说要说半本书!!
achibana 2007-06-28
  • 打赏
  • 举报
回复
注释已经很明白了, 创建一个Compressor Filter. 用CreateInstance()创建一个这个Filter,
设置参数, 加入到Filter Graph里面, 连接起来运行.
flyayi2006 2007-06-27
  • 打赏
  • 举报
回复
兄弟们,拉我一把,
江湖救急啊~~
flyayi2006 2007-06-27
  • 打赏
  • 举报
回复
各位大哥,morning.
Could you tell me,Please !!!

2,543

社区成员

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

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