一个觉着好简单的问题,就是解决不了,好累,求助:捕获到有大小但不能播放的.avi文件

billjdy 2003-12-23 11:56:59
| | | | | |
|Vedio Capture|----->| AVI Mux |------->|File Writer |
|_____________| |____________| |____________|
在graph edit中可以保存成.avi文件,并能播放.
但运行如下函数,去只能得到随着捕获时间的长短而不同的.avi文件,不能播放.
以下函数中的GetDeviceInterfaces();FindCaptureDevice(&m_pBaseFilter);均为Dx9.0例子中的常用函数

CTRYCAPTURE1Dlg::CaptureVideo1()
{
IBaseFilter *pMux,*pWrite;
IFileSinkFilter2 *pFileSink;
USES_CONVERSION;
HRESULT hr=0;
hr=GetDeviceInterfaces();/////
hr=FindCaptureDevice(&m_pBaseFilter);////
m_pCaptureGraphBuilder->SetFiltergraph(m_pGraphBuilder);
hr=m_pGraphBuilder->AddFilter(m_pBaseFilter,L"Video Capture");
hr = CoCreateInstance(CLSID_AVIMux, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void **)&pMux);
hr = CoCreateInstance(CLSID_FileWriter, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (void **)&pWrite);
hr = pWrite->QueryInterface(IID_IFileSinkFilter2, (void **) &pFileSink);
hr = m_pGraphBuilder->AddFilter(pMux, L"AVIMux");
hr = m_pGraphBuilder->AddFilter((IBaseFilter *)pWrite, L"File Writer");
pFileSink->SetFileName(L"C:\\Vedio.avi",NULL);
ConnectFilters(m_pGraphBuilder,m_pBaseFilter,pMux);
ConnectFilters(m_pGraphBuilder,pMux,pWrite);
m_pMediaControl->Run();
return S_OK;
}
我也试了用renderstream智能连接的方法,可结果一样,哪儿出了问题呢,和我的数码相机有关吗,(在graph edit中只能看到capture,没有preview),郁闷中...

P.S.
在graph edit中dump这个filter和捕获设备相连后输出的无论.avi或.asf文件都不能播放,为什么?谢!


...全文
81 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
billjdy 2003-12-25
  • 打赏
  • 举报
回复
谢谢 happydeer(小鹿) 和show(等我轻舞飞扬(抵制日货)) 我是刚刚开始学dx,vc也是马马虎虎,呵呵。老板是硬赶鸭子上架:(
我昨天做了一下,是这样吗?
IPin *pOut = 0;
hr = GetUnconnectedPin(m_pBaseFilter, PINDIR_OUTPUT, &pOut);//其中的m_pBaseFilter CComPtr<IEnumMediaTypes> pMediaTypes;//是FindCaptureDevice(&m_pBaseFilter)中的参数
hr = pOut->EnumMediaTypes( &pMediaTypes );
hr = pMediaTypes->Reset();
ULONG fetched;
AM_MEDIA_TYPE *mediaType;
int nType;
while( S_OK == pMediaTypes->Next( 1, &mediaType, &fetched ) )
{
GUID guid=mediaType->majortype;
GUID guid1=mediaType->subtype;
GUID guid2=mediaType->formattype;
if(::IsEqualGUID( guid1, MEDIASUBTYPE_dvsd))
{
nType=1;
}
else nType=0;
}
最终的结果是:
majortype:73646976-0000-0010-8000-00AA00389B71,我用IsEqualGUID查的,MEDIATYPE_Video
subtype:CLSID_I420/H261 Decode Filter,由于dx documentation中的subtype类型太了 不知道还有没有其它办法,直接从CLSID_I420/H261 Decode Filter的到subtype的类型.
fomattype:CLSID_WDM streaming capture vedioinfoheader data type handler . 应该是FORMAT_VideoInfo吧.
多谢你们拉
happydeer 2003-12-24
  • 打赏
  • 举报
回复
你的图画得挺好的:)

好像两种情况下视频的格式是不一样的!你能查看一下Capture pin输出的media type吗?支持哪些格式?

或许你可以在你的程序中对capture pin输出的media type进行一下调整。(在连接之前!)
billjdy 2003-12-24
  • 打赏
  • 举报
回复
谢谢,我试了,结果是这样的,呵呵,(不能粘贴图片)
| capture|]--->[|input01 AVI Out |]------>[|in |
| | | | | |
|Vedio Capture| | AVIMux | |sample.avi |
| | [|input02 | | |
|_____________| |_________________| |_____________|

还是不行,另外我把sample.avi和我直接在graph edit下保存的.avi拖到.txt中比较了一下,好象他们的文件格式是不同的。
正常的.avi在.txt下的开头一行:RIFF鴿 AVI LIST? hdrlavih8 5 ? ? @ LISTt~ strlstrh8 vidsI420


不正常的.avi在.txt下的开头一行:RIFF?AVI LIST? hdrlavih8 5 ?E , ? @ LISTt~ strlstrh8 vidsDIB €枠 - ? strf( (

happydeer 2003-12-24
  • 打赏
  • 举报
回复
你运行你的程序后,用GraphEdit看看你的Filter Graph是否确实和你想象的一样?

使用GraphEdit的Connect to Remote graph...
show 2003-12-24
  • 打赏
  • 举报
回复
是啊,同意楼上的。avi的视频有很多种格式的。有yuv的,也有rgb的。默认的播放器不装插件是播不出来yuv格式的avi文件的。

另外,你可以用ultraedit 查看两个文件的区别。

2,542

社区成员

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

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