一般播放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);

vc中播放mp3文件的方法小结的更多相关文章

  1. 在VC中创建DLL文件的方法步骤

    一.Win32动态链接库 1.制作的步骤: (1)新建WIN32 Dynamic-link Library工程,工程名为MyDll,选择A simple DLL project类型. (2)MyDll ...

  2. 读取SD卡文件夹下的MP3文件和播放MP3文件

    首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...

  3. VC中调用COM组件的方法(转载)

    原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...

  4. 在C语言控制台程序中播放MP3音乐

    游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...

  5. vc中调用Com组件的方法详解

    vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGet ...

  6. 在Centos中导入sql文件的方法

    在Centos中导入sql文件的方法 利用mysql -u root -p进入mysql数据库 对于文件的导入,在Centos下里面的是首先要新建一个和文件相同名字的数据库.例如:mysql>c ...

  7. python实现在目录中查找指定文件的方法

    python实现在目录中查找指定文件的方法 本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from ...

  8. php中读取大文件实现方法详解

    php中读取大文件实现方法详解 来源:   时间:2013-09-05 19:27:01   阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...

  9. VC++ 中简单操作MP3音乐的方法,小结

    #include <windows.h> #include <stdio.h> #include <mmsystem.h> #include <shellap ...

随机推荐

  1. 由浅到深理解ROS(4)

    消息和消息类型 节点能相互传递消息,节点之间通信也是基于消息.消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容.也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪 ...

  2. 素数定理 nefu 117

    素数定理: 随着x的增长,P(x) ≍x/ln(x) ,P(x)表示(1,x)内的素数的个数. 这个定理,说明在1-x中,当x大到一定程度时,素数分布的概率为ln(x) 竟然还有一道题目. 素数个数的 ...

  3. Vue学习-基础语法

    Vue v-if指令 Vue.js的指令是以v-开头的,它们作用于HTML元素,指令提供了一些特殊的特性,将指令绑定在元素上时,指令会为绑定的目标元素添加一些特殊的行为,我们可以将指令看作特殊的HTM ...

  4. SDOI2017第一轮

    本蒟蒻表示终于$AC$了$SDOI2017\text{第一轮}$! 兴奋! 附上各个题的题解: $DAT1$: $T1$: BZOJ4816: [Sdoi2017]数字表格 $T2$: BZOJ481 ...

  5. git克隆远程分支

    $ git branch –r 查看远程branch信息 $ git checkout origin/dev检出远程分支 $ git branch -a 查看所有分支,包括本地和远程 可以使用chec ...

  6. 500 Lines or Less: A Template Engine(模板引擎)

    介绍: 多数项目都是包含很多的逻辑处理,只有少部分的文字文本处理.编程语言非常擅长这类项目.但是有一些项目只包含了少量的逻辑处理,大量的文本数据处理.对于这些任务,我们期望有一个工具能够很好的处理这些 ...

  7. Javaweb基础--->监听器listener(转发)

    JavaWeb中的监听器 1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 Servl ...

  8. Iptalbes练习题(二)

    接着上节,上节课,基本功能设置后,现在我们telnet本机一下,发现问题: [root@test1 ~]# telnet Trying 127.0.0.1... telnet: connect to ...

  9. 详谈 MySQL Online DDL

    作为一名DBA,对数据库进行DDL操作非常多,如添加索引,添加字段等等.对于MySQL数据库,DDL支持的并不是很好,一不留心就导致了全表被锁,经常搞得刚入门小伙伴很郁闷又无辜,不是说MySQL支持O ...

  10. 【Flask】query可用参数

    ### query可用参数:1. 模型对象.指定查找这个模型中所有的对象.2. 模型中的属性.可以指定只查找某个模型的其中几个属性.3. 聚合函数. * func.count:统计行的数量. * fu ...