社区
硬件/系统
帖子详情
如何用低级音频api播放wav文件 ?
captainwh
2002-11-12 12:27:20
是用waveOutWrite进行wav文件的播放,我不知道取得一个wav文件的数据后如何将音频数据播放出来, 请问WAVEFORMATEX和WAVEHDR结构如何设置?最好给个例子程序。
...全文
250
6
打赏
收藏
如何用低级音频api播放wav文件 ?
是用waveOutWrite进行wav文件的播放,我不知道取得一个wav文件的数据后如何将音频数据播放出来, 请问WAVEFORMATEX和WAVEHDR结构如何设置?最好给个例子程序。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
文件
,进行
播放
。
在VB中同时
播放
多个
音频
文件
在VB中同时
播放
多个
音频
文件
本来 vb6
linux下
wav
格式
音频
播放
小程序
在Centos和RedFlag6.0下实现
播放
wav
格式的
音频
文件
,仔细看代码,你需要自己修改一些参数,来
播放
其他的
音频
文件
,因为我很懒,你自己修改源代码让它更好吧。
wav
ex
低级
音频
编程实例教程全
Wav
eX
低级
音频
录音 放音 实例 附源代码 另还有
wav
e
文件
格式,图片,清晰易懂 网上转载的几个经典教材。
VC++实现
WAV
文件
播放
器
基于VC++实现
WAV
文件
播放
器,供编程人员使用
硬件/系统
2,644
社区成员
17,232
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章