社区
资源
帖子详情
DirectShow的例子
_liang_
2002-12-06 08:46:24
谁能给我一个DirectShow的例子或中文文章(不要是msdn的那个)
...全文
273
8
打赏
收藏
DirectShow的例子
谁能给我一个DirectShow的例子或中文文章(不要是msdn的那个)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xuejian1999
2002-12-13
打赏
举报
回复
在DirectShow的SDK里有一个内存播放的例子。你可以看一看。关键就在控制内存和数据的同步。
free_card
2002-12-11
打赏
举报
回复
给你个例子参考吧?
_liang_
2002-12-06
打赏
举报
回复
小弟初学directx,哪位帮帮忙
_liang_
2002-12-06
打赏
举报
回复
老大,我想要一个采集的,不是这个,有没有
free_card
2002-12-06
打赏
举报
回复
DirectShow编程指南
我们终于开始了我们的真正旅程!Let's Go!
由于DirectX和VC++的紧密联系,所有的代码都用C++写的。
一.播放影片
通过一个简单的C++程序示范如何播放影片。本节包括:
1.播放一个媒体文件--回放媒体文件的基本代码。
2.添加媒体seek功能--提供在媒体文件中如何seek一个特定的的位置的代码。(seek就是...你用过CFile::Seek么?嗯...就是他了)。
因为只是个演示很多都是定了的。例如:
TCHAR *szFilename = "c:\\dxmedia\\movie\\movie.avi";
当然你可以用各种方法得到你使用的文件信息。
另外就是定义了自己的响应消息和一个释放宏:
#define WM_GRAPHNOTIFY WM_USER+13
#define HELPER_RELEASE(x) { if (x) x->Release(); x = NULL; }
需要的头文件:
#include <windows.h>
#include <mmsystem.h>
#include <streams.h>
申明变量:
HWND ghApp;
HINSTANCE ghInst;
HRESULT hr;
LONG evCode;
LONG evParam1;
LONG evParam2;
其中ghApp是一个graph产生的事件的响应窗口句柄。ghInst是窗口的HINSTANCE。evCode将保存事件代码,evParam1和evParam2保存事件的参数。
申明和初始化必须的接口。由于接口的索引值是自动的加1,所以你不要调用IUnknown::AddRef方法(如果你觉得陌生,你可以参考综述篇的"一、DirectX和部件对象模型COM")。
IGraphBuilder *pigb = NULL;
IMediaControl *pimc = NULL;
IMediaEventEx *pimex = NULL;
IVideoWindow *pivw = NULL;
定义一个函数:szFile参数是播放的媒体文件名
void PlayFile(LPSTR szFile)
{
HRESULT hr;
建立一个Unicode(wide character)字符串。
WCHAR wFile[MAX_PATH];
MultiByteToWideChar( CP_ACP, 0, szFile, -1, wFile, MAX_PATH );
实例化一个filter graph manager。
hr = CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void **)&pigb);
查询IMediaControl接口(提供run,pause and stop methods),IMediaEventEx接口(你可以接收事件响应),IVideoWindow接口。
pigb->QueryInterface(IID_IMediaControl, (void **)&pimc);
pigb->QueryInterface(IID_IMediaEventEx, (void **)&pimex);
pigb->QueryInterface(IID_IVideoWindow, (void **)&pivw);
让filter graph manager建立filter graph去渲染输入文件。现在还没播放文件(当你用run函数播放时,filter graph会自动渲染输入文件的媒体类型,你不必指定渲染过滤器)。
hr = pigb->RenderFile(wFile, NULL);
用一个窗口捕捉graph的通知事件。可以改善性能,但是允许你的应用程序运行在另一个线程。
pimex->SetNotifyWindow((OAHWND)ghApp, WM_GRAPHNOTIFY, 0);
在ghApp处理消息去响应从graph传来的所有事件。如果事件发生了,DirectShow会post一个WM_GRAPHNOTIFY消息给ghApp。
开始播放文件。
hr = pimc->Run();
同样的,你也可以有
hr = pimc->Pause();
hr = pimc->Stop();
当然了,你可以用一个对话框的按钮来响应Pause 和 Stop。这样就实现了简单的回放。
记住了,在你的代码里,要释放你用的接口,可以用HELPER_RELEASE 宏。
例:HELPER_RELEASE(pigb);
现在加入seek功能。
在你的媒体文件中,你可以用IMediaPosition or IMediaSeeking 接口seek到一个特定的位置播放。IMediaPostion::put_CurrentPosition方法可以指定开始时间,例如你可以用下面的代码实现重放:
IMediaPosition *pimp;
hr = pigb->QueryInterface(&IID_IMediaPosition, (void **)&pimp);
hr = pimp->put_CurrentPosition(0);
时间的单位是100呐秒,下面的代码seek到文件的一秒处:
hr = pimp->put_CurrentPosition(10000000);
你也可以用IMediaPosition::put_StopTime 方法去设置文件的回放停止时间。
然而,用IMediaPosition只能用seek时间,如果你用 IMediaSeeking接口,你能用多种格式seek,用100呐秒单位,frame(帧),字节,media samples,或者是interlaced video fields。你可以用IMediaSeeking::SetTimeFormat 设置你需要的格式。注意,确信你不在播放媒体文件,当你设置格式的时候。
格式如下:
TIME_FORMAT_MEDIA_TIME 单位是100呐秒
TIME_FORMAT_BYTE 单位是字节
TIME_FORMAT_FIELD 单位是interlaced video field(我不太清楚这格式,所有只好用英文)
TIME_FORMAT_FRAME 单位是帧
TIME_FORMAT_SAMPLE 单位是sample (我不太清楚这格式,所有只好用英文)
举个例子吧,下面的代码设置格式为帧。
IMediaSeeking *pims;
hr = pigb->QueryInterface(IID_IMediaSeeking, (void **)&pims);
hr = pims->SetTimeFormat(&TIME_FORMAT_SAMPLE);
应用程序可以用多样的seek模式,而不需要考虑 时间/速率的转换。有时候这是很有用的。
下面示例如何用帧的格式开始和结束播放。如在15帧开是播放影片。你可以把代码插入到PlayFile函数的任何地方,注意的是,一定要在RenderFile函数的后面(还记得hr = pigb->RenderFile(wFile, NULL);这段代码么?)。
IMediaSeeking *pims;
hr = pigb->QueryInterface(IID_IMediaSeeking, (void **)&pims);
设置时间格式。
hr = pims->SetTimeFormat(&TIME_FORMAT_FRAME);
申明并初始化开始和结束变量:
LONGLONG start = 5L;
LONGLONG stop = 15L;
通过IMediaSeeking::SetPositions方法设置开始和结束时间, AM_SEEKING_AbsolutePositioning标志意味着这是一个绝对的位置(不是相对于媒体文件现在的位置)。在这个例子中,媒体文件就在第5帧开始,在15帧结束,持续时间是10帧。具体的时间长度要看视频帧的播放速率了。
pims->SetPositions(&start, AM_SEEKING_AbsolutePositioning, &stop,
AM_SEEKING_AbsolutePositioning);
最后释放接口。
pims->Release();
当然你也可以设置别的格式,和别的开始结束的信息。例如5秒到7秒。
hr = pims->SetTimeFormat(&TIME_FORMAT_FRAME);
LONGLONG start = 50000000L;
LONGLONG stop = 70000000L;
其他就看你自己喜欢了
_liang_
2002-12-06
打赏
举报
回复
dialog应用
用mfc,
只要采集,有没有啊
_liang_
2002-12-06
打赏
举报
回复
谢谢,不过不是播放,是采集
casinosun
2002-12-06
打赏
举报
回复
http://www.yiii.net/app/club/view.jsp?Information_Id=I00012647
音视频聊天
例子
(采用
directshow
)
这个“音视频聊天
例子
(采用
directshow
)”是一个很好的实践项目,可以帮助我们深入理解
DirectShow
的工作原理和应用。
DirectShow
的核心是基于组件的对象模型,它包含了多种预定义的过滤器,如捕获设备过滤器、解码器...
directshow
视频编辑
例子
在这个"
directshow
视频编辑
例子
"中,我们将探讨如何利用
DirectShow
来实现画中画、背景音乐添加以及视频过渡效果。 首先,画中画(Picture-in-Picture)技术在视频编辑中很常见,它允许同时显示两个或多个视频源。在...
amcap源代码,
directshow
自带
描述中提到,“windows自带的
directshow
例子
,比较复杂,用于保存视频,设置摄像机参数等等”,这表明AMCap不仅是一个简单的捕获程序,它还具备了一些高级功能,如视频录制和摄像头参数调整。这些功能对于开发者来说...
vc
directshow
做的视频和音频采集
例子
本项目“vc
directshow
做的视频和音频采集
例子
”提供了一个实例,展示了如何利用VC++和
DirectShow
进行音视频采集,并将数据保存为AVI格式的文件。 首先,我们需要理解
DirectShow
的工作原理。
DirectShow
由一系列称为...
DirectShow
实务精选
例子
代码
DirectShow
是微软开发的一个强大的多媒体框架,用于处理音频和视频流。这个压缩包包含的是《
DirectShow
实务精选》这本书中的示例代码,旨在帮助读者深入理解
DirectShow
的使用方法和核心概念。以下是对这些示例代码的...
资源
2,585
社区成员
18,436
社区内容
发帖
与我相关
我的任务
资源
VC/MFC 资源
复制链接
扫一扫
分享
社区描述
VC/MFC 资源
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章