日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

在Winform中播放视频等【DotNet,C#】

發(fā)布時(shí)間:2025/3/8 C# 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Winform中播放视频等【DotNet,C#】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在項(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。