问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么用c语言打开一个MP3文件(直接给代码),需要什么软件进行输入

发布网友 发布时间:2022-04-25 04:28

我来回答

5个回答

热心网友 时间:2023-10-25 23:20

VC++中播放声音的方法
2009-09-23 14:58
声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。在VC++中可以根据不同的应用要求,用不同的方法实现声音的播放。

一.播放声音文件的简单方法
   在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。 例如播放C:soundmusic.wav可以用sndPlaySound ("c:\sound\music.wav",SND_ASYNC);或PlaySound("c:\sound\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。

二.将声音文件加入到程序中
   在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。
   要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_WAVE1。在播放时只需要调用下面的语句:
   PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),   SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
   其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,
SND_RESOURCE是必须的标志。
   作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:
   1.获得包含资源的模块句柄:
   HMODULE hmod=AfxGetResourceHandle();
   2.检索资源块信息:
   HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
   3. 装载资源数据并加锁:
   HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
   4.播放声音文件:
   sndPlaySound(lpMemSound,SND_MEMORY));
   5.释放资源句柄:
   FreeResource(hGlobalMem);

三.播放声音文件的高级方法
   在VC++中提供了一组对音频设备及多媒体文件直接进行操作的函数。利用这些函数可以灵活地对声音文件进行各种处理。
   首先介绍几个要用到的数据结构。WAVEFORMATEX结构定义了WAVE音频数据文件的格式。WAVEHDR结构定义了波形音频缓冲区。读出的数据首先要填充此缓冲区才能送音频设备播放。WAVEOUTCAPS结构描述了音频设备的性能。MMCKINFO结构包含了RIFF文件中一个块的信息。详细的说明请参考VC++中的帮助。
   下面给出程序流程简图及程序源代码清单,在VC++环境下可直接使用:

源程序清单如下:
LPSTR szFileName;//声音文件名
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubChunk;
DWORD dwFmtSize;
HMMIO m_hmmio;//音频文件句柄
DWORD m_WaveLong;
HPSTR lpData;//音频数据
HANDLE m_hData;
HANDLE m_hFormat;
WAVEFORMATEX * lpFormat;
DWORD m_dwDataOffset;
DWORD m_dwDataSize;
WAVEHDR pWaveOutHdr;
WAVEOUTCAPS pwoc;
HWAVEOUT hWaveOut;
//打开波形文件
if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//File open Error
Error("Failed to open the file.");//错误处理函数
return false;
}
//检查打开文件是否是声音文件
mmckinfoParent.fccType =mmioFOURCC('W','A','V','E');
if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF))
{
//NOT WAVE FILE AND QUIT
}
//寻找 'fmt' 块
mmckinfoSubChunk.ckid =mmioFOURCC('f','m','t',' ');
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can't find 'fmt' chunk
}
//获得 'fmt '块的大小,申请内存
dwFmtSize=mmckinfoSubChunk.cksize ;
m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));
if(!m_hFormat)
{
//failed alloc memory
}
lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);
if(!lpFormat)
{
//failed to lock the memory
}
if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)
{
//failed to read format chunk
}
//离开 fmt 块
mmioAscend(m_hmmio,&mmckinfoSubChunk,0);
//寻找 'data' 块
mmckinfoSubChunk.ckid=mmioFOURCC('d','a','t','a');
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can't find 'data' chunk
}
//获得 'data'块的大小
m_dwDataSize=mmckinfoSubChunk.cksize ;
m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;
if(m_dwDataSize==0L)
{
//no data in the 'data' chunk
}
//为音频数据分配内存
lpData=new char[m_dwDataSize];
if(!lpData)
{
//faile
}
if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0)
{
//Failed to read the data chunk
}
m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);
if(m_WaveLong<0)
{
//Failed to read the data chunk
}
//检查音频设备,返回音频输出设备的性能
if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0)
{
//Unable to allocate or lock memory
}
//检查音频输出设备是否能播放指定的音频文件
if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)
{
//Failed to OPEN the wave out devices
}
//准备待播放的数据
pWaveOutHdr.lpData =(HPSTR)lpData;
pWave

OutHdr.dwBufferLength =m_WaveLong;
pWaveOutHdr.dwFlags =0;
if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to prepare the wave data buffer
}
//播放音频数据文件
if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to write the wave data buffer
}
//关闭音频输出设备,释放内存
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
LocalUnlock(m_hFormat);
LocalFree(m_hFormat);
delete [] lpData;
说明:1)以上使用的音频设备和声音文件操作函数的声明包含在mmsystem.h头文件中,因此在程序中必须用#include "mmsystem.h"语句加入头文件。同时在编译时要加入动态连接导入库winmm.lib,具体实现方法是从Developer Studio的Project菜单中选择Settings,然后在Link选项卡上的Object/Library Moles控制中加入winmm.lib。2)在pWaveOutHdr.lpData中指定不同的数据,可以播放音频数据文件中任意指定位置的声音。3) 以上程序均在VC++6.0中调试通过,在文中省略了对错误及异常情况的处理,在实际应用中必须加入。
四.结论
在VC++中可以根据应用需要采用不同的方法播放声音文件。简单应用可以直接调用声音播放函数。第二种方法可以把声音作为资源加入可执行文件中。如果在播放之前要对声音数据进行处理,可用第三种方法。

参考书目:
1. 美 Paul Perry 陈向群 等译《多媒体开发指南》 清华大学出版社
2. 美 Peter Norton, Rob McGregor 孙凤英 等译《MFC开发Windows95/NT4应用程序》 清华大学出版社 1998
3. 周敬利 《多媒体声卡技术及应用》 电子工业出版社 1998

热心网友 时间:2023-10-25 23:21

可以使用PlaySound()函数播放mp3音频,该函数原型位于windows.h。

PlaySound函数的声明为:
BOOL PlaySound(LPCSTR pszSound, HMODULE hwnd,DWORD fdwSound);
参数pszSound是指定了要播放声音的字符串。
参数hwnd是应用程序的实例句柄,除非pszSound的指向一个资源标识符(即fdwSound被定义为SND_RESOURCE),否则必须设置为NULL。
参数fdwSound是标志的组合,如下表所示。若成功则函数返回TRUE,否则返回FALSE。
使用PlaySound函数时需要在#include<windows.h>后面加上(注意:不能加在前面):

例程:

CFileDialog dlg(TRUE, "mp3", "*.mp3", OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT, "mp3文件(*.mp3)|*.mp3|");
/*创建选择对话框,让用户从文件夹中选取一个MP3文件*/
int iRet = dlg.DoModal();//获得对话框返回值
if(IDOK == iRet) //如果返回值成功,表明成功获取一个MP3文件
{
    CString pathName= dlg.GetPathName();    //得到文件的路径名称
    PlaySound( pathName   , NULL, SND_FILENAME | SND_ASYNC);//用playsound函数播放该文件
}

热心网友 时间:2023-10-25 23:21

fopen()追问求完整代码。

热心网友 时间:2023-10-25 23:22

dos

热心网友 时间:2023-10-25 23:23

不懂楼主的意思。追问就是打开mp3文件的代码,而且是用什么输入。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
说课包括哪些方面 说课内容包括()。 如何在手机百度上删除对话记录? 结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? VC+++++是什么??? 高分悬赏visual c++编程题 git push时,failed to lock是什么意思 vmware workstation12安装失败 failed to install USB inf file 虚拟机创建的系统怎么复制移动啊 VMWare出现Failed to lock the file怎么办 使用VMWare时出现文件未锁定Failed to lock the file如何解决? 中国移动宽带怎么连接电视 是康佳网络电视 是拨号连接 求高手 可别复制黏贴啊 中国移动宽带要连接网络电视需要什么? 刚注册的陌陌号立马就说系统检测设备异常,怎么回事呀 为什么在学信网里查不到学校信息,毕业证不能用? 我的是民办大学(青岛黄海学院)本科毕业证书 学信网上查不到 学校网站也没有查的地方怎么回事_百度问一问 中国和美国的好处与坏处 美国国籍的优势和劣势有哪些? 加入美国国籍有什么好处? 美国国籍有什么实用价值?投资之后我们会有什么样的回报? 中国发展的人来说,得到美国国籍会有什么好处和坏处 孩子美国国籍好吗? 在美国生孩子获得美国国籍有什么好处 孩子美国国籍有几点好处? C++中,创建对象后用该对象调用了两次同一个成员函数,最终结果显示的是... oracle出现ORA-01157错误 如图怎么解决,在线等大虾解决 Failed to lock the logical drive because it was modified by Acronis&nbsp;Disk Director Suite. VMware虚拟机问题VMware Workstation unrecoverable error: (vcpu-0) Failed to lock page for guest RAM DOTA出现failed to lock vertex buffer in CMeshDX8::LockVertexBuffer ORA-01157错误和ORA-01110错误怎么解决啊? 我玩的是半条命2读取不到一半就出现failed to lock index buffer in CMeshDX8::LockIndexBuffer,咋回事? 半条命2第一章老出现failed to lock index buffer in cmeshdx8:lockindexbuffer 暧昧对象不回微信却给朋友圈点赞是什么心理? 不回你消息却给你朋友圈点赞 你们见过给对方发信息对方不回的吗还在朋友圈给别人点赞 女朋友没回你信息点赞别人朋友圈? 人家不回你信息,确给你朋友圈点赞跟评论啥意思呢 不回信息朋友圈点赞,要不要主动发信息 很奇怪的一个人,发信息不回,偶尔给我的朋友圈点赞,本来对他挺有好感的,他这样是不是很讨厌我? 女孩不回我信息却给我朋友圈点赞? 惠蓉保怎么报保险 惠蓉保,主要报销哪些费用 惠蓉保的报销范围? 惠蓉保到时如何报销?