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 ...
随机推荐
- thinkPHP5.0的学习研究【基础】
2017年6月19日13:25:56 基础:1.ThinkPHP5的环境要求如下: PHP >= 5.4.0 PDO PHP Extension MBstring P ...
- c3p0;maven;model;
- 【BZOJ4927】第一题 双指针+DP(容斥?)
[BZOJ4927]第一题 Description 给定n根直的木棍,要从中选出6根木棍,满足:能用这6根木棍拼 出一个正方形.注意木棍不能弯折.问方案数. 正方形:四条边都相等.四个角都是直角的四边 ...
- Notepad++ Tidy2 插件的核心配置
在已有配置的基础上加上这四行: 以免符号被转换成HTML实体了 preserve-entities: yes quote-ampersand: yes quote-marks: no quote-nb ...
- linux c编程:进程控制(四)进程调度
当系统中有多个进程到时候,哪个进程先执行,哪个进程后执行是由进程的优先级决定的.进程的优先级是由nice值决定的.nice值越小,优先级越高.可以看做越友好那么调度优先级越低.进程可以通过nice函数 ...
- IDEA main方法自动补全(转发:http://blog.csdn.net/zjx86320/article/details/52684601)
最近刚从Eclipse转到IDEA,各种学习丫,IDEA里的main方法是不能自动补齐的,肿么办呢? 1.首先,点击File-->Settings-->Editor-->Live T ...
- 第13条:合理利用try/expect/else/finally结构中的每个代码块
核心知识点: (1)无论try块是否发生异常,都可以使用try/finally复合语句中地finally块来执行清理工作. (2)顺利运行try块后,若想使某些操作能在finally块地清理代码之前执 ...
- Sqlserver与Mysql触发器之间的差别
今天练习sqlserver,一开始感觉应该像Oracle,Mysql语法差不多,但是经过一下午的奋战,才感觉原来这三个数据库就是有区别啊, 我原来学习触发器的时候用的是Mysql,感觉还行,但是今天采 ...
- Hadoop如何修改HDFS文件存储块大小
一. 临时修改可以在执行上传文件命令时,显示地指定存储的块大小.1. 查看当前 HDFS文件块大小我这里查看HDFS上的TEST目录下的jdk-7u25-linux-x64.gz 文件存储块大小.1 ...
- 《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点
题目 例如 1-2-3-4 删除2,1-2-3-4-5 删除3 例如 a=1,b =2 java代码 /** * @Description:删除中间节点和a/b处节点 * @Author: lizho ...