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

#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");

}

使用mci播放MP3
主要变量定义

MCI_OPEN_PARMS mciOpen;
MCIERROR mciError;
MCI_STATUS_PARMS mciStatusParms;
WORD m_wDeviceID;

这里只介绍mciSendCommand命令

0.打开设备

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

在打开设备后,就获取了设备的ID,后面的所有操作,都必须要使用这个ID号,即:

UINT DeviceID = mciOpen.wDeviceID ;

1.播放

MCI_PLAY_PARMS mciPlay;
mciOpen.lpstrDeviceType = "mpegvideo";
mciOpen.lpstrElementName =fileName.GetString();
    mciError = mciSendCommand(m_wDeviceID,MCI_PLAY,0 ,(DWORD)&mciPlay);

//这里的 m_wDeviceID 是在 打开设备时,获取的设备ID

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);
时间: 2024-10-06 22:28:01

VC++ 中简单操作MP3音乐的方法,小结的相关文章

[转]vc中调用其他应用程序的方法(函数) winexec,shellexecute ,createprocess

三个SDK函数: WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂.    WinExec 两个参数,前一个指定路径,后一个指定显示方式.    ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等.    Cr

VC++中文件操作(一)---CFileFind,CFileDialog,CFile,CArchive,CStdioFile

各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的.本文将对Visual C++中有关文件操作进行全面的介绍,并对在文件操作中经常遇到的一些疑难问题进行详细的分析. VC++中文件操作(一) ***************************************************************************××××××××××第一.V

VC中获取窗体句柄的各种方法

AfxGetMainWnd AfxGetMainWnd获取自身窗体句柄HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow函数功能:该函数检查与特定父窗体相联的子窗体z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗体的句柄. 函数原型:HWND GetTopWindow(HWND hWnd):參数: hWnd:被查序的父窗体的句柄.假设该參数为NULL,函数返回Z序顶部的窗体句柄.返回值:    假设函数成功,返回值为在Z序顶部的子窗

VC中添加web控件的方法

在VC中使用WebBrowser控件的两方法 黄森堂(vcmfc)著 ClassWizard方式: 1.创建包装类:View->ClassWizard->Add Class->Form a Type Library->C:\winnt\system32\shdocvw.dll->只选择IWebBrowserApp类->OK->OK 2.声明一个类变量:IWebBrowserApp m_internetexplorer;,并包含刚才的头文件(xxx.h) 3.在类的

VC 获取指定文件夹路径的方法小结

VC获取指定文件夹路径 flyfish  2010-3-5 一 使用Shell函数 1 获取应用程序的安装路径 TCHAR buf[_MAX_PATH];SHGetSpecialFolderPath(NULL,buf,CSIDL_PROGRAM_FILES,NULL);AfxMessageBox(buf); 2 获取应用程序数据路径的文件夹 TCHAR bufApplicateData[_MAX_PATH];SHGetSpecialFolderPath(NULL,bufApplicateData

Java8中聚合操作collect、reduce方法详解

Stream的基本概念 Stream和集合的区别: Stream不会自己存储元素.元素储存在底层集合或者根据需要产生.Stream操作符不会改变源对象.相反,它会返回一个持有结果的新的Stream.3.Stream操作可能是延迟执行的,这意味着它们会等到需要结果的时候才执行.Stream操作的基本过程,可以归结为3个部分: 创建一个Stream.在一个或者多个操作中,将指定的Stream转换为另一个Stream的中间操作.通过终止(terminal)方法来产生一个结果.该操作会强制它之前的延时操

窗体皮肤实现 - 在VC中简单实现绘制(五)

到第四部分Delphi XE3的代码能基本完成窗体界面的绘制.窗口中的其他控件的处理方法也是相同的,截获消息处理消息. 问题这个编译出来的个头可不小.Release版本竟然2.43M,完全是个胖子.系统中应该加入了大量基础代码(如泛型之类),用Delphi7编译出来应该能小一截. 使用默认Release的配置方案,没有第三方控件. 翻译到C++进行实验,发现明显这个个头没法比.Debug版本88.5K...---  这货确实小.可惜再小现公司项目也不会考虑用C++开发,有些悲剧. C版本只实现了

C#中简单操作Mysql数据库

以C#访问MySQL数据库,执行简单的CRUD. MySql.Data.dll是C#操作MySQL的驱动文件,是C#连接MySQL必要插件,使C#语言更简洁的操作MySQL数据库.可以用NuGet命令安装 PM>Install-Package MySql.Data -Version 8.0.16 项目中添加该组件的引用,在代码页里输入using MySql.Data.MySqlClient;我们就可以顺利的使用该类库的函数建立连接了. 数据库连接字符串写法为:server=服务器ip地址;Use

C#中简单的写日志的方法

public static void WriteLog(string msg)        {            string appPath = AppDomain.CurrentDomain.BaseDirectory;            string ServerPath = appPath + @"\Log" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; StreamWriter s