網上很多寫使用WindowsMediaPlayer WMP控制項的文章. 大多數都是從工具欄或COM導入. 最近正在做的CEF整合Asp.Net Core Blazor server side的過程中, 因為CEF編譯支持mp4的dll是涉及了版權的問題, 不能隨便乾的. 要播放mp4, 可以用Win ...
網上很多寫使用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文檔地址為
https://docs.microsoft.com/en-us/windows/win32/wmp/player-object
可以通過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