时间:2022-08-07 10:36:19
摘 要:随着网络的盛行,一些不健康的信息也随之而来。特别是对于不健康的视频正在充斥的很大一部分青少年的心灵。而且在如今市面上流行的播放器,没有甄别的功能。对于一些认为不应该再次播放的视频,我们应该能够主动的屏蔽掉,这样当我们再次“心动”之时,此类文件已经处于禁止范围之内。鉴于如今影音文件的格式,我们设计了这款有“记忆”功能的播放器,成功实现对影片的“过滤”。
关键词:视频播放器;可记忆;窗体设计
中图分类号:TP
文献标识码:A
文章编号:1672-3198(2010)19-0323-02
1 设计分析
基于vb.省略.其次在播放器的设计上我们应用directionshowlib-2005,编写了一个相对功能简单的小控件,当然我们的目的不是播放视频。对于过滤的功能,我们用到的是二进制文件,在每播放一个影音文件的初始,我们要检测此影片的信息是否和禁止播放的信息相吻合,如果吻合则拒绝播放,退出程序,否则正常播放。
2 视频控件建立
2.1 关于directshow2005
Directshowlib-2005是国外一些人用C#编写而成,它把许多功能结构和接口重新定义然后封装,指定好各GUID。这个dll文件是进行关于视频采集方面快速开发的组件,编写控件当中只要简单的继承一些需要实现的事件,改变成自己想要的结果即可以,其它的内容不必改变,编译,生成控件即可。
2.省略环境下制作控件首先要建立一个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)中 建立Windows窗体应用程序,首先引入IO(openDialog)和directshowlib-2005(MemoryVedio)。
(2)引入工具MemoryVedio,并添加,依次添加需要的控件,并把必要的属性规定好,布局排列匀称。
(3)对各个控件添加相应的代码,并流程控制各个控件之间的联系。
(4)把上面对文件的操作加入代码中(readNowFile(),readDataFile(),writeFile,CheckFile()),并在文件目录中添加Data文件。
6 结语
鉴于如今各种格式的影片并没有格式化,和一些“流”信息的检测并不是很成熟,不健康的信息检测很困难。加之人的观念不同,是不能依据某种定义来区分好与不好的。所以在这里人为的实现添加,一方面起到自我保护,另一方面对好与不好依照主人的意见而定。当然我们想额外提出一点就是希望以后影片的发展可以格式化――即各种影片格式都有自己的编码区、各种级别的影片也都有自己的编码验证区,这样就有利于侦测,而不必像查杀病毒一样来检测。
参考文献
[1]陆其明.DirectShow开发指南[M].北京:清华大学出版社,2003.
[2]王进强.Visual 基础教程[M].北京:清华大学出版社,2004.