多媒体应用程序设计初步

原创 2004年09月24日 11:08:00

摘要:文章简单地介绍了Microsoft® DirectX® 以及它在VB多媒体程序设计中的应用。DirectX® Microsoft® 推出的硬件应用程序接口(APIs),它包括DirectX® Graphics®DirectX® Audio® 等,使用它能够方便地实现二维、三维动画、音频数据段回放等功能。DirectMusic® DirectX® 的基本组件之一,主要用于MIDIWAVE等文件的回放。本文着重介绍它在VB多媒体程序设计中的应用。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

关键词:DirectX®VBAPIDirectMusic®MIDI

一、           DirectX介绍

Microsoft® DirectX®是用于游戏开发和高品质多媒体应用程序开发的一系列底层程序接口。它包括了对二维、三维图形、声音、音乐、输入的支持,它甚至可以在应用程序中支持网络通讯,比如允许多用户参与的网络游戏。DirectX包括了如下几个部分:DirectDraw®Direct3D®DirectMusic®DirectSound®DirectInput®DirectPlay®

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

DirectX APIs

DirectX Graphics

DirectX Audio

DirectShow

DirectDraw

Direct3D

DirectSound

DirectMusic

DirectInput

DirectPlay

DirectSetup


DirectDraw®
DirectX API的一个组成部分,它能够直接将显示缓冲区的内容直接输出,提供对显示设备的直接存取并在Windows图形设备接口上保留兼容性。

Direct3D®:提供三维图形的编程接口。

DirectMusic®:与DirectSound不同,它并不是为数字音频的捕获和回放设计的,而是一种基于消息机制的接口,它能通过硬件或软件合成器将数字音乐转换为声音样本并回放输出。VB中使用DirectX播放MIDI音乐也主要是使用这一组编程接口来实现。

DirectSound®:它提供对声音的高效混音、硬件加速以及对声音设备的直接存取。

DirectInput®:用于输入设备(如鼠标、键盘、游戏控制器等)控制的API

DirectShow®:是Microsoft Windows平台的流媒体构造接口,使用DirectShow技术能使应用程序完成高质量的音频、视频捕获和回放。

DirectPlay®:提供多用户网络游戏的支持。

DirectSetup®:安装DirectX组件的API接口。

 

二、VB中使用DirectX®实现MIDI文件的回放

要在VB中使用DirectX,请先按如下的过程初始化系统环境:

1、   启动Microsoft Visual Basic 6.0,新建一个标准的EXE文件(Standard EXE file);

2、   选择“Project”菜单并在菜单中选择“References”;

3、   在列表框中选中“DirectX8 for Visual Basic Type Library”后,点击“确定”按钮。

通过以上的设置,DirectX8 APIs就被成功地引用到了Visual Basic编程环境中,现在就可以方便地使用DirectX8 API函数了。

使用DirectX编程实现MIDI回放有三个步骤:初始化、播放和停止、释放对象。也就是说,在调用并回放MIDI文件以前要对DirectMusic对象进行初始化(包括对象的创建、数据段装载和声音通道初始化)。下面的几个函数可以实现这一初始化过程:

1.DirectMusicPerformanceCreate:创建一个DirectMusicPerformance8对象

调用:object.DirectMusicPerformanceCreate() As DirectMusicPerformance8

参数:object : DirectX8对象

返回:DirectMusicPerformance8对象

错误:如果调用不成功,Err.Number置位

2.DirectMusicLoaderCreate:创建一个DirectMusicLoader8对象

调用:Object.DirectMusicLoaderCreate() As DirectMusicLoader8

参数:object : DirectX8对象

返回:DirectMusicLoader8对象

错误:如果调用不成功,Err.Number置位

3.InitAudio:初始化Performance对象,要让声音能够正常播放,此函数应该首先被调用。

调用:object.InitAudio (hWnd As Long, lFlags As CONST_DMUS_AUDIO,  _

AudioParams As DMUS_AUDIOPARAMS,  _

[DirectSound As DirectSound8],  _

[lDefaultPathType As CONST_DMUSIC_STANDARD_AUDIO_PATH,  _

[lpChannelCount As Long])

参数:object : DirectMusicPerformance8对象

 hWnd : 建立DirectSound所使用的窗口句柄,如果为0,则使用前台窗口;

 lFlags : 枚举类型CONST_DMUS_AUDIO变量,用于指定所需要的特性。此结构包括:

DMUS_AUDIOF_3D : 3-D缓冲

DMUS_AUDIOF_ALL : 其它各种标志的组合

DMUS_AUDIOF_BUFFERS : 多缓冲区

DMUS_AUDIOF_EAX : EAX效果

DMUS_AUDIOF_ENVIRON : 环境模型

DMUS_AUDIOF_STREAMING : 支持流媒体类型

 AudioParams : 结构类型DMUS_AUDIOPARAMS变量。通过它可以将指定的参数传给音乐合成器,也可以读取当前的参数设置。此结构类型包括:

ClsidDefaultSynth : 当前默认的音乐合成器

FInitNow : 布尔型变量,用于指定合成槽和合成器是否立即建立

Lfeatures : 指定可能的通道标志

LSampleRate : 合成槽与合成器频率,范围11KHz96KHz,默认22KHz

LValidData : 指定此结构的哪些部分包含了有效数据标志

LVoices : 声音数量,默认值为64

 DirectSound : 声波输出时作为缺省值的DirectSound8对象(此项为可选项)

 LpChannelCount : 指定Performance通道数量

返回值:如果调用不成功,Err.Number置位

在理解了初始化的过程以后,就可以用VB编写初始化程序了。在使用函数以前首先要创建对象:

Dim dx8 As New DirectX8                     '定义DirectX8对象

Dim dxml As DirectMusicLoader8              '定义DirectMusicLoader对象

Dim dxmp As DirectMusicPerformance8        '定义DirectMusicPerformance对象

Dim dxms As DirectMusicSegment8            '定义DirectMusicSegment对象

Dim audParams As DMUS_AUDIOPARAMS     '定义DMUS_AUDIOPARAMS变量

音频初始化函数如下:

Private Sub Init_Audio()

Set dxmp = dx8.DirectMusicPerformanceCreate             '建立DirectMusicPerformance对象

Set dxml = dx8.DirectMusicLoaderCreate                  '建立DirectMusicLoader对象

                                                        '初始化DirectMusicPerformance对象

dxmp.InitAudio Me.hWnd, DMUS_AUDIOF_ALL, audParams, _

     Nothing, DMUS_APATH_SHARED_STEREOPLUSREVERB, 16

dxmp.SetMasterAutoDownload True

End Sub

至此,初始化过程完成,现在就可以装载MIDI文件并实现回放了。实现播放和停止要用到三个函数:

1.LoadSegment : 装载音频数据段文件

调用:object.LoadSegment (filename As String) As DirectMusicSegment8

参数:object : DirectMusicLoader8对象

 filename : 指定的文件名

返回:DirectMusicSegment8对象

错误:如果调用不成功,Err.Number置位

2.PlaySegmentEx : 回放数据段

调用:object.PlaySegmentEx (Source As Unknown, _

lFlags As CONST_DMUS_SEGF_FLAGS, _

startTime As Long, _

[from As Unknown], _

[AudioPath As Unknown]) As DirectMusicSegmentState8

参数:object : DirectMusicPerformance8对象

 Source : 要被回放的DirectMusicSegment8对象

 LFlags : 修改方法行为的标志

 StartTime : 开始回放的位置

 From : DirectMusicSegmentState8DirectMusicAudioPath8对象(可选)

 AudioPath : 指向DirectMusicAudioPath8的指针(可选)

3.StopEx : 停止回放

调用:object.StopEx (objectToStop As Unknown, _

lStopTime As Long, _

lFlags As Long)

参数:object : DirectMusicPerformance8对象

 objectToStop : DirectMusicSegment8DirectMusicSegmentState8DirectMusicAudioPath8对象

 lStopTime : 指定停止时间

 lFlags : 指定停止事件标志

我们可以通过一个“打开”对话框来指定要被用来回放的MIDI文件,程序代码如下:

CommonDialog1.Filter = "*.mid|*.mid"      

CommonDialog1.ShowOpen

If CommonDialog1.FileName <> "" Then

    Me.Caption = CommonDialog1.FileName

    Set dxms = dxml.LoadSegment(CommonDialog1.FileName) '将文件名所指向的文件读入段中

If Right$(CommonDialog.FileName, 4) = ".mid" Then

        dxms.SetStandardMidiFile

    End If

End If

等数据段文件被成功的装入后,就可以用下面的代码实现声音的回放和停止操作了。

dxmp.PlaySegmentEx dxms, DMUS_SEGF_DEFAULT, 0 ‘回放

dxmp.StopEx dxms, 0, DMUS_SEGF_DEFAULT ‘停止

在结束程序的时候可一定要记得释放对象!

If Not (dxms Is Nothing) Then dxmp.StopEx dxms, 0, 0

Set dxms = Nothing

Set dxml = Nothing

If Not (dxmp Is Nothing) Then dxmp.CloseDown

Set dxmp = Nothing

下面是一段用VB编写的MIDI播放程序,其中大部分代码在上面都有详细介绍。程序中使用了DirectMusicPerformance8对象的其它一些方法,这部分内容不是重点,在源代码中只作简单的注释,有兴趣的朋友可以查看有关于DirectX SDK的资料。

 

 

 

 

 

程序调试环境:Microsoft Windows 9x/MeDirectX8.0Microsoft VisualBasic 6.0

Common Declarations

Dim dxml As DirectMusicLoader8              '定义DirectMusicLoader对象

Dim dxmp As DirectMusicPerformance8         '定义DirectMusicPerformance对象

Dim dxms As DirectMusicSegment8             '定义DirectMusicSegment对象

Dim audParams As DMUS_AUDIOPARAMS           '定义DMUS_AUDIOPARAMS变量

Dim dx8 As New DirectX8                     '定义DirectX8对象

 

Private Sub Command1_Click()

Command1.Enabled = False                    '设置按钮属性

Command2.Enabled = True

Command3.Enabled = False

dxmp.PlaySegmentEx dxms, DMUS_SEGF_DEFAULT, 0   '播放音乐

End Sub

 

Private Sub Command2_Click()

Command1.Enabled = True                     '设置按钮属性

Command2.Enabled = False

Command3.Enabled = True

dxmp.StopEx dxms, 0, DMUS_SEGF_DEFAULT      '停止播放音乐

End Sub

 

Private Sub Command3_Click()

CommonDialog1.Filter = "*.mid|*.mid|*.wav|*.wav|*.sgt|*.sgt"       '设置打开文件过滤器

CommonDialog1.ShowOpen

If CommonDialog1.FileName <> "" Then

    Me.Caption = CommonDialog1.FileName

    Set dxms = dxml.LoadSegment(CommonDialog1.FileName) '将文件名所指向的文件读入段中

    If Right$(CommonDialog1.FileName, 4) = ".mid" Then     '如果文件为MIDI文件则将段属性设置为

        dxms.SetStandardMidiFile                '标准的MIDI文件

    End If

    Command1.Enabled = True

    Command3.Enabled = False

End If

End Sub

 

Private Sub Form_Load()

Command1.Enabled = False

Command2.Enabled = False

Command3.Enabled = True

Init_Audio                                  '初始化音频

End Sub

 

Private Sub Form_Unload(Cancel As Integer)

Clear_Audio

End Sub

 

Private Sub Slider1_Scroll()

dxmp.SetMasterVolume Slider1.Value          '设置主控音量

End Sub

 

Private Sub Slider2_Scroll()

dxmp.SetMasterTempo Slider2.Value           '设置主控播放速度

End Sub

 

Private Sub Init_Audio()

Set dxmp = dx8.DirectMusicPerformanceCreate             '建立DirectMusicPerformance对象

Set dxml = dx8.DirectMusicLoaderCreate                  '建立DirectMusicLoader对象

                                                        '初始化DirectMusicPerformance对象

dxmp.InitAudio Me.hWnd, DMUS_AUDIOF_ALL, audParams, _

     Nothing, DMUS_APATH_SHARED_STEREOPLUSREVERB, 16

dxmp.SetMasterAutoDownload True

End Sub

 

Private Sub Clear_Audio()

dxmp.RemoveNotificationType DMUS_NOTIFY_ON_SEGMENT

If Not (dxms Is Nothing) Then dxmp.StopEx dxms, 0, 0

Set dxms = Nothing

Set dxml = Nothing

If Not (dxmp Is Nothing) Then dxmp.CloseDown

Set dxmp = Nothing

End Sub

参考文献:Microsoft Developer NetworkMSDN®

Microsoft DirectX8® Software Developing Kit SDK

ARM学习--ARM程序设计

伪指令: 伪操作: 1、符号伪操作: 2、
  • WeiPidong
  • WeiPidong
  • 2014年07月10日 00:26
  • 613

应用程序设计

用心设计您的应用程序 如果您是 iOS 应用程序开发的新手,可能想知道从哪里开始应用程序的开发过程。有了应用程序的初步构思后,您需要将这种想法转换为实现应用程序的行动计划。从设计角度而言,您需要作出...
  • cczk8138
  • cczk8138
  • 2014年07月22日 17:57
  • 244

多线程应用程序设计

多线程应用程序设计 >> 概述 一、使用多线程的理由 1、和进程相比,它是一种“节俭”的多任务方式。    在Linux系统中,启动一个新的进程必须分配独立的地址空间,建立众多的数据库来维护它...
  • LeapEmbedded
  • LeapEmbedded
  • 2013年06月05日 17:57
  • 772

Intel CPU 的多媒体指令集

自Intel Pentium MMX 处理器开始,处理器新增SIMD(SingleInstruction MultipleData)多媒体指令集,可把多个批次性的指令组变成单一指令,以提升数据处理能力...
  • jiji262
  • jiji262
  • 2007年11月13日 11:02
  • 1402

Windows多媒体定时器(精确到1ms) (二)

Windows多媒体定时器(精确到1ms)
  • HK_5788
  • HK_5788
  • 2017年04月15日 21:49
  • 669

HTML5之多媒体标签

audio标签video标签 •音频:不支持时显示 •视频:不支持时显示 •controls属性:属性值与属性名同。可以省略。控制显示默认控制条。 •source标签:用来指定多个音频或视...
  • arvin_top
  • arvin_top
  • 2017年04月22日 19:22
  • 250

C#多媒体定时器使用方法

      C#多媒体定时器使用方法 2012-09-26 10:50 936人阅读 评论(4) 收藏 举报 c#timerobjectdll工具 多媒体定时器下载...
  • hddkman
  • hddkman
  • 2014年08月19日 11:52
  • 173

嵌入式系统多媒体框架分析

嵌入式系统多媒体框架分析 1 Android系统的多媒体框架 Google正式对外发布的Android版本,在Android2.3版本之前,使用的是Opencore多媒体框架,Android2.3...
  • Tiger99111
  • Tiger99111
  • 2014年08月07日 16:02
  • 1582

android 多媒体几个不错的博客

http://blog.csdn.net/gzzaigcnforever/article/details/26849549 http://blog.csdn.net/crazyman2010/arti...
  • WAN8180192
  • WAN8180192
  • 2015年08月06日 16:41
  • 1338

windows编程学习之多媒体时钟

以下是使用多媒体计数器时涉及的函数 (1)DWORD   timeGetTime(void)          返回从Windows启动开始经过的毫秒数 (2)timeSetEvent( UINT...
  • Cry_Alone
  • Cry_Alone
  • 2016年12月07日 20:47
  • 744
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多媒体应用程序设计初步
举报原因:
原因补充:

(最多只允许输入30个字)