在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.
网上很多写使用windowsmediaplayer wmp控件的文章.
大多数都是从工具栏或com导入.
最近正在做的cef整合asp.net core blazor server side的过程中,
因为cef编译支持mp4的dll是涉及了版权的问题, 不能随便干的.
要播放mp4, 可以用winforms代劳. 执行wmp只是一小段代码, 不想导入dll ,
去查api.
发现了微软的官方文档, 和我使用的mediaplayer的api , 有出入.
?
经过多方查证, 验证, 发现原来 mediaplayer 一共是2个版本
一个是最后到 6.4 的 classic 版本, 一个是从 7 之后的新版本.
这篇博文用于纪录两者的区别
首先参考这个:
http://w3schools.sinsixx.com/media/media_playerref.asp.htm
6.4 | 7或以后 | |
clsid | 22d6f312-b0f6-11d0-94ab-0080c74c7e95 | 6bf52a52-394a-11d3-b153-00c04f79faa6 |
typelib | c:\windows\system32\msdxm.tlb | c:\windows\system32\wmp.dll |
typelib | mediaplayer | wmplib |
progid | mediaplayer.mediaplayer | wmplayer.ocx |
现在微软那边的sdk文档地址为
可以通过vs命令行执行
tlbimp c:\windows\system32\msdxm.tlb /out:d:\temp\msdxm_out.dll
tlbimp c:\windows\system32\wmp.dll /out:d:\temp\wmp_out.dll
来到处两个dll , 用ilspy查看:
6.4的就这样完结了 , 而7的类型列表就超长
总的说来 , 6.4 的 api 更直接一些. 全部都扔进 mediaplayerclass里了. 7的api非常多类型, 使用起来很复杂
如果不想导入这种类型的dll , 把c#当脚本用, 该如何?
使用这种代码:
string mp4file = system.io.path.combine(whe.webrootpath, "demo.mp4"); //windows media player 6.4 (classic) //type lib name "mediaplayer" //vs command : tlbimp c:\windows\system32\msdxm.tlb /out:d:\temp\msdxm_out.dll type type = type.gettypefromprogid("mediaplayer.mediaplayer.1"); console.writeline(type.guid); // 22d6f312-b0f6-11d0-94ab-0080c74c7e95 system.windows.forms.form form = new system.windows.forms.form(); myaxcontrol player = new myaxcontrol(type); form.controls.add(player); form.minimumsize = new system.drawing.size(400, 300); form.size = new system.drawing.size(800, 600); form.startposition = system.windows.forms.formstartposition.centerscreen; form.show(); type.invokemember("open", system.reflection.bindingflags.invokemethod, null, player.getocx(), new object[] { mp4file });
string mp4file = system.io.path.combine(whe.webrootpath, "demo.mp4"); //windows media player 7 or later //tlbimp c:\windows\system32\wmp.dll /out:d:\temp\wmp_out.dll //type lib name "wmplib" //https://docs.microsoft.com/en-us/windows/win32/wmp/player-object type type = type.gettypefromprogid("wmplayer.ocx"); console.writeline(type.guid); // 6bf52a52-394a-11d3-b153-00c04f79faa6 system.windows.forms.form form = new system.windows.forms.form(); myaxcontrol player = new myaxcontrol(type); form.controls.add(player); form.minimumsize = new system.drawing.size(400, 300); form.size = new system.drawing.size(800, 600); form.startposition = system.windows.forms.formstartposition.centerscreen; form.show(); type.invokemember("url", system.reflection.bindingflags.setproperty, null, player.getocx(), new object[] { mp4file });
公用代码:
class myaxcontrol : system.windows.forms.axhost { public myaxcontrol(type type) : base(type.guid.tostring()) { this.dock = system.windows.forms.dockstyle.fill; } }
以上两个代码分别调用了6.4和7的 api . 已测试通过.
注意, myaxcontrol 的 dispose 函数并不会随着form关闭而dispose掉. 需要手动dispose