社区
硬件/系统
帖子详情
如何用低级音频api播放wav文件 ?
captainwh
2002-11-12 12:27:20
是用waveOutWrite进行wav文件的播放,我不知道取得一个wav文件的数据后如何将音频数据播放出来, 请问WAVEFORMATEX和WAVEHDR结构如何设置?最好给个例子程序。
...全文
220
6
打赏
收藏
如何用低级音频api播放wav文件 ?
是用waveOutWrite进行wav文件的播放,我不知道取得一个wav文件的数据后如何将音频数据播放出来, 请问WAVEFORMATEX和WAVEHDR结构如何设置?最好给个例子程序。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
AthlonxpX86
2003-04-12
打赏
举报
回复
该贴被强行结贴
wj59
2002-11-14
打赏
举报
回复
高
但为什么不用PlaySound?
AthlonxpX86
2002-11-13
打赏
举报
回复
//接上楼
// 确定文件是PCM 格式文件
if (pFormat->wFormatTag != WAVE_FORMAT_PCM)
{
// 波形音频不是PCM格式音频
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}
// 确定波形音频输出设备支持该格式
if (waveOutOpen(&m_hWaveOut, WAVE_MAPPER, pFormat, 0, 0L,
WAVE_FORMAT_QUERY))
{
// 波形音频输出设备不支持该格式
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}
// 从格式子块移出,上升到'RIFF'块
mmioAscend(hmmio, &mmckinfoSubchunk, 0);
// 寻找数据子块
mmckinfoSubchunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
MMIO_FINDCHUNK))
{
// 找不到数据子块
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}
// 取得数据子块大小
dwDataSize = mmckinfoSubchunk.cksize;
if (dwDataSize == 0L)
{
// 取得数据子块大小为0
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}
// 打开波形音频设备
if (waveOutOpen(&m_hWaveOut, WAVE_MAPPER,
pFormat, (UINT)m_hWnd, 0L, CALLBACK_WINDOW))
{
// 打开波形音频设备出错
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}
// 保存块对齐信息,供少后使用
wBlockSize = pFormat->nBlockAlign;
// 格式数据头已使用完毕,释放它
LocalUnlock( hFormat );
LocalFree( hFormat );
// 为波形音频数据分配内存
m_lpData = (HPSTR)GlobalAllocPtr(GMEM_MOVEABLE | GMEM_SHARE,
dwDataSize );
if (!m_lpData)
{
// 分配内存出错
mmioClose(hmmio, 0);
return FALSE;
}
// 读波形音频子块
if(mmioRead(hmmio, m_lpData, dwDataSize) != (LONG) dwDataSize)
{
// 读波形音频子块出错
GlobalFreePtr( m_lpData );
mmioClose(hmmio, 0);
return FALSE;
}
// 文件已使用完毕,关闭它
mmioClose(hmmio, 0);
// 给波形数据头WAVEHDR 分配、锁定全局内存
m_lpWaveHdr = (LPWAVEHDR)GlobalAllocPtr(
GMEM_MOVEABLE | GMEM_SHARE,
(DWORD) sizeof(WAVEHDR));
if (!m_lpWaveHdr)
{
//分配全局内存出错
GlobalFreePtr( m_lpData );
return FALSE;
}
// 设置WAVEHDR结构,并准备其数据
m_lpWaveHdr->lpData = m_lpData;
m_lpWaveHdr->dwBufferLength = dwDataSize;
m_lpWaveHdr->dwFlags = 0L;
m_lpWaveHdr->dwLoops = 0L;
if(waveOutPrepareHeader(m_hWaveOut, m_lpWaveHdr, sizeof(WAVEHDR)))
{
// 准备WAVEHDR结构数据出错
GlobalFreePtr( m_lpWaveHdr );
GlobalFreePtr( m_lpData );
return FALSE;
}
// 将数据块写到波形音频输出设备
dwResult = waveOutWrite(m_hWaveOut, m_lpWaveHdr, sizeof(WAVEHDR));
if (dwResult != 0)
{
// 往波形音频输出设备写数据块出错
CleanUp();
return FALSE;
}
return TRUE;
}
AthlonxpX86
2002-11-13
打赏
举报
回复
BOOL CWavePlayerDlg::PlayWaveFile(LPSTR lpszFileName)
{
HMMIO hmmio;
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubchunk;
DWORD dwFmtSize;
DWORD dwResult;
HANDLE hFormat;
WAVEFORMATEX * pFormat;
DWORD dwDataSize;
WORD wBlockSize;
HANDLE hData = NULL;
// 查询系统是否安装有波形音频输出设备
if (waveOutGetNumDevs() == 0)
{
// 系统没有波形音频输出设备
return FALSE;
}
// 打开文件,使用缓冲区输入/输出
if(!(hmmio = mmioOpen(lpszFileName, NULL,
MMIO_READ | MMIO_ALLOCBUF)))
{
// 打开文件出错
return FALSE;
}
// 查找形式类型为'WAVE'的'RIFF'块,以确定文件是WAVE文件
mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioDescend(hmmio, &mmckinfoParent, NULL, MMIO_FINDRIFF))
{
// 文件不是WAVE文件
mmioClose(hmmio, 0);
return FALSE;
}
// 查找格式块('fmt '块),它应是'RIFF'块的子块
mmckinfoSubchunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hmmio, &mmckinfoSubchunk, &mmckinfoParent,
MMIO_FINDCHUNK))
{
// 找不到'fmt '块
mmioClose(hmmio, 0);
return FALSE;
}
// 获取格式块的大小,并格式块分配、锁定内存
dwFmtSize = mmckinfoSubchunk.cksize;
hFormat = LocalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));
if (!hFormat)
{
// 分配内存出错
mmioClose(hmmio, 0);
return FALSE;
}
pFormat = (WAVEFORMATEX *) LocalLock(hFormat);
if (!pFormat)
{
// 锁定内存出错
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}
// 读格式块
if (mmioRead(hmmio, (HPSTR) pFormat, dwFmtSize)
!= (LONG) dwFmtSize)
{
// 读格式块出错
LocalUnlock( hFormat );
LocalFree( hFormat );
mmioClose(hmmio, 0);
return FALSE;
}
//续
NowCan
2002-11-13
打赏
举报
回复
http://vip.6to23.com/NowCan1/progtech.htm
看看多媒体那一页。
NowCan
2002-11-13
打赏
举报
回复
太复杂了。参考一下。
http://vip.6to23.com/NowCan1/code/wave.zip
fmod:围绕高性能,跨平台FMOD底层声音库的Ruby包装器。 您将获得FMOD库的所有好处,但是可以采用面向对象的Ruby方式!
超强大的FMOD
低级
API
的功能齐全且完整的Ruby包装器。 使用内置的Fiddle库(Ruby 2.0+)消除不必要的外部gem依赖关系,所需的只是本机FMOD平台特定的本机FMOD库。 支持多种
音频
格式,包括:
音频
交换
文件
格式(....
zang:Zig(镜像)的
音频
合成
臧用 0.7.0 编写的
音频
库。 该库提供了将
音频
(生成器和效果)“绘制”到缓冲区中的功能。 (缓冲区如何发送到
音频
设备超出了库的范围,但可以在提供的示例中看到。) 图书馆非常
低级
。 没有动态分配,
API
处于汇编...
录音
播放
系统(实现pcm转码mp3,
wav
)
本文介绍了基于
wav
eX
低级
音频
API
采集
音频
,然后
播放
的技术,也支持实时的
播放
。对于将录音和
播放
分开的做法原因是为了保存pcm
文件
(未经压缩过的
音频
文件
), 然后转码
wav
和mp3格式。 PCM(Pulse code modulation):...
Windows PCM
音频
捕获与
播放
实现
但如果想编写一个功能较强大的
音频
处理程序,那就必须使用
低级
音频
函数和多媒体
文件
I/O来控制
音频
设备的输入和输出。因为
低级
音频
函数可直接与
音频
驱动程序交互,通过窗口消息或回调(CALL BACK)函数来管理
音频
数据...
波形
音频
(
WAV
E)底层接口的学习与使用
但如果想编写一个功能较强大的
音频
处理程序,那就必须使用
低级
音频
函数和多媒体
文件
I/O来控制
音频
设备的输入和输出。因为
低级
音频
函数可直接与
音频
驱动程序交互,通过窗口消息或回调(CALLBACK)函数来管理
音频
数据...
硬件/系统
2,640
社区成员
17,239
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章