当前位置: 首页 > news >正文

VC++播放音频文件和音频数据的方法

在程序中,很有可能会涉及到播放一些音频文件(比如:.wav文件)和音频数据,这个问题怎么解决呢?VC++中想要播放一个音频文件(.wav)是很容易的,只要调用WIndows API函数PlaySound()就可以了,但是,如果您想播放自己在程序中产生的一段音频数据,就不是那么简单了,需要利用WIndows wave I/O API的几个函数来实现。

下面结合实例来说明(完整实例可在我的CSDN资源中下载,该例子利用WIndows wave I/O API 函数,实现了播放自定义的一段音频数据(通过sin()函数产生);并且使用了PlaySound()函数播放“250.wav”文件):

 

[cpp] view plain copy print ?
  1. //需包含的头文件 
  2. #include <MMSystem.h> 
  3. #pragma comment(lib,"winmm.lib") 
  4. //PlaySound()函数和其他WIndows wave I/O API 函数的使用 
  5. #include "math.h"//sin()函数的使用 

//需包含的头文件 #include <MMSystem.h> #pragma comment(lib,"winmm.lib") //PlaySound()函数和其他WIndows wave I/O API 函数的使用 #include "math.h"//sin()函数的使用

 

1.播放文件:

[cpp] view plain copy print ?
  1. CString path; 
  2. path.Format("%s250.wav",g_BasePath); 
  3. //g_BasePath的取值不用多说,前面已详细介绍了。 
  4. PlaySound(_T(path),0,SND_FILENAME|SND_ASYNC); 

CString path; path.Format("%s250.wav",g_BasePath); //g_BasePath的取值不用多说,前面已详细介绍了。 PlaySound(_T(path),0,SND_FILENAME|SND_ASYNC);

2.播放数据:

(1)确定音频数据的格式及内容:

 

[cpp] view plain copy print ?
  1. int rate=1000;  //刺激率 
  2. int sampleRate = 44100;  //采样率 
  3. constint NUMPTS = (int) (44100 * 0.5);   // 0.5s 
  4. shortint waveOut[NUMPTS];//音频数据 
  5.  
  6. //内容 
  7. for (int i=0;i<NUMPTS;i++) 
  8.     waveOut[i] = (shortint)ceil(sin(2*3.1415926*rate*i/sampleRate)*20000); 
  9. //格式 
  10. WAVEFORMATEX pFormat; 
  11. pFormat.wFormatTag=WAVE_FORMAT_PCM;  
  12. //simple,uncompressed format 
  13. pFormat.nChannels=1;//1=mono, 2=stereo 
  14. pFormat.nSamplesPerSec=sampleRate; // 44100 
  15. pFormat.nAvgBytesPerSec=sampleRate*2; 
  16. // = nSamplesPerSec * n.Channels * wBitsPerSample/8 
  17. pFormat.nBlockAlign=2; // = n.Channels * wBitsPerSample/8 
  18. pFormat.wBitsPerSample=16; 
  19. //16 for high quality, 8 for telephone-grade 
  20. pFormat.cbSize=0; 

int rate=1000; //刺激率 int sampleRate = 44100; //采样率 const int NUMPTS = (int) (44100 * 0.5); // 0.5s short int waveOut[NUMPTS];//音频数据 //内容 for (int i=0;i<NUMPTS;i++) { waveOut[i] = (short int)ceil(sin(2*3.1415926*rate*i/sampleRate)*20000); } //格式 WAVEFORMATEX pFormat; pFormat.wFormatTag=WAVE_FORMAT_PCM; //simple,uncompressed format pFormat.nChannels=1;//1=mono, 2=stereo pFormat.nSamplesPerSec=sampleRate; // 44100 pFormat.nAvgBytesPerSec=sampleRate*2; // = nSamplesPerSec * n.Channels * wBitsPerSample/8 pFormat.nBlockAlign=2; // = n.Channels * wBitsPerSample/8 pFormat.wBitsPerSample=16; //16 for high quality, 8 for telephone-grade pFormat.cbSize=0; (2)打开一个给定的波形音频输出装置:

 

 

[cpp] view plain copy print ?
  1. HWAVEOUT     hWaveOut; 
  2. WAVEHDR      WaveOutHdr; 
  3. MMRESULT result; 
  4. result = waveOutOpen(&hWaveOut, WAVE_MAPPER,&pFormat,0L, 0L, WAVE_FORMAT_DIRECT); 
  5. if (result) 
  6.     MessageBox(_T("Failed to open waveform output device.")); 
  7.     return

HWAVEOUT hWaveOut; WAVEHDR WaveOutHdr; MMRESULT result; result = waveOutOpen(&hWaveOut, WAVE_MAPPER,&pFormat,0L, 0L, WAVE_FORMAT_DIRECT); if (result) { MessageBox(_T("Failed to open waveform output device.")); return; }(3)准备波形数据块:

 

 

[cpp] view plain copy print ?
  1. WaveOutHdr.lpData = (LPSTR)waveOut; 
  2. WaveOutHdr.dwBufferLength = NUMPTS*2; 
  3. WaveOutHdr.dwBytesRecorded=0; 
  4. WaveOutHdr.dwUser = 0L; 
  5. WaveOutHdr.dwFlags = 0L; 
  6. WaveOutHdr.dwLoops = 0L; 
  7. waveOutPrepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)); 

WaveOutHdr.lpData = (LPSTR)waveOut; WaveOutHdr.dwBufferLength = NUMPTS*2; WaveOutHdr.dwBytesRecorded=0; WaveOutHdr.dwUser = 0L; WaveOutHdr.dwFlags = 0L; WaveOutHdr.dwLoops = 0L; waveOutPrepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)); (4)向给定音频媒体中输出波形数据块:

 

 

[cpp] view plain copy print ?
  1. result = waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)); 
  2. if (result) 
  3.     MessageBox(_T("Failed to play sound")); 
  4.     return

result = waveOutWrite(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR)); if (result) { MessageBox(_T("Failed to play sound")); return; }(5)清除准备:

 

 

[cpp] view plain copy print ?
  1. // Wait until finished sound play 
  2. do {} while (waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR))==WAVERR_STILLPLAYING); 

// Wait until finished sound play do {} while (waveOutUnprepareHeader(hWaveOut, &WaveOutHdr, sizeof(WAVEHDR))==WAVERR_STILLPLAYING); (6)关闭给定音频媒体:

 

 

[cpp] view plain copy print ?
  1. waveOutClose(hWaveOut); 

转载于:https://www.cnblogs.com/lzhitian/archive/2012/02/11/2346290.html

相关文章:

  • ubuntu ftp服务器配置(转)
  • shell算数运算
  • 集线器、路由器、交换机、第三层交换技术
  • Slideshow ad
  • 13.6.1 新添加一个界面(Adding One Interface)
  • asp.net 机试题1
  • 第二节 1面向对像简介
  • basic4android 开发教程翻译(八)使用ListView
  • 虚拟机安装Linux怎么使桌面铺满虚拟机
  • xml.exist() 实例演示
  • CentOS 5.5 使用 EPEL 和 RPMForge 软件库
  • IMSI 小记
  • 1.7亿次接力 百度知道成雷锋精神新载体
  • 知识管理(KM) 企业文化的最好“沉淀”
  • cacti监控squid
  • angular2 简述
  • avalon2.2的VM生成过程
  • css的样式优先级
  • Java 多线程编程之:notify 和 wait 用法
  • Laravel 菜鸟晋级之路
  • Redis的resp协议
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 区块链分支循环
  • 双管齐下,VMware的容器新战略
  • 通过npm或yarn自动生成vue组件
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 06-01 点餐小程序前台界面搭建
  • ​Java并发新构件之Exchanger
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #HarmonyOS:Web组件的使用
  • #图像处理
  • (6)添加vue-cookie
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (过滤器)Filter和(监听器)listener
  • (六)激光线扫描-三维重建
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)程序员疫苗:代码注入
  • (转)树状数组
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .net开发引用程序集提示没有强名称的解决办法
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • // an array of int
  • ::before和::after 常见的用法
  • [ C++ ] STL---仿函数与priority_queue
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C++进阶篇]STL中vector的使用
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]