基于DirectShow技术开发WINCE下多媒体应用

简介: 近来接触了一下Windows CE下的多媒体编程,自然而然的碰到了Direct Show技术。由此与CSDN群友做了一番讨论。群友告诉我,需要先安装一个DS的SDK,于是去微软的官网搜索了一番,未果。

近来接触了一下Windows CE下的多媒体编程,自然而然的碰到了Direct Show技术。由此与CSDN群友做了一番讨论。群友告诉我,需要先安装一个DS的SDK,于是去微软的官网搜索了一番,未果。迅雷中找到了需要的东西。

        

       在CSDN上找到了一篇博文,通读了一下,发现上面的SDK是开发windows下多媒体程序需要安装的。这篇博文详细的阐述了,开发windows下多媒体程序,如何配置VS2005与EVC的DirectShow环境。当然我是要编写CE下的多媒体播放程序,根据另一篇博文的介绍,我之前已经安装了PB5.0软件,所以不必安装这个开发包了。现在将第一篇博文引用到这,方便日后用到的时候参考:

———————————————————————————————————————

VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件开发包;

DirectShow是微软公司在VFW的基础上推出的新一代基于COM的流媒体处理的开发包,在视频开发中,不论从效率还是实用性上都明显好于VFW。

著名的OpenCV由于时间太早,其视频部分就是基于VFW做的,这点可以说是OpenCV的一个瑕疵;

DirectX8.0 至 DirectX9.0b 此其间的DirectX版本集成了DirectShow,DirectX9.0c以后DirectShow被集成在微软的其它SDK开发包中。

在学习和开发中,可直接下载DirectX9.0b(大约218M),没有其它办法,从微软官方或迅雷的gougou下载DirectX9.0b都可以

 

第一步:安装DirectX9.0b,要分2步走,最后得到目录比如: C:/DXSDK

第二步:DirectShow日常开发中最常用到的<strmbasd.lib>此文件并没有直接给出,需要我们手动编译,方法如下:

用vc6.0(不要管你以后用什么工具,这步最好用vc6.0)打开C:/DXSDK/Samples/C++/DirectShow/BaseClasses/baseclasses.dsw

好像能直接编译通过,编译设置win32 debug(先不要管那个win32 debug unicode),最后得到文件

C:/DXSDK/Samples/C++/DirectShow/BaseClasses/Debug/strmbasd.lib

如果这步编译不过去不要急,往下看......做完第三步定能编译过去,哈哈

 

第三步:不要想像别的SDK一样,只把用到的.h提出来就可以了,开发和学习过程中只能配置vc目录选项以找到相应的调用文件,

配置方法:vc6.0和vc2005相同,以vc6.0为例:工具-选项-目录

 

include files

C:/DXSDK/Include     //一定放在最上面,切记

C:/DXSDK/Samples/C++/DirectShow/BaseClasses //一定放在最上面,切记

 

library files

C:/DXSDK/Lib       //顺序随意

C:/DXSDK/Samples/C++/DirectShow/BaseClasses/Debug //顺序随意

 

第四步前传:第二步的strmbasd.lib一定要存在

 

第四步:vc6.0使用过程

在stdafx.h文件加入以下二行代码:

#pragma comment(lib, "strmbasd.lib")

#include <Streams.h>

 

F7编译,如果通过,vc6.0的DirectShow环境已OK

 

第五步:vc2005使用过程

在stdafx.h文件加入以下二行代码:

#pragma comment(lib, "strmbasd.lib")

#include <Streams.h>

 

F7编译,不通过,主要有2个错误

第1个错误:error C2146: syntax error : missing ';' before identifier 'PVOID64'

转到错误文件:winnt.h找到如下两行代码:

typedef void *PVOID;

typedef void * POINTER_64 PVOID64;

在这两行代码前加上这行#define POINTER_64 __ptr64可解决//只改一处哟,

 

再F7编译:提示:conversion from 'LONG' to 'PVOID' of greater size,这是第2个错误,注意这次是"PVOID"非上次的'PVOID64'

这个就不能一个一个地改了,因为有很多地方。这是因为在VC6中,如果没有显示的指定返回值类型,编译器将其视为默认整形;但是vs2005不支持默认整形,解决这个问题不能修改每个没有显示指示返回值类型的函数地方,可以用wd4430来解决;具体的在vs2005项目/属性/ C++/命令行/附加选项中添加/wd4430即可。

 

再F7编译:通过

vc2005的DirectShow环境已OK

 

 

第六步前传:用DirectShow编写1个播放avi视频文件的程序并运行,

做准备工作如下,一定要在网上下个ffShow解码器安装后才可以;不下我也不知道行不行,反正我是下完了运行没问题

关于ffShow解码器愿意看的本文最下面有个题外话

 

第六步:vc6.0或vc2005在Dialog上任意放个按钮,添加如下代码,编译,运行就可以了

 

view plaincopy to clipboardprint?

void CShow1Dlg::OnButton1()   

{  

// COM库初始化  

CoInitialize(NULL);  

 

 

// 创建组件对象 Graph(图表,可理解为一个Filter链表)  

IGraphBuilder   *pGraph;   

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,  

   IID_IGraphBuilder, (void **)&pGraph);  

 

 

// 查询得到组件对象上的接口  

IMediaControl   *pMediaControl;   

pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);   

IMediaEvent       *pEvent;   

pGraph->QueryInterface(IID_IMediaEvent,   (void   **)&pEvent);  

 

// 创建 Graph 从一个硬盘文件  

pGraph->RenderFile(L"d://kk4.mpg",   NULL);  

 

// 调用接口方法 运行图表   

pMediaControl->Run();    

 

// 调用接口方法 等待图表结束       

long   evCode;     

pEvent->WaitForCompletion(INFINITE,   &evCode);  

 

// 释放调用的对象及其接口  

pMediaControl->Release();     

pEvent->Release();     

pGraph->Release();  

 

// 释放COM库所使用的资源  

CoUninitialize();  

void CShow1Dlg::OnButton1()

{

// COM库初始化

CoInitialize(NULL);

 

// 创建组件对象 Graph(图表,可理解为一个Filter链表)

IGraphBuilder   *pGraph;

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,

   IID_IGraphBuilder, (void **)&pGraph);

 

// 查询得到组件对象上的接口

IMediaControl   *pMediaControl;

pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);

IMediaEvent       *pEvent;

pGraph->QueryInterface(IID_IMediaEvent,   (void   **)&pEvent);

 

// 创建 Graph 从一个硬盘文件

pGraph->RenderFile(L"d://kk4.mpg",   NULL);

 

// 调用接口方法 运行图表

pMediaControl->Run(); 

 

// 调用接口方法 等待图表结束    

long   evCode;  

pEvent->WaitForCompletion(INFINITE,   &evCode);

 

// 释放调用的对象及其接口

pMediaControl->Release();  

pEvent->Release();  

pGraph->Release();

 

// 释放COM库所使用的资源

CoUninitialize();

}

关于ffShow解码器的题外话----------------目前几种常见的视频格式,我也不懂,乱抄的,详细自己查...

MPEG-1 活动图像专家组制定的,常见于VCD,120 分钟视频要1.2 GB,效果不清晰

MPEG-2 则应用在DVD的制作 120 分钟4GB到8GB大小左右,目前为止最清晰的视频,清晰到硬件不支持,因此MPEG-3流产了

rmvb    这时Real Networks公司研制出rm rmvb视频格式,相对于MPEG-2,有相近的清晰度,越小的体积,并支持网络实时传送和播放;

MPEG-4 为了对抗rmvb, MPEG-4出现了, 120分钟“瘦身”到300MB左右,清晰度也很可观,并支持网络实时传送和播放;但技术是保密的

DivX    很多高手看不惯,部分破解了MPEG-4 格式,DivX出现了,还可以把源文件压缩到600MB左右,但其图象质量则比MPEG-4要高出许多

这其中的一位更高的高手拿着大家的胜利果实自己开公司赚钱啦,并收回了DivX源码。

XviD    留下来的高手实在看不过去又继续开发出XviD,这个貌似是真正开源的,目前也相当厉害

还有很多视频格式,ffShow好象就是把这些视频格式的解码器,集中打包的意思了;

———————————————————————————————————————

另一篇博文:

———————————————————————————————————————

VS2005+Pocket PC 2003上DirectShow SDK开发环境配置

最近要在Windows Mobile上开发一个Player,综合考虑了一下,决定按照微软的DirectShow架构开发。具体的就是开发一个Player,几个filter,可以播放各种格式的媒体文件。公司里有一个开发板,跑的是Windows CE 5.0。开发之前当然是配置好VS2005的DirectShow开发环境,首先在网上和本机上找到这些资源:

基于PC的DirectShow开发及其开发环境配置

二个Sample源代码(必须安装Platform Builder 5.0):

D:/WINCE500/PUBLIC/DIRECTX/SDK/SAMPLES/DSHOW/PLAYERS/PLAYWND(一个简单的PLAYER样例程序)和D:/WINCE500/PUBLIC/DIRECTX/SDK/SAMPLES/WMP/CEPLAYER(完整的Windows Media Player源代码)

顺便说一下,D:/WINCE500/PUBLIC/DIRECTX/SDK/就是类似于PC机上DirectX SDK开发包,不需要我们再次安装了。这个SDK包含DirectShow开发所需要的BaseClasses编译出来lib库和头文件。

网上下载的基于Windows Mobile DirectShow的H264 Player Demo及其H264的Source filter、Transform filter开发,这个例子对一个刚入门Windows Mobile DirectShow开发的人很有用。

有了这些资源我就尝试着用VS2005 Build出一个PLAYWND的Sample Player,把源代码拿来,基本上只有playwnd.cpp、playwnd.h和playwnd.rc资源文件,代码是按照Windows SDK开发的,非MFC。首先我在VS2005上建立一个基于smart devices的win32 application工程,SDK有Pocket PC 2003和Smart Phone 2003,然后把这几个关键源文件导入到工程中去,初次编译,报出许多错误,基本上都是找不到DirectShow相应的类和一些标识的错误。参考PC的DirectShow开发环境配置,在DirectShow开发之前,首先得有BaseClasses编译出来的相关的lib库,在这里,我们可以省去编译BaseClasses了,Platform Builder 5.0安装好之后就在文件夹D:/WINCE500/PUBLIC/DIRECTX/SDK/LIB和D:/WINCE500/PUBLIC/DIRECTX/SDK/INC下提供给我们DirectShow开发所需要的库和头文件,我们需要把这些库和头文件包含进来,具体的设置:

Tools->options->project and solutions->VC++ Directories下添加:

Platform: Pocket PC 2003(ARMV4)

Show directories for: Include files: D:/WINCE500/PUBLIC/DIRECTX/SDK/INC

lib files: D:/WINCE500/PUBLIC/DIRECTX/SDK/LIB/ARMV4I/RETAIL

D:/WINCE500/PUBLIC/DIRECTX/SDK/LIB/ARMV4I/DEBUG

指明包含库和头文件的路径

Project->properties->configuration properties->linker->Input下添加:

Additional Dependencies: strmbase.lib strmiids.lib commdlg.lib,指明DirecShow编译需要包含哪些具体的库名。

以上设置基本上完成了,但还有一些小错误,是缓冲区检查等错误,设置:Project->properties-> configuration properties->C/C++->Code Generation下设置Buffer Security Check: No

还有这个错误:BaseClasses/ctlutil.h(278) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int,解决方法如下:project->properties->configuration->C/C++ ->Command Line,增加/wd4430选项。

———————————————————————————————————————

目录
相关文章
|
数据采集 存储 Web App开发
Python爬虫系列8-抓取快乐8、刮刮乐、双色球等中奖数据分析规律
人在绝大多数情况下,只要稍微有那么一点的退路,有那么一点余地,就可以成为逃避的借口和理由。努力装装样子,然后给自己一个台阶下,安慰自己说,“你看我已经很努力了,还是不行,那就算了吧”。 老话说得好:只有主动追求的东西才能到手;只要你想做,全世界都会帮你;只要你不想做,一只蚊子都能拦住你。虽说未来可期,但如果你连相信自己的勇气都没有,还有什么资格得到更好的呢。对吧!
2646 0
Python爬虫系列8-抓取快乐8、刮刮乐、双色球等中奖数据分析规律
|
存储 数据安全/隐私保护
忘记被浏览器记住的密码如何找回,如何查看浏览器保存的密码?
现在很多网站都需要注册账号和密码,由于数量众多,每个网站的账号不通用,所有我们经常会用浏览器记录密码功能记住密码,但时间一长就会忘记密码,想换个浏览器登陆或其他原因无法直接查看到密码,下面有2种查看密码的方法仅供参考。
忘记被浏览器记住的密码如何找回,如何查看浏览器保存的密码?
|
IDE 开发工具 Windows
QT应用编程: windows下QT调用COM组件
QT应用编程: windows下QT调用COM组件
1118 0
QT应用编程: windows下QT调用COM组件
|
数据库 索引
elasticsearch中join类型数据如何进行父子文档查询?
elasticsearch中join类型数据如何进行父子文档查询?
|
4月前
|
SQL 人工智能 自然语言处理
通义灵码2.5 | 一个更懂开发者的 AI 编程助手
通义灵码2.5版是一款强大的AI编程助手,具备智能体模式,支持自主决策、环境感知与工具使用等功能。通过工程检索、文件编辑和终端操作,可端到端完成编码任务,并深度适配Qwen3模型,大幅提升开发效率。新版新增行间建议预测、上下文分析及记忆功能,更懂开发者需求。智能体结合MCP工具,能实现从代码生成到部署的全流程自动化,如文中实例展示的数独小游戏开发与在线部署。无论是日常开发还是创意实现,通义灵码都能显著提升工作效率与能力边界。
|
5月前
|
Web App开发 编解码 数据可视化
实时云渲染:数字孪生可视化最稳定省心的方案
数字孪生技术发展面临大内容与轻终端的矛盾,实时云渲染成为解决这一问题的关键。它支持大规模复杂数据处理、低延迟交互、跨终端访问、高精度可视化及弹性扩展,同时保障数据安全。平行云Lark XR作为企业级实时云渲染PaaS平台,相比Epic Games UE引擎的像素流送插件,提供更稳定、兼容性强、功能全面的解决方案,适用于工业数字孪生、云游戏、元宇宙活动等场景,助力企业专注于业务创新。
|
8月前
|
应用服务中间件 nginx Docker
MediaGo:跨平台视频提取下载的开源神器
MediaGo是一款跨平台视频提取工具,支持流媒体、m3u8及B站视频下载,提供Windows和Mac客户端。它无需复杂抓包操作,内置浏览器可轻松嗅探并选择视频资源,支持批量下载和移动播放。项目开源免费,已在GitHub获得5.8k星标。用户还可通过Docker部署Web端,实现远程视频管理和访问。MediaGo以其简单易用和强大功能,重新定义了流媒体下载体验。
452 5
 MediaGo:跨平台视频提取下载的开源神器
|
10月前
|
开发框架 前端开发 JavaScript
uniapp开发鸿蒙,是前端新出路吗?
相信不少前端从业者一听uniapp支持开发鸿蒙Next后非常振奋。猫林老师作为7年前端er也是非常激动,第一时间体验了下。在这里也给大家分享一下我的看法
245 17
|
10月前
|
安全 网络安全
给ip白嫖一个免费的SSL
为IP地址申请免费SSL证书是可能的,如JoySSL提供的免费试用IP地址SSL证书。用户需访问其官网注册并填写特定注册码230922,完成IP地址验证后提交申请。成功后需定期检查更新证书,确保网站安全。尽管如此,基于域名的SSL证书更受信任,建议优先考虑。
|
存储 边缘计算 开发工具
云计算技术:从基础到实践
【10月更文挑战第4天】云计算技术:从基础到实践