摘 要:隨著網絡的盛行,一些不健康的信息也隨之而來。特別是對于不健康的視頻正在充斥的很大一部分青少年的心靈。而且在如今市面上流行的播放器,沒有甄別的功能。對于一些認為不應該再次播放的視頻,我們應該能夠主動的屏蔽掉,這樣當我們再次“心動”之時,此類文件已經處于禁止范圍之內。鑒于如今影音文件的格式,我們設計了這款有“記憶”功能的播放器,成功實現對影片的“過濾”。
關鍵詞:視頻播放器;可記憶;窗體設計
中圖分類號:TP
文獻標識碼:A
文章編號:1672-3198(2010)19-0323-02
1 設計分析
基于vb.net的設計優點,這款播放器我們的首選語言是vb.net.其次在播放器的設計上我們應用directionshowlib-2005,編寫了一個相對功能簡單的小控件,當然我們的目的不是播放視頻。對于過濾的功能,我們用到的是二進制文件,在每播放一個影音文件的初始,我們要檢測此影片的信息是否和禁止播放的信息相吻合,如果吻合則拒絕播放,退出程序,否則正常播放。
2 視頻控件建立
2.1 關于directshow2005
Directshowlib-2005是國外一些人用C#編寫而成,它把許多功能結構和接口重新定義然后封裝,指定好各GUID。這個dll文件是進行關于視頻采集方面快速開發的組件,編寫控件當中只要簡單的繼承一些需要實現的事件,改變成自己想要的結果即可以,其它的內容不必改變,編譯,生成控件即可。
2.2 控件的實現
當然在VB.net環境下制作控件首先要建立一個windows窗體控件庫應用程序,在主窗體中添加一個picturebox.然后就是重寫要實現 的功能代碼。這里我們省略了其它屬性和動作的實現,只講如何獲 取文件流而能夠播放的代碼實現。
(1)獲取過濾表圖像 fg=New FilterGraph’fg 為 IGraphBuilder
(2)通過過濾表圖像,獲得各個事件的接口(Interferce)
MemMControl = DirectCast(fg, IMediaControl)
MemMSeeking = DirectCast(fg, IMediaSeeking)
MemMVeido = DirectCast(fg, IBasicVideo2)
MemMPosition = DirectCast(fg, IMediaPosition)
MemMVideoWindow = DirectCast(fg, IVideoWindow)
MemMEventEx = DirectCast(fg, IMediaEvent)
(3)獲取Error事件,拋出錯誤類型(省略Enum)
hr = fg.RenderFile(NewMediaName, Nothing)
DsError.ThrowExceptionForHR(hrr)(hr 為 Integer)
在以下各每個加載事件的后也要拋出錯誤,下面就省略了。
(4)加載各個事件
MemMVideoWindow.put_Owner(Me.Handle)
MemMVideoWindow.put_MessageDrain(Me.Handle)
MemMVideoWindow.put_Visible(OABool.True)
MemMVedioWindow.put_WindowStytle(WindowStyle.Child)
MemMVedioWindow.SetWindowPosition(Me.ClientRectangle.Left,Me.ClientRectangle.Top,Me.ClientRectangle.Width,Me.ClientRectangle.Height)
(5)進入準備播放階段,通知相應的準備事件
3 過濾的操作
3.1 讀播放影片信息
首先定義二進制文件讀取流
Dim filein As New FileStream(strVName, FileMode.Open)
Dim mybin As New BinaryReader(filein)
然后定義全局變量nowFile()字節數組,用于存放信息。接著讀取文件長度length,以便設定讀取位置。定義變量percent來標識開始讀取的位置,初始值0.1,每讀取一次percent加0.1,通過filein.seek實現定位,向下一個位置繼續讀取連續的字節信息。實現代碼如下:
For percent = 0.1 To 0.6 Step 0.1
filein.Seek(position * percent, SeekOrigin.Current)
mybin.BaseStream.Read(nowFile, st + 1, 50)
st = st + 5
Next
3.2 讀取Data文件的內容
根據存放時字節信息的長度,決定每次讀取時讀取的字節數量。首先打開Data文件,建立讀取二進制流
(Dim fileout As New FileStream(“****”, FileMode.Open)
Dim mybin As New BinaryReader(fileout)),
根據下一個字節是否返回-1(mybin.PeekChar <> -1)判斷是否到達文件尾部。每讀取一個文件信息,進行比對,只要有一出不同則繼續讀取下一個文件信息
(If dataFile(i) <> nowFile(i) Then
Exit For
End If)。
如果全不相同則允許播放,否則禁止播放。注意在每讀取完一個文件信息之后需要將指針向后移動一個,這和文件存取時相一致。
3.3 寫入新的文件信息
在進行寫入之前也要檢測此信息是否已經存在于文件當中,如果存在則拒絕操作,否則只要根據此前讀取的源文件信息nowFile()中的信息,寫入文件即可(mybin.Write(nowFile))。
4 流程分析
4.1 播放影片
4.2 禁止播放
圖1
5 窗體設計
圖2
(1)VB.NET中 建立Windows窗體應用程序,首先引入IO(openDialog)和directshowlib-2005(MemoryVedio)。
(2)引入工具MemoryVedio,并添加,依次添加需要的控件,并把必要的屬性規定好,布局排列勻稱。
(3)對各個控件添加相應的代碼,并流程控制各個控件之間的聯系。
(4)把上面對文件的操作加入代碼中(readNowFile(),readDataFile(),writeFile,CheckFile()),并在文件目錄中添加Data文件。
6 結語
鑒于如今各種格式的影片并沒有格式化,和一些“流”信息的檢測并不是很成熟,不健康的信息檢測很困難。加之人的觀念不同,是不能依據某種定義來區分好與不好的。所以在這里人為的實現添加,一方面起到自我保護,另一方面對好與不好依照主人的意見而定。當然我們想額外提出一點就是希望以后影片的發展可以格式化——即各種影片格式都有自己的編碼區、各種級別的影片也都有自己的編碼驗證區,這樣就有利于偵測,而不必像查殺病毒一樣來檢測。
參考文獻
[1]陸其明.DirectShow開發指南[M].北京:清華大學出版社,2003.
[2]王進強.Visual Basic.NET基礎教程[M].北京:清華大學出版社,2004.