DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  4737 随笔 :: 2 文章 :: 542 评论 :: 1615万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

posted on   DoubleLi  阅读(574)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2015-05-23 H264中的SPS、PPS提取与作用
2015-05-23 SxsTrace工具使用方法
2015-05-23 移植strace调试工具到arm平台
2015-05-23 掌握 Linux 调试技术
2015-05-23 Linux on Power 上的调试工具和技术
2015-05-23 使用 Strace 和 GDB 调试工具的乐趣
2015-05-23 自助Linux之问题诊断工具strace
点击右上角即可分享
微信分享提示