用API函数设计AVI播放器

时间:2022-09-21 02:23:33

用API函数设计AVI播放器

【摘要】 Windows API函数功能强大,可实现硬件控制和低级操作。本文阐述在Visual Basic环境中调用相关的API函数设计AVI播放放器的全过程,附有源程序。

【关键词】 API函数,AVI播放器,Visual Basic

在Windows的动态链接库Winmm.dll中,提供了数百个专用于多媒体处理的API函数。其中与MCI(媒体控制接口)有关的高级函数mciExecute()和mciSendString()功能强大,利用这两个函数可设计一个简单的AVI播放器。

一、设计AVI播放器所需函数

1、mciExecute()函数

其功能是执行MCI指令,当出现错误时将自动弹出对话框。如对sound.wav文件进行打开、播放的代码为:I=mciExecute("open "d:\sound.wav" alias sound")和I=mciExecute("play sound") 。

2、mciSendString()函数

该函数的功能与上面的函数相同,但它可以传送相应的信息给应用程序。使用时需要四个参数,第一个是MCI命令字符串, 第二个是缓冲区用于存储传给应用程序的信息,第三个是缓冲区长度,第四个在Visual Basic中可恒置为0;使用此函数能播放哪些媒体文件呢,可以打开win.ini文件看看便知道,找到[mci extensions]部分,这里记录了你的计算机所能使用的所有媒体文件名,如:mid=Sequencer,等号左边的表示媒体文件的扩展名,等号右边的表示打开此媒体文件的设备名。

函数返回值为:如果成功执行,则返回值为0,如果文件不存在或出现其他错误,错误代码为非零值,但程序不会中断。若要根据错误代码自行处理错误信息,可以使用mciGetErrorString函数处理,这里不再赘述。

二、AVI播放器设计

1、启动Visual Basic,建立一个新工程。

2、单击【工程】|【部件】命令,在【控件】选项卡下选中通用对话框控件(Microsoft Common Dialog Contrl 6.0),单击【确定】按钮。

3、在窗体上建立如下控件:7个按钮、1个框架、4个单选钮、3个标签、1个垂直滚动条、1个水平滚动条、1个图片框、1个通用对话框、1个计时器。设计时界面如图所示。

4、打开Visual Basic自带的【API浏览器】,调入WIN32API.txt文件,复制API函数mciExecute()和mciSendString的声明到【代码窗口】的声明段,注意它们的类型都是Private。然后在声明段再定义如下变量:Dim AviFile As String,该变量用来存储运行时所选择的AVI文件的标识符(包括文件名和路径)。

5、编写窗体Load事件过程,设置除【打开】按钮外的其他各控件的初始状态为False。

6.编写【打开】按钮Click事件过程,激活通用对话框,选取播放文件,并将第0格画面送入图片框准备播放,同时将相关按钮状态设置为True。

Private Sub CmdOpen_Click()

On Error Resume Next

Dim ReturnStr As String * 128

' 定义mciSendStrin()参数变量,存放返回信息

Dim ErrorCode As Long '保存mciSendStrin()函数值

AviFile = ""

CommonDialog1.Filter = "影像文件.avi|*.avi|"

CommonDialog1.ShowOpen ' 选文件

AviFile = CommonDialog1.FileName

If AviFile = "" Then Exit Sub '不选文件退出

End If

ErrorCode& = mciSendString("capability avi device type", ReturnStr, 128, 0) '返回设备类型

If ErrorCode& = 0 Then mciExecute ("close avi")

End If

Picture1.Cls

mciExecute ("open " + AviFile + " alias avi")

mciExecute ("window avi handle " + Str(Picture1.hWnd)) '设置播放窗口

mciExecute ("cue avi to 0") ' 显示第0格并暂停

CmdPlay.Enabled=True: CmdStart.Enabled=True

CmdEnd.Enabled=True: CmdForward.Enabled=True

CmdBackward.Enabled=True CmdClose.Enabled=True

HScroll1.Enabled = True:VScroll1.Enabled = True

OptLeft.Enabled = True: OptRight.Enabled = True

OptAll.Enabled = True: OptSilent.Enabled = True

Timer1.Enabled = True

End Sub

7、编写其他六个按钮的Click事件过程。

Private Sub CmdPlay_Click()

If CmdPlay.Caption = "播放" Then

mciExecute ("play avi") : CmdPlay.Caption="暂停"

Else

mciExecute ("pause avi"):CmdPlay.Caption="播放"

End If

End Sub

Private Sub CmdStart_Click()

Dim r As Long

r = mciExecute("seek avi to start") ' 回起点并暂停

CmdPlay.Caption = "播放"

End Sub

Private Sub CmdEnd_Click()

mciExecute ("seek avi to end")

End Sub

Private Sub CmdForward_Click()

Dim r As String * 128, ReturnStr As String * 128

r = mciSendString("step avi by 1", ReturnStr, 128, 0)

End Sub

Private Sub CmdBackward_Click()

Dim r As String * 128, ReturnStr As String * 128

r=mciSendString("step avi by -1", ReturnStr, 128, 0)

CmdPlay.Caption = "播放"

End Sub

Private Sub CmdClose_Click()

ErrorCode& = mciSendString("capability avi device type", ReturnStr, 128, 0)

If ErrorCode& = 0 Then mciExecute ("close avi")

End If

Picture1.Cls

Unload Me

End Sub

8.编写【声道选择】框架中各单选钮的Click事件过程。

Private Sub OptLeft_Click()

Dim ReturnStr As String * 128

Dim ErrorStr As String * 128

ErrorStr = mciSendString("set avi audio left on", ReturnStr, 128, 0) ' 开左声道

ErrorStr = mciSendString("set avi audio right off", ReturnStr, 128, 0) ' 关右声道

OptLeft.Value = True

End Sub

Private Sub OptRight_Click()

Dim ReturnStr As String * 128

Dim ErrorStr As String * 128

ErrorStr = mciSendString("set avi audio right on", ReturnStr, 128, 0) ' 开右声道

ErrorStr = mciSendString("set avi audio left off", ReturnStr, 128, 0) ' 关左声道

OptRight.Value = True

End Sub

Private Sub OptAll_Click()

Dim ReturnStr As String * 128

Dim ErrorStr As String * 128

ErrorStr = mciSendString("set avi audio all on", ReturnStr, 128, 0)

OptAll.Value = True

End Sub

Private Sub OptSilent_Click()

Dim ReturnStr As String * 128

Dim ErrorStr As String * 128

ErrorStr = mciSendString("set avi audio all off", ReturnStr, 128, 0) ' 关所有声道

OptSilent.Value = True

End Sub

9、编写时钟控件的事件过程Timer1_Timer(),用于实现实时更新,监测播放状态并决定各控件按钮的状态,其中包含了水平滚动条的设置。小公用模块StrVB用来实现将mciSendString函数返回的字符串转换成Visual Basic的字符串。

Private Sub Timer1_Timer()

Dim ErrorCode As Long, ReturnStr As String * 128

Dim length, position, AviMode As String

ErrorCode = mciSendString("status avi position", ReturnStr, 128, 0)

position = StrVB(ReturnStr)

ErrorCode = mciSendString("status avi length", ReturnStr, 128, 0)

length = StrVB(ReturnStr)

If ErrorCode = 0 Then

Label3.Caption = "当前位置:" & position & "/" & length

End If

HScroll1.Value = Val(position) / Val(length + 1) * 100

If position = length Then

CmdEnd.Enabled=False: CmdPlay.Enabled=False

CmdForward.Enabled=False

CmdBackward.Enabled=True

CmdStart.Enabled = True

Else

CmdForward.Enabled = True

CmdPlay.Enabled=True: CmdEnd.Enabled=True

End If

If position = 0 Then CmdBackward.Enabled = False

Else CmdBackward.Enabled = True

End If

End Sub

Function StrVB(s As String) As String

Dim L As Long : L = InStr(s, Chr(0))

StrVB = Mid(s, 1, L - 1)

End Function

10、编写垂直滚动条的Change事件过程。

Private Sub VScroll1_Change()

On Error Resume Next : mciExecute ("setaudio avi volume to " & CStr(VScroll1.Max - VScroll1.Value))

End Sub

以上播放器设计简单易学,供大家参考。

作者简介:邵淑霞(1968.8),女,汉族,黑龙江大庆人,石油大学(华东)计算机及其应用工学学士,副教授,从事计算机网络、软件开发方面研究。

上一篇:我国商品进口总额因素影响的实证分析 下一篇:asp.net实现Excel数据批量导入Web系统数据库