社区
VC.NET
帖子详情
如何在console的程序中播放一个保存在数组中的pcm音频样点?谢谢
bingbingsxy
2005-12-01 01:17:49
使用waveOutOpen函数好象必须是窗口程序才能用,在console程序下有没有办法可以播pcm样点,谢谢
...全文
74
2
打赏
收藏
如何在console的程序中播放一个保存在数组中的pcm音频样点?谢谢
使用waveOutOpen函数好象必须是窗口程序才能用,在console程序下有没有办法可以播pcm样点,谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bingbingsxy
2005-12-03
打赏
举报
回复
#include <stdio.h>
#include <windows.h>
#include <math.h>
#include <process.h>
#define SAMPLE_RATE 22050
#define OUT_BUFFER_SIZE 430000
static HWAVEOUT hWaveOut ;
static PBYTE pBuffer1;
static PWAVEHDR pWaveHdr1;
static WAVEFORMATEX waveformat ;
void sound_start (void * pv)
{
FILE * pcmfile = (FILE *) pv;
fread(pBuffer1, 1, OUT_BUFFER_SIZE, pcmfile);
waveOutWrite(hWaveOut, pWaveHdr1, sizeof(WAVEHDR));
}
void main ()
{
pWaveHdr1 = (PWAVEHDR) malloc(sizeof(WAVEHDR)) ;
pBuffer1 = (PBYTE) malloc(OUT_BUFFER_SIZE) ;
FILE * pcm = fopen("test.pcm", "rb");
if (NULL == pcm)
return;
if (!pWaveHdr1 || !pBuffer1)
{
if (!pWaveHdr1) free(pWaveHdr1) ;
if (!pBuffer1) free(pBuffer1) ;
return;
}
waveformat.wFormatTag = WAVE_FORMAT_PCM ;
waveformat.nChannels = 2 ;
waveformat.nSamplesPerSec = SAMPLE_RATE ;
waveformat.nAvgBytesPerSec = 88200;
waveformat.nBlockAlign = 4 ;
waveformat.wBitsPerSample = 16 ;
waveformat.cbSize = 0 ;
if (waveOutOpen(&hWaveOut, WAVE_MAPPER, &waveformat, (DWORD)0, 0, CALLBACK_NULL)
!= MMSYSERR_NOERROR)
{
free(pWaveHdr1) ;
free(pBuffer1) ;
hWaveOut = NULL ;
return;
}
pWaveHdr1->lpData = (char *) pBuffer1 ;
pWaveHdr1->dwBufferLength = OUT_BUFFER_SIZE ;
pWaveHdr1->dwBytesRecorded = 0 ;
pWaveHdr1->dwUser = 0 ;
pWaveHdr1->dwFlags = 0 ;
pWaveHdr1->dwLoops = 1 ;
pWaveHdr1->lpNext = NULL ;
pWaveHdr1->reserved = 0 ;
waveOutPrepareHeader (hWaveOut, pWaveHdr1,
sizeof (WAVEHDR)) ;
unsigned int id;
HANDLE h = (HANDLE) _beginthreadex(NULL, 20000, (unsigned (__stdcall *)(void *)) sound_start,
(void *) pcm, 0, &id);
WaitForSingleObject(h, INFINITE);
/*
fread(pBuffer1, 1, OUT_BUFFER_SIZE, pcm);
int i = 0;
while (i < 2)
{
waveOutWrite(hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;
//i++;
}
*/
waveOutClose(hWaveOut);
free (pWaveHdr1) ;
free (pBuffer1) ;
}
上面是我写的一个测试程序,就是从一个pcm的文件中读取数据,然后waveOutWrite将它播出来,原来我是将播放写在主函数里,可以看到已经被我注释掉了的.
我发现个很奇怪的现象,就是我运行该程序,听不到pcm中的音乐,但是我在waveOutWrite那个函数处加上一个断点,结果当单步调试时却能够发出声音来.我将循环里那个i++注释掉后,变成了一个死循环,这样运行该程序就会有音乐听到了.
我以为是要用多线程才行,但当我把程序改成多线程后,还是听不到音乐,而在单步调试中却能听到.
哪位大侠能教我在console程序中使用waveOutWrite放音乐,不胜感激,谢谢了!
bingbingliangliang
2005-12-02
打赏
举报
回复
用api函数:
HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpVerb,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
试试
PCM
音频
实时
播放
:
音频
字节数组(16/8位)转为
PCM
ArrayBuffer流
PCM
音频
实时
播放
:
音频
字节数组(16/8位)转为
PCM
ArrayBuffer流
onFrameRecord 获取实时
pcm
音频
流,实现
音频
播放
和上传
onFrameRecord 获取实时
pcm
音频
流,实现
音频
播放
和上传(vue3)
最简单的视
音频
播放
示例8:DirectSound
播放
PCM
本文记录DirectSound
播放
音频
的技术。DirectSound是Windows下最常见的
音频
播放
技术。目前大部分的
音频
播放
应用都是通过DirectSound来
播放
的。本文记录
一个
使用DirectSound
播放
PCM
的例子。注:一位仁兄已经提醒我DirectSound已经计划被XAudio2取代了。后来考证了一下发现确有此事。因此在下次更新
中
考虑加入XAudio2
播放
PCM
的例子。本文仍然记录
Java Mp3转化WAV/
PCM
音频
数据,解码详细解析,提取每一帧数据集合/比特流/
播放
,一行代码!
Mp3转纯
PCM
音频
,解码过程详细解说,因为Java本身只支持,wav,缺少mp3的解码器,所以Java自带的无法对mp3进行处理,这种MPEG-*
音频
有损压缩标准编码,更不要说使用Java的
音频
格式和
音频
流就可以解决...
Vue
中
使用Web Audio API进行录音,并生成可供百度语音api使用的
pcm
音频
文件
本文背景是需要通过浏览器进行录音,生成可供百度语音识别api使用的
pcm
音频
文件,根据百度语音识别api文档要求,
音频
文件为
pcm
格式,单音道,16k采样率,16位深。本文仅就以上功能做最基本的实现。 Web Audio API基础简介 1.三个基本概念
音频
源,也就是
音频
输入,可以是直接从设备输入的
音频
,也可以是远程获取的
音频
文件。 处理节点,分析器和处理器,比如音调节点,音量节点,声音处理节点...
VC.NET
7,540
社区成员
27,673
社区内容
发帖
与我相关
我的任务
VC.NET
.NET技术 VC.NET
复制链接
扫一扫
分享
社区描述
.NET技术 VC.NET
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章