使用C++播放声音的完整指南

1. 准备工作:


首先,我们需要选择一个合适的音频库。在C++中,常用的音频库有OpenAL、SDL和SFML等。这里我们选择使用SFML库,因为它易于使用且跨平台性好。

2. 安装SFML库:
在开始之前,请确保已经安装了SFML库。你可以从SFML的官方网站(https://www.sfml-dev.org/)下载并安装适合你的操作系统的版本。

3. 创建C++项目:
在你的C++项目中,包含SFML的头文件,并链接相应的库文件。如果你使用的是集成开发环境(IDE),请按照IDE的指导手册进行设置。如果你使用的是命令行编译,你需要添加相应的编译选项。

2. 播放声音:


下面的代码演示了如何使用SFML库来播放声音文件。

#include <SFML/Audio.hpp>int main()
{sf::SoundBuffer buffer;if (!buffer.loadFromFile("sound.wav")){// 处理加载失败的情况return -1;}sf::Sound sound;sound.setBuffer(buffer);sound.play();// 运行一段时间,让声音播放sf::sleep(sf::seconds(5));return 0;
}

在上面的代码中,我们首先创建了一个`sf::SoundBuffer`对象,并使用`loadFromFile`函数从文件中加载声音。然后,我们创建了一个`sf::Sound`对象,并将加载的声音缓冲设置给它。最后,我们调用`play`函数来播放声音。

5. 播放自己准备好的声音:
如果你想播放自己准备好的声音文件,只需将文件路径替换为你的声音文件的路径即可。确保声音文件位于当前工作目录或者指定了正确的相对路径。

if (!buffer.loadFromFile("path_to_your_sound_file.wav"))
{// 处理加载失败的情况return -1;
}

请注意,在使用SFML库时,支持的音频格式包括.wav、.ogg和.flac等。

3.如何不用第三方库播放声音

可以使用Windows的Multimedia API来播放声音。具体步骤如下:

1.首先需要包含Windows.h头文件和Mmsystem.h头文件。

#include <Windows.h>
#include <Mmsystem.h>

2.定义一个回调函数,在这个函数中填充音频数据。

void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{// 填充音频数据
}

3.使用waveOutOpen函数打开音频设备,并指定回调函数。

WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM;  // 指定PCM格式
wfx.nChannels = 1;                // 单声道
wfx.nSamplesPerSec = 44100;       // 采样率
wfx.wBitsPerSample = 16;          // 量化位数
wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;
wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;HWAVEOUT hwo;
MMRESULT result = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (DWORD_PTR)waveOutProc, NULL, CALLBACK_FUNCTION);

4.使用waveOutWrite函数向音频设备写入数据。

WAVEHDR whdr;
whdr.lpData = // 音频数据指针
whdr.dwBufferLength = // 音频数据长度
whdr.dwFlags = 0;result = waveOutWrite(hwo, &whdr, sizeof(WAVEHDR));

5.使用waveOutReset函数重置音频设备,停止播放。

result = waveOutReset(hwo);

完整的代码示例:

#include <Windows.h>
#include <Mmsystem.h>#pragma comment(lib, "Winmm.lib")void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{// 填充音频数据
}int main()
{WAVEFORMATEX wfx;wfx.wFormatTag = WAVE_FORMAT_PCM;  // 指定PCM格式wfx.nChannels = 1;                // 单声道wfx.nSamplesPerSec = 44100;       // 采样率wfx.wBitsPerSample = 16;          // 量化位数wfx.nBlockAlign = wfx.nChannels * wfx.wBitsPerSample / 8;wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;HWAVEOUT hwo;MMRESULT result = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (DWORD_PTR)waveOutProc, NULL, CALLBACK_FUNCTION);// 填充音频数据const int bufferSize = 44100 * 2;char buffer[bufferSize];// ...WAVEHDR whdr;whdr.lpData = buffer;whdr.dwBufferLength = bufferSize;whdr.dwFlags = 0;result = waveOutWrite(hwo, &whdr, sizeof(WAVEHDR));Sleep(3000);  // 播放3秒result = waveOutReset(hwo);return 0;
}

通过本文的指南,你应该能够轻松地在C++项目中播放声音了。记得合理处理错误和异常情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617209.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库系统概念 第七版 中文答案 第3章 SQL介绍

3.1 将以下查询使用SQL语言编写&#xff0c;使用大学数据库模式。 &#xff08;我们建议您实际在数据库上运行这些查询&#xff0c;使用我们在书籍网站db-book.com上提供的示例数据。有关设置数据库和加载示例数据的说明&#xff0c;请参阅上述网站。&#xff09; a. 查找计算机…

【pwn】cmcc_simplerop --rop链的构造

程序保护情况检查 32位程序&#xff0c;堆栈不可执行 主函数&#xff1a; 左边又是一堆函数&#xff0c;file看一下 发现是静态链接&#xff0c;那ret2libc不用考虑了&#xff0c;接着看一下有没有int 80 那可以考虑利用rop链调用execve函数&#xff0c;用系统调用的函数参数是…

弹性布局(Flex)

目录 1、概述 2、基本概念 3、布局方向 4、布局换行 5、主轴对齐方式 6、交叉轴对齐方式 6.1、容器组件设置交叉轴对齐 6.2、子组件设置交叉轴对齐 7、内容对齐 8、自适应拉伸 9、相关实例 1、概述 弹性布局&#xff08;Flex&#xff09;提供更加有效的方式对容器中…

《GreenPlum系列》GreenPlum初级教程-03GreenPlum系统管理

文章目录 第三章 GreenPlum系统管理1.关于GreenPlum数据库发布版本号2.启动和停止GreenPlum数据库2.1 启动数据库2.2 重启数据库2.3 仅重新载入配置文件更改2.4 停止GreenPlum数据库2.5 停止客户端进程 3.GreenPlum数据库状态查询4.访问GreenPlum数据库4.1 数据库会话参数4.2 支…

C++力扣题目106,105--中序和后序,前序和中序遍历构造二叉树

106.从中序与后序遍历序列构造二叉树 力扣题目链接(opens new window) 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7]后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&am…

Gateway反向代理配置

前言 一般而言&#xff0c;反向代理都是在Nginx中来实现的&#xff0c;其实Gateway也可以作为反向代理服务&#xff0c;不过一般不会这么做&#xff0c;只不过最近的项目&#xff0c;在通过Nginx反向代理之后&#xff0c;iPhone手机访问接口代理地址会异常&#xff0c;安卓手机…

【服务器】服务器管理 - cockpit开启

开启cockpit #!/bin/bashsed -i s/is():where()/is(*):where(*)/ /usr/share/cockpit/static/login.jssystemctl enable --now cockpit.socket #开启cockpit服务systemctl start cockpit.socket 登录 https://ip:9090

MFC 记录字段交换(RFX)学习

MFC ODBC 数据库类可自动移动数据源与记录集对象之间的数据。 从 CRecordset 派生类且不使用批量取行时,数据将通过记录字段交换 (RFX) 机制进行传输。 如果已在派生的 CRecordset 类中实现批量取行,则此框架将使用批量记录字段交换(批量 RFX)机制来传输数据。 RFX 类似于…

jQuery文字洗牌动效

html代码 效果展示 jQuery文本洗牌效果插件 <div class"container"><p class"lead">文本洗牌动画特效</p><h1 id"basic">A time to seek,</h1><h1 id"custom">and a time to lose;</h1> &…

Unity Shader 开发入门3 —— 坐标空间变换

文章目录 一、变换矩阵1.1 齐次坐标1.2 平移矩阵1.3 旋转矩阵1.4 缩放矩阵1.5 复合变换 二、世界空间变换三、观察空间变换四、裁剪空间变换4.1 视椎体4.2 齐次裁剪空间4.3 视椎体投影方式 五、屏幕空间变换 ​ 在 Shader 开发中存在不同的坐标空间&#xff0c;包括&#xff1a…

Open3D 截取感兴趣的点云部分

import time import open3d as o3d; import numpy as np; import matplotlib.pyplot as plt from scipy.signal import find_peaks#坐标 mesh_coord_frame o3d.geometry.TriangleMesh.create_coordinate_frame(size355, origin[0, 0, 0]) #mesh_coord_frame mesh_coord_frame…

云服务器十大服务商——云服务器哪家好用

云服务器哪家便宜&#xff1f;2024最新整理你要的都在这&#xff01;头部云厂商阿里云、腾讯云、华为云、京东云、UCloud等都在降价&#xff0c;阿腾云atengyun.com分享2024年云服务器租用价格给你惊喜&#xff01; 便宜云服务器阿里云腾讯云华为云 2024年便宜云服务器汇总&…

性能测试分析案例-定位服务吞吐量下降

环境准备 预先安装 docker、curl、wrk、perf、FlameGraph 等工具 sudo yum groupinstall Development Tools # 安装火焰图工具 git clone https://github.com/brendangregg/FlameGraph # 安装wrk git clone https://github.com/wg/wrk cd wrk && make && sud…

Oracle导入导出dump

创建目录&#xff1a; create directory *** as /bak; #***名称可以随便命名 需要手工创建/bak,并且此目录oracle用户有读取&#xff0c;目录地址空间要够用。 查看所有目录 select * from DBA_DIRECTORIES;---查询导入导出的目录 导入 impdp ****/**** direc…

【C语言】一.数据的存储(整数浮点数在内存中的存储||大小端||原码反码补码)

0x00. 引言 相比其他的博客&#xff0c;本博客就主打一个简单干练&#xff0c;精华萃取。话不多说&#xff0c;直接开搞 0x01. 整数在内存中的存储 我们先来看一个例子 int a10; long long b20;这里定义了两个变量a和b&#xff0c;从右向左看10赋值给变量a&#xff0c;a的类…

创建了使用说明书之后,怎样才能监测用户的行为和反馈?

在当今数字化的时代&#xff0c;了解用户的行为和反馈对于产品和服务的质量提升至关重要。对于使用说明书而言&#xff0c;仅仅创建出来是远远不够的&#xff0c;还需要持续地监测用户的行为和反馈&#xff0c;以便不断优化和改进。那怎样才能有效地监测用户的行为和反馈呢&…

vue3打包后页面空白解决方法

vue3打包后页面空白解决方法 问题解决方法 问题 最近写一个小项目 没有打包的时候一切正常 技术栈用的vue3 vite 我用的是npm创建的项目 npm init vuelatest问题一 &#xff1a;打包后页面空白&#xff0c;什么都没有 问题二&#xff1a;刷新页面后找不到资源 把url的inde…

最佳解决方案:如何在网络爬虫中解决验证码

Captcha&#xff08;全自动区分计算机和人类的公开图灵测试&#xff09;是广泛应用的安全措施&#xff0c;用于区分合法的人类用户和自动化机器人。它通过呈现复杂的挑战&#xff0c;包括视觉上扭曲的文本、复杂的图像或复杂的拼图等方式&#xff0c;要求用户成功解决这些挑战以…

5、MAE:探索视觉预训练模型

目录 1、论文 2、背景与动机 3、回答的问题 4、创新与卖点 5、实现细节 模型框架 具体步骤 简单代码示例 6、一些资料 1、论文 Masked Autoencoders Are Scalable Vision Learnershttps://arxiv.org/pdf/2111.06377.pdf 2、背景与动机 在深度学习和计算机视觉的领域中…

Centos7,Python3.7.6安装模块Crypto,pycryptodome,ibm_db,requests,requests_pkcs12

Centos7,Python3.7.6安装模块Crypto&#xff0c;pycryptodome&#xff0c;ibm_db&#xff0c;requests,requests_pkcs12 Python版本&#xff1a;python3.7.6 对应的各种模块 前言&#xff1a;把python项目放到linux上运行时&#xff0c;提示缺少各种模块&#xff0c;安装命令…