vc中播放mp3文件的方法小结
一般播放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文件的方法小结的更多相关文章
- 在VC中创建DLL文件的方法步骤
一.Win32动态链接库 1.制作的步骤: (1)新建WIN32 Dynamic-link Library工程,工程名为MyDll,选择A simple DLL project类型. (2)MyDll ...
- 读取SD卡文件夹下的MP3文件和播放MP3文件
首先获取SD卡path路径下的所有的MP3文件,并将文件名和文件大小存入List数组(此代码定义在FileUtils类中): /** * 读取目录中的Mp3文件的名字和大小 */ public Lis ...
- VC中调用COM组件的方法(转载)
原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...
- 在C语言控制台程序中播放MP3音乐
游戏没有声音多单调. 这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,先看看代码吧: // 编译该范例前,请把 background.mp3 放在项目文件夹中 // ...
- vc中调用Com组件的方法详解
vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGet ...
- 在Centos中导入sql文件的方法
在Centos中导入sql文件的方法 利用mysql -u root -p进入mysql数据库 对于文件的导入,在Centos下里面的是首先要新建一个和文件相同名字的数据库.例如:mysql>c ...
- python实现在目录中查找指定文件的方法
python实现在目录中查找指定文件的方法 本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from ...
- php中读取大文件实现方法详解
php中读取大文件实现方法详解 来源: 时间:2013-09-05 19:27:01 阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...
- VC++ 中简单操作MP3音乐的方法,小结
#include <windows.h> #include <stdio.h> #include <mmsystem.h> #include <shellap ...
随机推荐
- 卸载系统自带libevent
rpm -qa|grep libevent yum remove libevent* 或 rpm -e --nodeps --allmatches libevent*
- Python中使用__new__实现单例模式并解析
阅读文章前请先阅读 Python中类方法.__new__方法和__init__方法解析 单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定 ...
- POJ 1113 Wall【凸包周长】
题目: http://poj.org/problem?id=1113 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- zoj 2362 Beloved Sons【二分匹配】
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2361 来源:http://acm.hust.edu.cn/vjudg ...
- [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld
首先这篇文章比较长,若想了解Xcode7的免开发者帐号真机调试运行IOS程序的话,直接转到第五部分. 转载请注明原文地址:http://www.cnblogs.com/litou/p/4843772. ...
- TensorFlow_action
安装TensorFlow 包依赖 C:\Users\sas> pip3 install --upgrade tensorflow Collecting tensorflow Downloadi ...
- centos修改mysql密码或者进入mysql后解决Access denied for user ''@'localhost' to database 'mysql错误
原因是MySQL的密码有问题 用mysql匿名用户可以进入数据库,但是看不见mysql数据库. 解决办法:具体操作步骤:关闭mysql:# service mysqld stop然后:# mysqld ...
- 我的Android进阶之旅------>关于调用Webservice查询火车票时刻表的几个接口介绍
今天发现一个可以提供火车票时刻表查询的WebService,先记录下来以后如果写一个火车票时刻表查询的Android App的话就用的着.首先该WebService的的名字是TrainTimeWebS ...
- Js遍历对象中的属性
var obj = {"name": "xiaol","age":"18"} for(var attr in obj){ ...
- linux c编程:标准IO库
前面介绍对文件进行操作的时候,使用的是open,read,write函数.这一章将要介绍基于流的文件操作方法:fopen,fread,fwrite.这两种方式的区别是什么呢.1种是缓冲文件系统,一种是 ...