织梦CMS - 轻松建站从此开始!

罗索

C++ 播放音频流(PCM裸流)

jackyhwei 发布于 2014-10-23 18:52 点击:次 
直接上代码,如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了(注意将声道和频率与你自己的文件对应哦)。当然我自己也用VS2008(VS2013好用太多,强烈推荐还是用VS2013,只是它的工程太大,上传起来相当费劲,所以还是用VS2008重写了。
TAG: PCM  

直接上代码,如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了(注意将声道和频率与你自己的文件对应哦)。当然我自己也用VS2008(VS2013好用太多,强烈推荐还是用VS2013,只是它的工程太大,上传起来相当费劲,所以还是用VS2008重写了。。)写了个例子上传了,如果有需要下载地址如下(自己没什么下载分了,所以弄了3分,见谅哈哈)

 
这份代码是打开文件截取一段数据然后播放的,可以轻松的经过加一条线程的方式改成网络传输的形式。
  1. #include "stdafx.h" 
  2. #include <stdio.h> 
  3. #include <windows.h> 
  4. #pragma comment(lib, "winmm.lib") 
  5.   
  6. char buf[1024 * 1024 * 4]; 
  7.   
  8. int _tmain(int argc, _TCHAR* argv[]) { 
  9.     FILE*           thbgm;//文件 
  10.     int             cnt; 
  11.     HWAVEOUT        hwo; 
  12.     WAVEHDR         wh; 
  13.     WAVEFORMATEX    wfx; 
  14.     HANDLE          wait; 
  15.   
  16.     wfx.wFormatTag = WAVE_FORMAT_PCM;//设置波形声音的格式 
  17.     wfx.nChannels = 1;//设置音频文件的通道数量 
  18.     wfx.nSamplesPerSec = 8000;//设置每个声道播放和记录时的样本频率 
  19.     wfx.nAvgBytesPerSec = 16000;
  20. //设置请求的平均数据传输率,单位byte/s。这个值对于创建缓冲大小是很有用的 
  21.     wfx.nBlockAlign = 2;//以字节为单位设置块对齐 
  22.     wfx.wBitsPerSample = 16; 
  23.     wfx.cbSize = 0;//额外信息的大小 
  24.     wait = CreateEvent(NULL, 0, 0, NULL); 
  25.     waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (DWORD_PTR)wait, 0L, CALLBACK_EVENT);
  26. //打开一个给定的波形音频输出装置来进行回放 
  27.     fopen_s(&thbgm, "paomo.pcm""rb"); 
  28.     cnt = fread(buf, sizeof(char), 1024 * 1024 * 4, thbgm);
  29. //读取文件4M的数据到内存来进行播放,通过这个部分的修改,增加线程可变成网络
  30. //音频数据的实时传输。当然如果希望播放完整的音频文件,也是要在这里稍微改一改 
  31.     int dolenght = 0; 
  32.     int playsize = 1024; 
  33.     while (cnt) {
  34. //这一部分需要特别注意的是在循环回来之后不能花太长的时间去做读
  35. //取数据之类的工作,不然在每个循环的间隙会有“哒哒”的噪音 
  36.         wh.lpData = buf + dolenght; 
  37.         wh.dwBufferLength = playsize; 
  38.         wh.dwFlags = 0L; 
  39.         wh.dwLoops = 1L; 
  40.         waveOutPrepareHeader(hwo, &wh, sizeof(WAVEHDR));//准备一个波形数据块用于播放 
  41.         waveOutWrite(hwo, &wh, sizeof(WAVEHDR));//在音频媒体中播放第二个函数wh指定的数据 
  42.         WaitForSingleObject(wait, INFINITE);
  43. //用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时
  44. //挂起,如果在挂起的INFINITE毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回 
  45.         dolenght = dolenght + playsize; 
  46.         cnt = cnt - playsize; 
  47.     } 
  48.     waveOutClose(hwo); 
  49.     fclose(thbgm); 
  50.     return 0; 
 
 
(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201410/17105.html]
本文出处:网络 作者:秩名
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容