高手快进来、在线等待、一个用DIRECTSHOW做视频传输的问题

xueling 2002-05-07 09:52:16
我现在需要做一个视频采集与传输的程序,用DIRECTSHOW,我知道SDK中的例子Amcap是实现了视频采集与预览的,我怎样才能获取流对象对其进行传输?请告诉我方法或者我应该看哪些文档或者SDK 中的例子,谢谢!我会把我的分全部给你的!
...全文
207 点赞 收藏 25
写回复
25 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
灿烂李 2010-06-12
经典有效 Directshow资料 PDF文档 免费下载
driectshow 开发笔记
http://www.docin.com/p-55654886.html
directshow实务精选
http://www.docin.com/p-55657436.html
回复
hongtu 2002-05-09
likevclinux(流浪的小狗),你有code是吗?
请给我发一份,谢谢了。
e_mile: sjz_wdg@inhe.net
回复
xueling 2002-05-09
gboy(hello) :你好,还是谢谢你。祝你快乐。
likevclinux(流浪的小狗) :你好啊。你什么时候把源代码给我啊,这样我好结束这个问题,给你们好多好多分阿


回复
gboy 2002-05-09
真不好意思,我的代码找不到了
不过创建 filter graph 的还在,我这里是截取播放中的 avi 文件的图像
你需要修改一下 source filter 的部分
----------------------------------------
BOOL CTestDlg::BuildGrabGraph(LPCWSTR szFileName)
{
HRESULT hr=m_pGraph.CoCreateInstance(CLSID_FilterGraph);
if(FAILED(hr)) return FALSE;
CComPtr<IBaseFilter> pSGBase;
hr=pSGBase.CoCreateInstance(CLSID_SampleGrabber);
if(FAILED(hr)) return FALSE;
CComPtr<IBaseFilter> pVRBase;
hr=pVRBase.CoCreateInstance(CLSID_VideoRenderer);
if(FAILED(hr)) return FALSE;
CComPtr<IBaseFilter> pCSBase;
pCSBase.CoCreateInstance(CLSID_Colour);
if(FAILED(hr)) return FALSE;
CComPtr<IBaseFilter> pSrc;
hr = m_pGraph->AddSourceFilter(szFileName, L"Source", &pSrc); //(FILTER)
if(FAILED(hr))
return FALSE;

// Find the current bit depth.
HDC hdc = ::GetDC(NULL);
int iBitDepth = GetDeviceCaps(hdc, BITSPIXEL);
::ReleaseDC(NULL, hdc);
// Set the media type.
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
switch (iBitDepth)
{
case 8:
mt.subtype = MEDIASUBTYPE_RGB8;
break;
case 16:
mt.subtype = MEDIASUBTYPE_RGB555;
break;
case 24:
mt.subtype = MEDIASUBTYPE_RGB24;
break;
case 32:
mt.subtype = MEDIASUBTYPE_RGB32;
break;
}
pSGBase->QueryInterface(IID_ISampleGrabber,(void**)&m_pGrabber);
hr = m_pGrabber->SetMediaType(&mt);
hr=m_pGraph->AddFilter(pSGBase,L"SampleGrabber");
if(FAILED(hr)) return FALSE;
hr=ConnectFilters(m_pGraph,pSrc,pSGBase); // connect sample grabber
if(FAILED(hr)) return FALSE;
hr = m_pGraph->AddFilter(pCSBase, L"color convert filter");
if(FAILED(hr)) return FALSE;
hr=ConnectFilters(m_pGraph,pSGBase,pCSBase); // connect color space
if(FAILED(hr)) return FALSE;
hr=m_pGraph->AddFilter(pVRBase,L"Video render");
if(FAILED(hr)) return FALSE;
hr=ConnectFilters(m_pGraph,pCSBase,pVRBase); // connect video render
if(FAILED(hr)) return FALSE;

m_pGrabber->SetBufferSamples(TRUE); // 显示的时候写内存
return TRUE;
}
----------------------------------------------
HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pFirst, IBaseFilter *pSecond)
{
IPin *pOut = NULL, *pIn = NULL;
HRESULT hr = GetPin(pFirst, PINDIR_OUTPUT, &pOut);
if (FAILED(hr)) return hr;
hr = GetPin(pSecond, PINDIR_INPUT, &pIn);
if (FAILED(hr))
{
pOut->Release();
return E_FAIL;
}
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
pOut->Release();
return hr;
}
---------------------------------------------
类的成员变量
CComPtr<IMediaEventEx> m_pEvent;
CComPtr<IVideoWindow> m_pVidWin;
CComPtr<IMediaSeeking> m_pSeek;
CComPtr<IBasicVideo> m_pBV;

CComPtr<IMediaControl> m_pMC;
CComPtr<IMediaPosition> m_pMP;
CComPtr<IMediaFilter> m_pMF;
==============================================
大概就是这样了
回复
likevclinux 2002-05-08
小弟做了个商业的工程,可以公布部分code!
回复
xueling 2002-05-08
likevclinux(流浪的小狗),你好啊,你有code 吗?能不能发到我的邮箱里?谢谢了,zhaolifen12@sina.com或者lifen_zhao@163.com
回复
jyojyo 2002-05-07
如果有源代码,我也要一份,谢谢你们了。
我的EM是:jyojyo@163.net

我没有使用DirectShow,使用的是视频采集的宏和回调函数,我知道在回调函数中可以对视频流进行压缩和传输,但是,我不知道如何得到已经被摄像头捕获的视频流。在捕获视频的时候,我选择不将视频捕捉到磁盘,而是,直接捕获到内存。

我要做的这个程序的是要将视频/音频采集下来,并保存到磁盘上。但是,因为未经处理的视频/音频数据如果直接保存到磁盘上,那么它占有的空间太大了,没有实用价值。

怎样才能解决这个问题呢,如果有其他的办法可以绕过去也可以。
谢谢大家了,这个问题已经困扰了我很长时间。希望大家等帮忙。

如果有源代码,就更好了,请发到jyojyo@163.net..
回复
gboy 2002-05-07
directx sdk 的帮助中就有
回复
xueling 2002-05-07
我从哪儿可以找到关于Sample Grabber Filter 以及手工添加filter 和手工连结的资料啊?madn ?SDK?具体在哪儿,能指点一下吗?
回复
gboy 2002-05-07
filter graph 大概是这样
source filters --> Sample Grabber Filter --> VideoRender

有的时候还需要 color space converter
回复
xueling 2002-05-07
真的?什么时候能给我啊,太感激你了,你要多少分啊,我一定给你。我的email是:zhaolifen12@sina.com 还有 lifen_zhao@163.com,你能不能一下给我发两份啊,我怕收不到。另外,你当时也是修改的Amcap吗?谢谢你了!
回复
gboy 2002-05-07
Sample Grabber Filter 是一个已经实现的 filter
不过你要用手工的方法把他加入 filter graph 并且还要手工连接

这部分源码我写过,不过现在手上没有,如果你需要晚些时候给你
回复
xueling 2002-05-07
Sample Grabber Filter 是已经提供的吗?我是不是只需要将它加入filtergraph 就可以啊
回复
xueling 2002-05-07
gboy(hello):你好。我现在要做的是一个很初步的程序,导师对我的要求是先做一个不经过压缩的视频在两台机器间传输,只要在接受端能有图像出来就可以了,无所谓质量。我想修改Amcap,因为它已经实现了视频采集与本地的预览,但是我怎样从中找出采集的数据啊,我只知道她在 fitergraph 中流动,可是我怎么样才能获得啊,快帮帮忙啊,我会把我的分都送给你们的
回复
gboy 2002-05-07
如果只是想取得图像使用 Sample Grabber Filter 就足够了。
自己写 filter 太麻烦, DirectX SDK 中有很多filter例子
回复
gboy 2002-05-07
DirectShow 视频采集和播放我都作过,流播放我没做过。
不过我想在网络上传播的至少应该是没有解压缩的数据流。

回复
xueling 2002-05-07
其实我需要的只是视频,曾经有人提示我做一个自己的滤波器,来获取流对象,不只这个建议是否可行,我还没有做出来啊,而且,那儿有教我编自己的filter资料?我是一个初学者,还请大家多帮忙了
回复
xueling 2002-05-07
这几个函数我都看过了,我需要知道的是怎样来获取在过滤器图表中的数据流,怎样来捕获它,帮帮忙啊
回复
gister 2002-05-07
抓取声音用的是DirectSoundCapture,自动把他抓到一个缓存中,然后再Socket来传输。看看DirectShow是不是也有相似的函数?
回复
gister 2002-05-07
看看DirectX SDK吧。我用过DirectSound看的就是他。
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-07 09:52
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……