找回密码
 加入
搜索
查看: 6841|回复: 6

[原创] 重发:WMP IE内嵌

  [复制链接]
发表于 2010-12-31 15:02:21 | 显示全部楼层 |阅读模式
原帖:http://www.autoitx.com/thread-20771-1-2.html
收费设置错了,原以为设置的是附件收费。改不过来了。

1. WMP的视窗大小问题
当有过调用wmp经验的人,都会不约而同的为WMP的视窗无法自由调整而头疼吧?为此我也头痛了很久…最终选择了IE内嵌WMP,这方法是可以调整初始大小了,但无法像WMP原来的50%,100%,200%作动态调整了,鱼与熊掌…还有,值得一提的是,内嵌IE后的WMP,某些功能上和非IE内嵌的有差异。

2. 命令:.sourceurl问题
内嵌IE的wmp,比较突出的是:.sourceurl这个命令实效了,
而我的解决方法很有趣,呵呵,我的做法是:除了内嵌IE的wmp外,再另外调用一个WMP控件,这个控件无需显示出来,只需一行。。。。。ObjCreate("WMPlayer.OCX"),我创建时句柄为infplayer,为方便下文的阅读特意提一下(IE内嵌的wmp,句柄为$player)。
$INFPlayer.currentMedia = $Player.currentMedia
$CurrentURL = $INFPlayer.currentMedia.sourceurl
这时候,正在播放的文件路径出来了吧??这是一种方法,但我没有采用,原因下文我会叙述。

3. 播放光盘文件问题
内嵌的IE的WMP也不能和光盘设备接洽了,换句话说,光盘上的东西,你是别想播放了。估计是微软为了系统的安全着想,禁止了内嵌IE的WMP访问DVD这部分功能
这时候,有心人通过上个URL问题可以想象得到,创建的INFPLAYER大有用途了。。。可以大胆发挥想象,有什么内嵌网页的WMP无法实现,那么,将使用额外的这个来尝试实现,$ROM_OBJ = $INFPlayer.cdromCollection.getByDriveSpecifier($iROM_Letter);通过盘符,返回指定的CDROM object,哈哈,这次,和解决URL时相反,这次是INFPLAYER获取的光盘驱动器数据传递给内嵌的IEwmp,呵呵,你会发现,可以播放了。。。我没能解决播放DVD影片时的片段获取问题,只能勉强把DVD播放出来(就是显示出DVD的title画面,选择第N集的那个画面,没能获取到片段轨道…)我的表述不太好,不知道大家能不能理解到。通过以上的两个问题的解决方法不难看到,两种方式的WMP,一起配合起来,有点意思。。。

4. 播放列表问题
该说一说播放列表的问题了,wmp在播放列表上,是烦人的。。。因为它不能直接返回当前播放的歌曲,是列表中的第X项……这个问题,初看看是小问题,但真正想获取当前歌曲的序号,WMP还真是弱,只提供了一个命令:$player.currentmedia.isIdentical($player.currentPlaylist.item($i)) 当然,你也可以来个for…next,遍历列表,逐项逐项检查。。。
我之前试验过,呵呵,列表中有个1000来首歌时,反应慢了点。。。
为此,我连续做了几个方法的尝试,代码也大幅度的改变,换来的是一个又一个的Old,backup文件放在硬盘上,试验的方法我就不说了,我最终的做法是:放弃wmp官方的列表功能,自己建列表,就是说,连appenditem这个命令也不使用了。对这个方法,很多人认为不好,但倘若配合WMP的“播放文件到达末端: playstate = 8 :mediaend  ”这个事件呢?
我猜想,原WMP在播放歌曲的序号问题上,交托给了它自身的playlist控件负责了。

5.WMP的事件
这个是重头戏。上个问题看上去没解决掉吧?因为这关系到WMP的消息捕获。在这里,我托个大,虽然我很少来论坛,但论坛上现有的WMP软件,还没应用到WMP的事件吧?
本人对软件的资源占用一直“耿耿于怀”,有了这个WMP本身的事件触发,可省事多了,对于减少资源占用也大有益处,我脚本中,主循环为空,2个adlibregister,虽然这个说明不了什么。而WMP的事件接口是:_WMPOCXEvents,我们要做的是只需要把这个接口放到ObjEvent函数中的“接口”这个参数中。。。
在这就不说WMP的事件函数了,翻翻它的SDK,很容易找到。
我就是用它返回的事件:playstate = 8,意思是媒体文件即将播放到末端了,这时候,我在这个消息后面,又给WMP指派了下一首我想播放的歌曲文件给它,所以,上面我说,我完全放弃了wmp原有的playlist功能,是这样实现我自己的列表的。这方面好处是,播放的序号完全自己掌控,能顺序播放,循环播放,随机播放,单曲循环,单曲播放,就像TTplayer。。

6. 播放列表的保存,我用的是sqlite
在这请教下,有二维数组的_ArrayConcatenate么??如果有的话,那么配合sqlite和函数_GUICtrlListView_AddArray,那么播放列表的添加和保存速度问题上,就得到很好解决了。。。我使用的方法,特点是打开快,保存慢,因为保存时需要逐项逐项获取列表中的数据,如_ArrayConcatenate函数支持二维,那么可以创建一个跟随列表的数组了,这个方法,大家认为可行么?我3600+的CPU,向listview添加1100首歌曲,sqlite和函数_GUICtrlListView_AddArray共同作用下,结果是2秒左右,可是保存1100首,得8秒左右…

7.最后,说一说播放器的KTV功能。。
本来,如果在同一个程序,同一脚本中,创建2个播放器的GUI,那么控制它们的播放和同步会很容易吧?呵呵,我技术太烂,没能解决它们之间的冲突,同一脚本中,播放进度越是接近,那么出现内存冲突的机会越大。。。特别是在歌曲切换瞬间,经常出现报错。。。
另外,既然是KTV功能,需要全屏吧,呵呵,我试验过了,因为我的做法是监视主播放器,KTV播放器是跟随状态的。这情况下,KTV播放器会因为接收到主播放器的各种命令,会有跳出全屏状态的情况。呵呵,因此,我硬盘上又出现了一个又一个OLD,BACKUP文件。。。
wmp没有提供全屏的消息返回,至少我没找到。意思是,如果要知道是否全屏状态,得调用以下命令:$play.fullscreen判断返回值,但如果在循环中放下这个语句,在切换歌曲时,更加容易造成退出全屏的现象。
一怒之下,我放弃了全屏,干脆都使用IE内嵌,调整GUI大小来实现“全屏”,效果是达到了,差强人意吧。
为避免2个WMP控件的内存出错,我独立开了文件,KTV播放器做成一个独立程序,主程序使用UDP通信通知另外一个程序。
故此,杀毒软件必须给KTV播放器放行。。。

8. KTV播放器的字幕
受到afan的字幕滚动的触发,做了个KTV字幕,添加了几个字幕效果:淡入淡出,由右向左移入,上下移入,恩,差强人意吧。
在此向afan以及AUTOIT论坛的各位版主和人员致谢。

9. 一个想法
本来还想添加个“媒体分段”的功能的。意思是把演唱会等媒体文件,按照我想要的位置,做好分段数据备份,免去歌手们洋洋洒洒的过场词,跳跃式播放。
这个功能是能做出来,但我截图失败了,截出来的图是一个黑色的播放窗口。。。
截图对象改为KTV播放窗口的话,是成功的,原因我不知道,最后我把这个功能去掉了。。。


说说我写这个播放器作用吧,初衷是家庭KTV伴唱

软件简介:
1.编写环境:xp
2.存储方式:sqlite
3.外部文件拖拽,几个列表间文件的拖拽
4.独立KTV播放窗口,跟随主播放器(过瘾的是两个播放器同步起来,再设置2个播放器的声音和声道,当二者之间同步情况良好的条件下,把它们的声音都打开,会有点混响的效果,挺好玩的。。。)
5.KTV播放器字幕功能,简单的几个字幕效果
6.软件越写,想法越多,也突然觉得累了,软件没算完结,不写了,软件的初衷算是达到了,而且wmp根本无法满足越来越多的媒体格式要求,我之前有抛弃它的想法。。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-12-31 21:43:30 | 显示全部楼层
不错 学习一下
发表于 2010-12-31 22:41:06 | 显示全部楼层
被图吸引来了 ,支持...
发表于 2011-1-1 08:53:31 | 显示全部楼层
吸引中。。。。都是强人
发表于 2011-1-1 11:31:49 | 显示全部楼层
很不错喔,有源码就更好了
发表于 2011-3-1 14:17:13 | 显示全部楼层
如何切换原唱和伴唱?
发表于 2011-4-1 20:54:49 | 显示全部楼层
不错的软件,不知道有没有源码
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-28 01:49 , Processed in 0.086448 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表