在Winform中播放视频等【DotNet,C#】
在項(xiàng)目中遇到過(guò)這樣的問(wèn)題,就是如何在Winform中播放視頻。當(dāng)時(shí)考察了幾種方式,第一種是直接使用Windows Media Player組件,這種最簡(jiǎn)單;第二種是利用DirectX直接在窗體或者控件上繪圖,這種比較復(fù)雜。于是采用的是第一種方法。
????? 先從VS的工具箱里添加Windows Media Player組件,方式是打開(kāi)工具箱,在最下面的空白處點(diǎn)擊右鍵,選擇項(xiàng),然后在彈出的對(duì)話框里切換到Com組件標(biāo)簽項(xiàng),找到“Windows Media Player”項(xiàng)并選中,確定后將在工具箱中看到多出一個(gè)圖標(biāo),然后就可以將這個(gè)圖標(biāo)拖到窗體上進(jìn)行設(shè)置了。
?
????? 在這里主要講下,設(shè)置Windows Media Player組件時(shí),有個(gè)屬性是“無(wú)窗口播放”,如果不啟用的話,在視頻播放時(shí)點(diǎn)擊鼠標(biāo)的話,視頻會(huì)切換到全屏狀態(tài),啟用就不會(huì)發(fā)生。但啟用的話,視頻的清晰度會(huì)下降很多(顆粒感變得很明顯),不啟用鼠標(biāo)點(diǎn)擊又會(huì)放大。最初我采用定時(shí)將全屏屬性改為False來(lái)實(shí)現(xiàn),時(shí)鐘設(shè)置成100毫秒或者更小,表現(xiàn)出來(lái)的就是用戶雙擊視頻后,屏蔽忽地一下變大然后又恢復(fù)原樣,更危險(xiǎn)的是此操作有一定機(jī)率(而且不低)會(huì)將XP的任務(wù)欄暴露出來(lái)(因?yàn)槲覀兊慕K端是要全屏顯示,不能讓用戶看到桌面及其它操作項(xiàng)的),于是我反復(fù)測(cè)試,最終采用的另外一種方式,即過(guò)濾窗體事件來(lái)直接屏蔽掉視頻區(qū)域的鼠標(biāo)消息。具體實(shí)現(xiàn)如下:
?
??? 先定義一個(gè)消息過(guò)濾類,用來(lái)屏蔽指定區(qū)域的鼠標(biāo)雙擊或者單擊消息。然后在應(yīng)用程序中加載此過(guò)濾器即可實(shí)現(xiàn)屏蔽消息功能。
public class MessageFilterMgr : IMessageFilter?
{?
??? Rectangle Rect;?
??? public MessageFilterMgr(Rectangle rect)?
??? {?
??????? Rect = rect;?
??? }
??? public void Start()?
??? {?
??????? Application.AddMessageFilter(this);?
??? }
??? public void Stop()?
??? {?
??????? Application.RemoveMessageFilter(this);?
??? }
??? public bool PreFilterMessage(ref System.Windows.Forms.Message SystemMessage)?
??? {?
??????? if (SystemMessage.Msg >= 513 && SystemMessage.Msg <= 515) //513|515是對(duì)應(yīng)目標(biāo)消息的值?
??????? {?
??????????? if (Control.MousePosition.Y > Rect.Y && Control.MousePosition.Y < Rect.Y + Rect.Height?
??????????????? && Control.MousePosition.X > Rect.X && Control.MousePosition.X < Rect.X + Rect.Width)?
??????????? {?
??????????????? return true;?
??????????? }?
??????? }?
??????? return false; //響應(yīng)則為false?
??? }?
}
????? 鼠標(biāo)點(diǎn)擊問(wèn)題已經(jīng)解決,現(xiàn)在剩下最后一個(gè)問(wèn)題了,就是如何實(shí)現(xiàn)視頻連續(xù)播放功能。開(kāi)始我使用Window Media Player的狀態(tài)改變事件來(lái)控制,即當(dāng)播放器的狀態(tài)改變時(shí),發(fā)現(xiàn)它是停止?fàn)顟B(tài),馬上發(fā)送播放下一個(gè)視頻的指令,此種方法控制比較繁瑣,視頻之間停頓時(shí)間有點(diǎn)長(zhǎng)(大約0.4秒的樣子)。后來(lái)改為使用播放列表,直接定義播放列表讓其自動(dòng)循環(huán)播放。實(shí)現(xiàn)如下:
this.Player.settings.setMode("loop", true);? // 將播放列表設(shè)置為循環(huán)播放?
foreach (string item in this.Videos)?
{?
????? this.Player.currentPlaylist.appendItem(this.Player.newMedia(item));? // 將視頻逐個(gè)添加至播放列表?
}
????? 最后,我們的終端又要實(shí)現(xiàn)視頻與圖片混合播放功能,即視頻播放完畢后再播放圖片,我也將實(shí)現(xiàn)方式歸納如下:
????? 在啟動(dòng)時(shí)取消將播放列表的循環(huán)播放;
????? 繼續(xù)利用播放組件的狀態(tài)改變事件,當(dāng)播放器的狀態(tài)為wmppsReady(當(dāng)播放列表中視頻數(shù)量大于1時(shí))或者wmppsStopped(當(dāng)播放列表中只有一個(gè)視頻時(shí))時(shí),表示播放已經(jīng)完畢,然后將播放組件隱藏,再啟用圖片自動(dòng)切換程序,等圖片切換完后,再將播放組件顯示,啟用播放。
????? 另,默認(rèn)狀態(tài)下,Windows Media Player支持的視頻格式很有限(最佳之選是WMV),想要支持更多的視頻格式,只能通過(guò)安裝視頻解碼器來(lái)實(shí)現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的在Winform中播放视频等【DotNet,C#】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: perl学习(1) 入门
- 下一篇: C# HttpWebResponse