社区
硬件/系统
帖子详情
如何用低级音频api播放wav文件 ?
captainwh
2002-11-12 12:27:20
是用waveOutWrite进行wav文件的播放,我不知道取得一个wav文件的数据后如何将音频数据播放出来, 请问WAVEFORMATEX和WAVEHDR结构如何设置?最好给个例子程序。
...全文
285
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
C#利用DirectSound实现PCM
音频
流保存为
WAV
文件
本篇文章将详细探讨如何使用C#和DirectSound库来实现PCM
音频
流的保存,并将其转化为
WAV
格式的
文件
。 首先,我们要理解什么是PCM(Pulse Code Modulation)
音频
。PCM是数字
音频
的一种基本编码方式,它通过采样、量化...
在VB中同时
播放
多个
音频
文件
在VB(Visual Basic)编程环境中,同时
播放
...在VB中,实现多
音频
播放
需要深入理解线程、内存管理、事件驱动编程和
低级
音频
处理。通过这样的系统,开发者可以创建音乐
播放
器、游戏背景音乐或者其他需要同步
音频
的应用。
linux下
wav
格式
音频
播放
小程序
本教程将重点介绍如何在CentOS和RedFlag 6.0环境下编写一个简单的程序来
播放
WAV
格式的
音频
文件
。
WAV
是一种无损
音频
格式,广泛用于存储高质量的声音数据。 首先,我们需要了解Linux系统中的
音频
框架——ALSA...
wav
ex
低级
音频
编程实例教程全
8. **"基于
Wav
eX
低级
音频
函数的实时语音通信.docx"**:这部分内容可能探讨了如何使用
Wav
eX
API
实现实时语音通信,可能涉及到网络传输、同步、编解码等复杂技术。 通过对以上知识点的学习和实践,开发者能够掌握
音频
...
VC++实现
WAV
文件
播放
器
在VC++中,你可以使用`ifstream`类读取
WAV
文件
,并解析这些块以获取必要的信息,然后使用
低级
API
播放
音频
数据。 综上所述,实现一个
WAV
文件
播放
器涉及对Windows
API
的熟悉,以及对
WAV
文件
格式的理解。通过使用`...
硬件/系统
2,643
社区成员
17,229
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章