• 如果您想对本站表示支持,请随手点击一下广告即可~
  • 本站致力于提供原创、优秀的技术文章~
  • 有任何疑问或建议 均可以在站点右侧栏处 通过各种方式联系站长哦~
  • 在C++中实现声音播放

    C/C++ EXP 129阅读 0评论

    前言

    声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。

    在C++中可以根据不同的应用要求,用不同的方法实现声音的播放。


    播放声音文件的简单方法

    在C++中的多媒体动态连接库中提供了一组与音频设备有关的函数,利用这些函数可以方便地播放声音。

    最简单的播放声音方法就是直接调用C++中提供的声音播放函数:

    其中:

    • lpszSound 是需要播放声音的 .WAV文件 的路径和文件名
    • hmod 在这里为NULL
    • fuSound 是播放声音的标志

    例如播放声音文件 C:\sound\music.wav 可以这样做:


    将声音文件加入到程序中

    在C++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等,同时C++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现 无.WAV文件 的声音播放。

    要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。

    假设生成的声音文件资源标识符为IDR_WAVE1,在播放时只需要调用下面的语句即可:

    其中:

    • MAKEINTRESOURCE()宏 将整数资源标识符转变为字符串
    • AfxGetResourceHandle()函数 返回包含资源的模块句柄
    • SND_RESOURCE 是必须的标志

    这种方式的原理是把资源读入内存后作为内存数据播放,其内部逻辑如下:


    播放声音文件的高级方法

    在C++中提供了一组对音频设备及多媒体文件直接进行操作的函数。利用这些函数可以灵活地对声音文件进行各种处理。

    首先介绍几个要用到的数据结构:

    • WAVEFORMATEX结构: 定义了WAVE音频数据文件的格式
    • WAVEHDR结构: 定义了波形音频缓冲区,读出的数据首先要填充此缓冲区才能送音频设备播放
    • WAVEOUTCAPS结构: 描述了音频设备的性能
    • MMCKINFO结构: 包含了RIFF文件中一个块的信息

    下面给出框架源码,在C++环境下可直接套用:

    注意:

    • 以上使用的音频设备和声音文件操作函数的声明包含在<mmsystem.h>头文件中。
    • 在编译时要加入动态连接导入库winmm.lib,在VC++6.0中的具体实现方法是:在Developer Studio的Project菜单中,选择Settings,然后在Link选项卡上的Object/Library Modules控制中加入winmm.lib。
    • 在pWaveOutHdr.lpData中指定不同的数据,可以播放音频数据文件中任意指定位置的声音。
    • 以上程序在VC++6.0中调试通过,在文中省略了对错误及异常情况的处理,在实际应用中必须加入。

    结论

    在C++中可以根据应用需要采用不同的方法播放声音文件:

    • 简单应用可以直接调用第一种方法的声音播放函数。
    • 若希望隐藏声音文件、或减少最终可执行文件的关联文件数,可使用第二种方法。
    • 如果在播放之前要对声音数据进行处理,可使用第三种方法。

    转载请注明:EXP 技术分享博客 » 在C++中实现声音播放

    喜欢 (0) 分享 (0)
    发表我的评论
    取消评论

    表情

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址