http://wlyfamily.blog.sohu.com/62162546.html
在过去的10年里,移动技术已经取得了令人难以置信的进步和成就。应用Windows CE系统的移动设备也在应用和编程方面变得更加灵活和方便。最新的Windows CE设备中加入了Windows Media Player 10 Mobile,它提供了和PC上的WMP控件一样强大的功能。你可以为你的移动设备增加多媒体能力,包括播放视频、音频文件,展示图片等等。你可以在文后所附的段落中找到可用的SDK和资源等相关信息。
下面我们简单介绍WMP的一些实现技术。
慨述
WMP SDK提供了很多的接口,但不是所有都能应用到Windows Mobile平台上来。下面列出可用的一些并进行解释:
接口
|
描述
|
IWMPCore
|
WMP对象模型的根接口。你可以由此获取其他接口的指针并且通过它访问其他空间的基本特性。
|
IWMPControls
|
允许一个应用程序访问Windows Media Player控件;如它的播放,停止和暂停按钮。
|
IWMPError
|
提供错误信息。
|
IWMPEvents
|
把由Windows Media Player控件产生的事件提供给一个可以反馈的嵌入式程序。
|
IWMPMedia,IWMPMediaCollection
|
管理媒体项的属性。
|
IWMPNetwork
|
设置和获取Windows Media Player所使用的网络连接
|
IWMPPlayer
|
控制Windows Media Player空间的用户接口的行为。
|
IWMPPlaylist,
IWMPPlaylistArray,
IWMPPlaylistCollection
|
播放列表操作。
|
IWMPSettings
|
设置或者获取Windows Media Player的设置。
|
创建第一个应用程序
下面由一个简单的ATL应用程序开始,你将创建一个空间容器窗口。下面的代码段使用了一个标准的ATL技术来展示Windows Media Player控件:
LRESULT CWMPHost::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
AtlAxWinInit();
CComPtr<IAxWinHostWindow> spHost;
CComPtr<IConnectionPointContainer> spConnectionContainer;
CComWMPEventDispatch *pEventListener = NULL;
CComPtr<IWMPEvents> spEventListener;
HRESULT hr;
RECT rcClient;
m_dwAdviseCookie = 0;
...
// 创建窗口
GetClientRect(&rcClient);
m_wndView.Create(m_hWnd, rcClient, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
if (NULL == m_wndView.m_hWnd) goto FAILURE;
// 在窗口中装载OCX
hr = m_wndView.QueryHost(&spHost);
if (FAILMSG(hr)) goto FAILURE;
hr = spHost->CreateControl(CComBSTR(_T("WMPlayer.OCX")), m_wndView, 0);
if (FAILMSG(hr)) goto FAILURE;
hr = m_wndView.QueryControl(&m_spWMPPlayer);
if (FAILMSG(hr)) goto FAILURE;
// 开始监听事件
hr = CComWMPEventDispatch::CreateInstance(&pEventListener);
spEventListener = pEventListener;
if (FAILMSG(hr)) goto FAILURE;
hr = m_spWMPPlayer->QueryInterface(__uuidof(IConnectionPointContainer), (void**)&spConnectionContainer); if (FAILMSG(hr)) goto FAILURE;
// 看OCX 是否支持IWMPEvents接口
hr = spConnectionContainer->FindConnectionPoint(__uuidof(IWMPEvents), &m_spConnectionPoint);
if (FAILMSG(hr)) goto FAILURE;
hr = m_spConnectionPoint->Advise(spEventListener, &m_dwAdviseCookie);
if (FAILMSG(hr)) goto FAILURE;
return 0;FAILURE: ::PostQuitMessage(0);
return 0;
}
|
你所要做的只是创建一个控件窗口,包含一个IWMPPlayer接口指针,并且对WMP事件进行响应。ATL可以用比MFC更加简便的方式来完成这些任务,当然你也可以使用MFC。你的程序现在就可以播放Windows媒体文件,比如WMA和WMV。
<!--[if !vml]--><!--[endif]-->
|
WMP控件也允许程序员来控制它的行为,比如你可以这样开始播放一个媒体文件:
LRESULT CWMPHost::OnFileOpen(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CFileOpenDlg dlgOpen;
HRESULT hr;
if (dlgOpen.DoModal(m_hWnd) == IDOK)
{
hr = m_spWMPPlayer->put_URL(dlgOpen.m_bstrName);
if (FAILMSG(hr))
return 0;
}
return 0;
}
|
Windows Mobile Player 10的移动范例提供了一系列的控件使用范例。
在Web应用程序里使用WMP OCX
在使用Web浏览器的时候,应用WMP编程就更加容易了(这是SDK里的例子):
<HTML>
<HEAD>
</HEAD>
<BODY>
<OBJECT ID=wmpocx WIDTH=200 HEIGHT=150 CLASSID="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" TYPE="application/x-oleobject" VIEWASTEXT>
<PARAM name="uimode" value="none">
</OBJECT><BR>
<script for="wmpocx" event="PlayStateChange(NewState)" language="JScript">ClipPlayState(NewState);
</script>
<script for="wmpocx" event="Error()" language="JScript">StopPlayer();</script>
<p>
<a href=# OnClick='PlayClip("\storage card\webapp\glass.wmv", ImgVideoPlay, true)'>
<IMG id="ImgVideoPlay" src="bt_play.gif" border="0">
</a>
Video<br>
<a href=# OnClick='PlayClip("\storage card\webapp\jeanne.wma", ImgAudioPlay, false)'>
<IMG id="ImgAudioPlay" src="bt_play.gif" border="0">
</a> Audio<br>
Play state sequence<br>
<input type="text" id="PlayStateSequence" width=30>
<SCRIPT language="JScript">
<!--var CurrentPlayImage = null;
var bVideo = null;
var bWasBuffering = false;
function StopPlayer()
{
wmpocx.controls.stop();
wmpocx.close();
if (CurrentPlayImage != null)
{
CurrentPlayImage.src = "bt_play.gif";
}
bWasBufferring = false;
}
function ClipPlayState(NewState)
{
PlayStateSequence.value = PlayStateSequence.value + NewState + " ";
switch(NewState) {
case 1:
// stopped
if (bWasBuffering)
{
bWasBufferring = false;
if (CurrentPlayImage != null)
{
CurrentPlayImage.src = "bt_play.gif";
}
}
break;
case 6:
// buffering
bWasBufferring = true;
if (CurrentPlayImage != null)
{
CurrentPlayImage.src = "bt_load.gif";
}
break;
case 9:
// transitioning
case 11:
// reconnecting
bWasBufferring = false;
break;
case 3:
// playing
if (bWasBufferring)
{
if (CurrentPlayImage != null)
{
CurrentPlayImage.src = "bt_stop.gif";
}
if (bVideo)
{
wmpocx.fullScreen = true;
}
}
break;
default:
}
}
function PlayClip(url, img, video)
{
if (wmpocx.playState == 3 && bVideo != null && bVideo != video)
{
return;
}
bVideo = video;
CurrentPlayImage = img;
if (wmpocx.playState == 3)
{
StopPlayer();
}
else
{
PlayStateSequence.value = "";
if (CurrentPlayImage != null)
{
CurrentPlayImage.src = "bt_load.gif";
}
wmpocx.URL = url;
}
}
-->
</SCRIPT>
</BODY>
</HTML>
|
使用旧版本的WMP控件
如果你使用的手持设备没有WMP10,那事情还没有完。你仍然还可以使用WMP OCX版本8来为你的Pocket PC编程,虽然提供的功能特性少,好在也可以基本满足需要。我创建了一个简单的工程来展示它如何在MFC环境下工作。下面的代码段证明了它和ATL方式一样简单:
BOOL CWMP8SampleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this
// automatically when the application's main window is not
// a dialog
SetIcon(m_hIcon, TRUE);
// Set big icon
SetIcon(m_hIcon, FALSE);
// Set small icon
CenterWindow(GetDesktopWindow());
// center to the hpc screen
CRect rect;
m_Panel.GetClientRect(&rect);
if ( m_PlayerWnd.CreateControl(__uuidof(WMP),L"", WS_VISIBLE|WS_CHILD,rect, &m_Panel,AFX_IDW_PANE_FIRST) )
{
LPUNKNOWN lpUnk = m_PlayerWnd.GetControlUnknown();
HRESULT hr = lpUnk->QueryInterface(__uuidof(IWMP),(void**) &m_spWMPPlayer);
}
else
{
AfxMessageBox(L"Failed to create WMP control");
::PostQuitMessage(0);
return 0;
}
if ( m_spWMPPlayer )
{
m_WMPEvents.m_pMainDlg = (CWMP8SampleDlg*)this;
CComPtr<IConnectionPointContainer> spConnectionContainer;
HRESULT hr = m_spWMPPlayer-> QueryInterface( IID_IConnectionPointContainer, (void**)&spConnectionContainer );
if (SUCCEEDED(hr))
{
hr = spConnectionContainer-> FindConnectionPoint( __uuidof(_IWMPEvents), &m_spConnectionPoint );
}
if (SUCCEEDED(hr)) { hr = m_spConnectionPoint->Advise((IDispatch*)&m_WMPEvents, &m_dwAdviseCookie );
}
else
{
AfxMessageBox(L"Failed to get WMP control events");
::PostQuitMessage(0);
return 0;
}
if ( FAILED(SetupWMP()) )
{
AfxMessageBox(L"Failed to setup WMP control");
::PostQuitMessage(0);
return 0;
}
}
m_spWMPPlayer->Stop();
return TRUE;
// return TRUE unless you set the focus to a
// control
}
|
WinCE开发流媒体播放器--MPEG4相关推荐
- android 流播放器开发,GitHub - youcoding98/FastVideo: 基于Android平台的移动流媒体播放器的开发...
基于Android平台的移动流媒体播放器的开发 主页界面如下 第一部分 课题相关介绍 与普通播放器相比,流媒体播放器最主要的不同点在于其能够实现实时的视频播放,用户可以实现边加载边播放,不需要一次全下 ...
- EasyPlayerPro(Windows)流媒体播放器开发之框架讲解
EasyPlayerPro for Windows是基于ffmpeg进行开发的全功能播放器,开发过程中参考了很多开源的播放器,诸如vlc和ffplay等,其中最强大的莫过于vlc,但是鉴于vlc框架过 ...
- 基于vlc的ActiveX流媒体播放器的二次开发流程
在ActiveX中使用Dialog开发基于libvlc的流媒体播放器 一. 首先创建一个ActiveX工程,工程名假设为:MyActiveX next,next,然后到下面界面,完成. 二. 创 ...
- EasyPlayerPro(Windows)流媒体播放器开发之跨语言调用
下面我们来讲解一下关于EasyPlayerPro接口的调用,主要分为C++和C#两种语言,C++也可以基于VC和QT进行开发,C++以VC MFC框架为例进行讲解,C#以Winform框架为例进行讲解 ...
- EasyPlayerPro(Windows)流媒体播放器开发之接口设计
EasyPlayerPro(windows)接口说明如下: EasyPlayerPro_Open 说明:打开一个媒体流或者媒体文件进行播放,同时返回一个 player 对象指针 参数说明: fileU ...
- 基于Android平台的流媒体播放器的设计
from: 基于Android平台的流媒体播放器的设计 1引 言 随着移动通信技术和多媒体技术的迅速发展,融合手机.网络.多媒体技术为一体的视频监控技术也有了长足的进步,通过移动通信网络提供流媒体服务 ...
- android H264(3): 流媒体播放器设计方案
如果说一个人的力量有限,那么网络的力量就是无穷的.研究H264的目的就是自己定制一个流媒体播放器,实时播放视频. 好在网上牛人颇多,站在巨人的肩上,压力会小很多. 播放器整体设计方案 一般播放器整体设 ...
- 视频流媒体播放器EasyPlayer.js如何实现在FLV直播流断流恢复后自动重连?
背景分析 EasyPlayer-Android播放器是一款可针对RTSP.RTMP.RTSP&RTMP协议进行过优化的流媒体播放器,其中我们引以为傲的两个技术优势就是起播速度快和播放延迟低.最 ...
- WINCE开发更安全可靠设备驱动的最佳实践
********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...
- WinCE开发初探——开发环境
eVC 4 Sp4 VS.net 2003 .net CF1.0 VS.net 2005 .net CF2.0 Windows Mobile 2003 Second Edition Emulator ...
最新文章
- jQuery.append()、jQuery.html()存在的XSS漏洞
- (C++)1041 考试座位号
- react把表格渲染好ui_在React中实现条件渲染的7种方法
- Mallet机器语言工具包-入门测试
- 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
- 2018 CVPR GAN 相关论文调研
- vue 移动端头像裁剪_使用vue-cropper裁剪正方形上传头像-阿里云开发者社区
- HitPaw Watermark Remover视频图去除水印工具V1.2.1.1
- 酒的基金降幅较大,这是为什么?
- nftables-howto-zh中文手册(不完整)
- POJ3978 Primes【素数筛选+前缀和】
- 贝叶斯优化混合核极限学习机回归预测
- 前中后序遍历对比记忆
- EPS格式转黑白照片(高清晰版本)
- 设计配色的基本知识以及原理
- python编程就业_python编程语言就业做什么工作的?python就业方向
- 加多宝李二强:营销数字化闭环初体验,真的很爽
- 游戏开发之路-hxx
- python pyplot的plot( )函数
- springboot毕设项目创新创业管理系统1f90r(java+VUE+Mybatis+Maven+Mysql)
热门文章
- PCB板设计流程有哪些?
- STM32F103标准库函数驱动max30102心率血氧模块
- android fps性能分析,Android性能专项FPS测试实践(二)
- RescuePRO Deluxe(闪迪数据恢复) v6.0.3.1中文破解版
- 京瓷p5018cdn教程_京瓷ECOSYS P5018cdn驱动
- 计算机硕士工资一览表,2021年计算机硕士工资一览表.doc
- 注册美国iTunes账号步骤(跳过绑定银行卡)
- 大龄人员跨行程序员的自学之路(序)
- python小学教材全解_小学教材全解三年级下数学
- 推好单-好券app是怎么代理分享赚钱的?