一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便。

1.      使用mci

#include <windows.h>

#include <stdio.h>

#include <mmsystem.h>

#include <shellapi.h>

#include <AFXCOM_.H>

#pragma comment(lib,"winmm.lib")

void main()

{

char str[128]={0};

int i = 0;

char buf[128]={0};

MCI_OPEN_PARMS mciOpen;

MCIERROR mciError;

mciOpen.lpstrDeviceType = "mpegvideo";

mciOpen.lpstrElementName = "c://1.mp3";

mciError = mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,(DWORD)&mciOpen);

if(mciError)

{

mciGetErrorString(mciError,buf,128);

printf("%s/n",buf);

goto Error;

}

UINT DeviceID = mciOpen.wDeviceID ;

MCI_PLAY_PARMS mciPlay;

mciError = mciSendCommand(DeviceID,MCI_PLAY,0 ,(DWORD)&mciPlay);

if(mciError)

{

printf("send MCI_PLAY command failed/n");

goto Error;

}

//WinExec("sndvol32.exe",SW_SHOWNORMAL);

//这个可以打开音量控制不过可以用编程实现。

while(1)

{

sprintf(str,"播放时间:/t%d",i);

printf("%s/r",str);

i++;

Sleep(1000);

}

Error:

system("pause");

}

2.使用库vfw.h

#include <vfw.h>

#pragma comment(lib,"vfw32.lib")

void CMp3PlayerDlg::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

CString szFilters="MyType Files(*.mp3)|All Files(*.*)|*.*||";

CFileDialog file(TRUE,"mp3","*.mp3",OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,szFilters,this);

if(file.DoModal()==IDOK)

{

CString filename=file.GetFileName();

if(hwnd!=NULL)

{

MCIWndDestroy(hwnd);

}

hwnd=MCIWndCreate(this->m_hWnd,NULL,MCIWNDF_NOPLAYBAR,filename);

::ShowWindow(hwnd,SW_HIDE);

MCIWndSetVolume(hwnd,1000);

MCIWndPlay(hwnd);

}

}

3.使用directshow

#include   <dshow.h>

#pragma comment(lib,"strmiids.lib")

IGraphBuilder*   pGBuilder;

IMediaControl*   pMControl;

IMediaPosition*   pMPos;

IMediaEvent*   pMEvent;

CoInitialize(NULL);   //初始化COM

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder,(void**)&pGBuilder);

pGBuilder->QueryInterface(IID_IMediaControl,(void**)&pMControl);

pGBuilder->QueryInterface(IID_IMediaEvent,(void**)&pMEvent);

pGBuilder->QueryInterface(IID_IMediaPosition,(void**)&pMPos);

CHAR   strSoundPath[MAX_PATH];   //存储音乐所在路径

WCHAR   wstrSoundPath[MAX_PATH];   //存储UNICODE形式的路径

GetCurrentDirectory(MAX_PATH,   strSoundPath);

strcat(strSoundPath,   "//a.mp3");   //假设要播放的是子目录下的a.mp3

//  MultiByteToWideChar(CP_ACP,   0,   strSoundPath,   -1,wstrSoundPath,   MAX_PATH);

mbstowcs(wstrSoundPath, strSoundPath, MAX_PATH);

pGBuilder->RenderFile(wstrSoundPath,   NULL);   //调入文件

//播放MP3文件

//播放MP3的方法十分简单:

pMPos->put_CurrentPosition(0);   //移动到文件头

pMControl->Run();   //播放

CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);

char buf[20];

sprintf(buf,"%f",pos);

pEdit->SetWindowTextA(buf);

// 停止播放和释放对象

//最后,我们要停止播放音乐并释放各个对象:

pMControl->Stop();   //停止播放

pMControl->Release();

pMControl=NULL;

pMEvent->Release();

pMEvent=NULL;

pMPos->Release();

pMPos=NULL;

pGBuilder->Release();

pGBuilder=NULL;

CoUninitialize();   //释放COM

4.使用mci播放MP3

主要变量定义

MCI_OPEN_PARMS mciOpen;

MCIERROR mciError;

MCI_STATUS_PARMS mciStatusParms;

WORD m_wDeviceID;

这里只介绍mciSendCommand命令

1.播放

MCI_PLAY_PARMS mciPlay;

mciOpen.lpstrDeviceType = "mpegvideo";

mciOpen.lpstrElementName =fileName.GetString();

mciError = mciSendCommand(m_wDeviceID,MCI_PLAY,0 ,(DWORD)&mciPlay);

2.暂停

mciSendCommand(mciOpen.wDeviceID,MCI_PAUSE,NULL ,NULL);

3. 停止

mciSendCommand(mciOpen.wDeviceID,MCI_STOP,NULL ,NULL);

mciSendCommand(mciOpen.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START ,NULL);

4.获得播放进度

mciStatusParms.dwItem=MCI_STATUS_POSITION;   mciSendCommand(m_wDeviceID,MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);//关键,取得位置

int m_dPosition=mciStatusParms.dwReturn;

5.获得整个音频的时间长度

UINT DeviceID = mciOpen.wDeviceID ;

mciStatusParms.dwItem=MCI_STATUS_LENGTH; mciSendCommand(DeviceID,MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);//关键,取得长度

m_dLength=mciStatusParms.dwReturn;

6.在指定位置播放

MCI_PLAY_PARMS mciPlay;

mciPlay.dwFrom=m_dPosition;

mciError = mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_FROM,(DWORD)&mciPlay);

7.控制音量

MCI_DGV_SETAUDIO_PARMS mciSetAudioPara;

mciSetAudioPara.dwItem = MCI_DGV_SETAUDIO_VOLUME;

mciSetAudioPara.dwValue = atoi(m_Volume.GetBuffer(m_Volume.GetLength())); //here is the value of the Volume(0--1000)

mciSendCommand(m_wDeviceID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD)(LPVOID)&mciSetAudioPara);

windows播放声音的更多相关文章

  1. windows编程:资源和播放声音

    要播放声音,要附加项:winmm.lib,然后包含头文件:#include <mmsystem.h> 播放声音用PlaySound函数,只能播放midi和wav波形文件. #define ...

  2. MFC使用Windows media player播放声音文件

    一.在需要播放声音的资源上添加控件 资源视图  . 选择添加控件的资源(如对话框).右键单击.插入ActiveX控件.调整你需要的控件属性并记录ID 二.在项目中添加播放声音的类 点击菜单中的项目.添 ...

  3. Windows Phone 8初学者开发—第15部分:在选中ListItem时播放声音

    原文 Windows Phone 8初学者开发—第15部分:在选中ListItem时播放声音 第15部分:在选中ListItem时播放声音 原文地址:  http://channel9.msdn.co ...

  4. 播放声音 (c++) (windows)

    自己看自己看自己看自己看自己看自己看 在<windows.h>中 一:BOOL WINAPI MessageBeep (_in UINT uType ); 播放一个波形文件 (也就是wac ...

  5. Windows Phone 如何在程序中播放提示声音?

    在Windows Phone 中播放提示音可以使用 Microsoft.Xna.Framework.Audio 命名空间下的 SoundEffect 类.具体使用方法如下: 1. 根据声音文件路径创建 ...

  6. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  7. 【WP开发】在手机屏幕点亮时播放声音

    今天说的内容有点流氓,请诸君在开发应用时谨慎使用. 那么,这活儿到底有多流氓呢? 先介绍一下要实现的功能:当用户按电源键(也可以是双击屏幕)点亮手机的屏幕时播放一下短音乐,而且应用程序可以不在前台运行 ...

  8. 如何解决Windows 10系统下设备的声音问题

    如何解决Windows 10系统下设备的声音问题? 请阅读下面的说明来解决Windows 10设备上的声音问题. 1. 检查设备管理器 打开开始菜单,键入设备管理器, 从出现的结果中选择并打开它. 在 ...

  9. 菜鸟学Windows Phone 8开发(1)——创建第一个应用程序

    本系列文章来源MSDN的 面向完全新手的 Windows Phone 8 开发 主要是想通过翻译本系列文章来巩固下基础知识顺带学习下英语和练习下自己的毅力(因为打算每天翻译一篇,但是发现翻译这篇花费了 ...

随机推荐

  1. Java实战之02Hibernate-04多表映射

    十.多表映射 0.内容补充:数据完整性 作用:防止用户的误操作. 实体完整性:主键.用于确定表中唯一的一条记录. 域完整性:表中的字段. 数据类型约束: 非空约束: 唯一约束: 参照完整性: 多表设计 ...

  2. hibernate的dao操作不能提交到数据库问题的解决

    刚学的时候总是各种错误,解决方法也无厘头的很 将UserDAO里面的的save方法修改try { getSession().save(transientInstance); log.debug(&qu ...

  3. [LCA & RMQ] [NOIP2013] 货车运输

    首先看到这题, 由于要最大, 肯定是求最大生成树 那么 o(n2) dfs 求任意点对之间的最小边是可以想到的 但是看看数据范围肯定TLE 于是暴力出来咯, 不过要注意query的时候判断的时候要 m ...

  4. 2015/7/6 (!长期更新!)C语言从零——张呵呵

    随即呈上! By    He_He _S 小组 @成都七中高新OI2015

  5. js方法的命名不能使用表单元素的名称或ID

    今天在写页面的时候,遇到一个关于js方法的命名问题,先看下代码: 表单元素如下: <select name="isCulture" onchange="isCult ...

  6. redis 常用操作命令

    操作相关的命令连接 quit:关闭连接(connection)auth:简单密码认证 持久化 save:将数据同步保存到磁盘bgsave:将数据异步保存到磁盘lastsave:返回上次成功将数据保存到 ...

  7. jQuery 中的防冲突(noConflict)机制

    许多的 JS 框架类库都选择使用 $ 符号作为函数或变量名,jQuery 是其中最为典型的一个.在 jQuery 中,$ 符号只是 window.jQuery 对象的一个引用,因此即使 $ 被删除,w ...

  8. JS 日期格式转换

    //Json 数据年月日 返回 直接传入参数 如/Date(1379433600000)/ function GetDate(date) { if (date == null) return null ...

  9. 如何更改Chrome默认的搜索引擎

    1 打开Chrome浏览器之后,点击窗口右上角的图标,在弹出的菜单中点击设置,如图所示: 2  在打开的窗口中,点击管理搜索引擎,如下图所示: 3 在弹出的窗口中,找到百度的搜索引擎或者bing的搜索 ...

  10. VC++对话框中添加状态栏的方法

    方法一:1.添加成员变量CStatusBarCtrl m_StatusBar;2.在OnInitDialog()中加入:                  m_StatusBar.Create(WS_ ...