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