作者:Wong Shao Voon

如果你需要的只是在你的应用程序中播放MP3(例如,在应用程序启动画面播放很短的MP3),对于这样简单的需求,可以使用C++ MP3/WMA DirectShow播放MP3封装类。源代码来自Flipcode Alan Kemp的贡献。源代码需要一些调整,包含必要的头文件和导入库,这样它才可以在Visual Studio 2010中编译。由于该类依赖DirectShow,你需要下载Windows SDK来构建它。如果您正在使用Visual Studio 2010,它本身就带有Windows SDK,包含了DirectShow库的一个子集,所以你不用下载任何东西就可以编译它。在加载MP3文件前你必须调用COM的CoInitialize来初始化COM,在应用程序结束前你还需要调用CoUninitialize来清理。头文件mp3.h列在下面。

图1:cppmp3player

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

// Windows Header Files:

#include

#include

#include

#include

#pragma comment(lib, "strmiids.lib")

class Mp3

{

public:

Mp3();

~Mp3();

bool Load(LPCWSTR filename);

void Cleanup();

bool Play();

bool Pause();

bool Stop();

// Poll this function with msTimeout = 0, so that it return immediately.

// If the mp3 finished playing, WaitForCompletion will return true;

bool WaitForCompletion(long msTimeout, long* EvCode);

// -10000 is lowest volume and 0 is highest volume, positive value > 0 will fail

bool SetVolume(long vol);

// -10000 is lowest volume and 0 is highest volume

long GetVolume();

// Returns the duration in 1/10 millionth of a second,

// meaning 10,000,000 == 1 second

// You have to divide the result by 10,000,000

// to get the duration in seconds.

__int64 GetDuration();

// Returns the current playing position

// in 1/10 millionth of a second,

// meaning 10,000,000 == 1 second

// You have to divide the result by 10,000,000

// to get the duration in seconds.

__int64 GetCurrentPosition();

// Seek to position with pCurrent and pStop

// bAbsolutePositioning specifies absolute or relative positioning.

// If pCurrent and pStop have the same value, the player will seek to the position

// and stop playing. Note: Even if pCurrent and pStop have the same value,

// avoid putting the same pointer into both of them, meaning put different

// pointers with the same dereferenced value.

bool SetPositions(__int64* pCurrent, __int64* pStop, bool bAbsolutePositioning);

private:

IGraphBuilder * pigb;

IMediaControl * pimc;

IMediaEventEx * pimex;

IBasicAudio * piba;

IMediaSeeking * pims;

bool ready;

// Duration of the MP3.

__int64 duration;

};

原始版本只有播放,暂停和停止功能。在调用Pause暂停后,你必须调用Play来恢复播放。因为我需要循环播放音乐,所以我需要知道什么时候我的MP3已经结束,所以我加入了一个方法,用WaitForCompletion来定期轮询演奏是否结束,并再次重播。原始的代码中总以最大音量播放,我也添加了一个方法,GetVolume得到音量,SetVolume设置音量。注:-10000是最小音量,0是最大音量。如果设置的音量大于0,你会得到一个错误。这两个方法返回是以1千万分之一秒为单位(1/10000000秒),我没有按秒为单位返回,因为秒的时间实在是太长了。

#include "Mp3.h"

#include

Mp3::Mp3()

{

pigb = NULL;

pimc = NULL;

pimex = NULL;

piba = NULL;

pims = NULL;

ready = false;

duration = 0;

}

Mp3::~Mp3()

{

Cleanup();

}

void Mp3::Cleanup()

{

if (pimc)

pimc->Stop();

if(pigb)

{

pigb->Release();

pigb = NULL;

}

if(pimc)

{

pimc->Release();

pimc = NULL;

}

if(pimex)

{

pimex->Release();

pimex = NULL;

}

if(piba)

{

piba->Release();

piba = NULL;

}

if(pims)

{

pims->Release();

pims = NULL;

}

ready = false;

}

bool Mp3::Load(LPCWSTR szFile)

{

Cleanup();

ready = false;

if (SUCCEEDED(CoCreateInstance( CLSID_FilterGraph,

NULL,

CLSCTX_INPROC_SERVER,

IID_IGraphBuilder,

(void **)&this->pigb)))

{

pigb->QueryInterface(IID_IMediaControl, (void **)&pimc);

pigb->QueryInterface(IID_IMediaEventEx, (void **)&pimex);

pigb->QueryInterface(IID_IBasicAudio, (void**)&piba);

pigb->QueryInterface(IID_IMediaSeeking, (void**)&pims);

HRESULT hr = pigb->RenderFile(szFile, NULL);

if (SUCCEEDED(hr))

{

ready = true;

if(pims)

{

pims->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME);

pims->GetDuration(&duration); // returns 10,000,000 for a second.

duration = duration;

}

}

}

return ready;

}

bool Mp3::Play()

{

if (ready&&pimc)

{

HRESULT hr = pimc->Run();

return SUCCEEDED(hr);

}

return false;

}

bool Mp3::Pause()

{

if (ready&&pimc)

{

HRESULT hr = pimc->Pause();

return SUCCEEDED(hr);

}

return false;

}

bool Mp3::Stop()

{

if (ready&&pimc)

{

HRESULT hr = pimc->Stop();

return SUCCEEDED(hr);

}

return false;

}

bool Mp3::WaitForCompletion(long msTimeout, long* EvCode)

{

if (ready&&pimex)

{

HRESULT hr = pimex->WaitForCompletion(msTimeout, EvCode);

return *EvCode > 0;

}

return false;

}

bool Mp3::SetVolume(long vol)

{

if (ready&&piba)

{

HRESULT hr = piba->put_Volume(vol);

return SUCCEEDED(hr);

}

return false;

}

long Mp3::GetVolume()

{

if (ready&&piba)

{

long vol = -1;

HRESULT hr = piba->get_Volume(&vol);

if(SUCCEEDED(hr))

return vol;

}

return -1;

}

__int64 Mp3::GetDuration()

{

return duration;

}

__int64 Mp3::GetCurrentPosition()

{

if (ready&&pims)

{

__int64 curpos = -1;

HRESULT hr = pims->GetCurrentPosition(&curpos);

if(SUCCEEDED(hr))

return curpos;

}

return -1;

}

bool Mp3::SetPositions(__int64* pCurrent, __int64* pStop, bool bAbsolutePositioning)

{

if (ready&&pims)

{

DWORD flags = 0;

if(bAbsolutePositioning)

flags = AM_SEEKING_AbsolutePositioning | AM_SEEKING_SeekToKeyFrame;

else

flags = AM_SEEKING_RelativePositioning | AM_SEEKING_SeekToKeyFrame;

HRESULT hr = pims->SetPositions(pCurrent, flags, pStop, flags);

if(SUCCEEDED(hr))

return true;

}

return false;

}

源代码包含一个静态库项目和DLL项目以及一个DEMO项目,PlayMp3,包含一个有用类的MP3播放器,CLibMP3DLL,运行时加载LibMP3DLL.dll。CLibMP3DLL的使用方法类似于Mp3类,用LoadDLL和UnloadDLL来加载/释放动态库。以下是CLibMP3DLL的头文件。

class CLibMP3DLL

{

public:

CLibMP3DLL(void);

~CLibMP3DLL(void);

bool LoadDLL(LPCWSTR dll);

void UnloadDLL();

bool Load(LPCWSTR filename);

bool Cleanup();

bool Play();

bool Pause();

bool Stop();

bool WaitForCompletion(long msTimeout, long* EvCode);

bool SetVolume(long vol);

long GetVolume();

__int64 GetDuration();

__int64 GetCurrentPosition();

bool SetPositions(__int64* pCurrent, __int64* pStop, bool bAbsolutePositioning);

private:

HMODULE m_Mod;

};

我往这个MP3类添加许多方法,花了相当多的努力并让他们正确运行,我希望其他程序员可以通过这些代码方便地播放MP3文件。

php怎么控制mp3播放器,简单的C++ MP3播放器类相关推荐

  1. vhdl八路抢答器简单程序_贵州抢答器plc程序编程图-云南尼邦商贸

    贵州抢答器plc程序编程图 应答设备装有使用嵌入式ppt设计的软件的新升级版本,该软件可以支持导入各种格式的问题库(文本文档,单词).问题将在几秒钟内导入.导入的问题以ppt模式直接显示,并且可以直接 ...

  2. WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)

    刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...

  3. android简单歌词,《Android_MP3播放器(初学简单版_歌名、歌手、歌词同步显示)》.doc...

    Android_MP3播放器(初学简单版) --乐拐 这是我学习Android以来的第二个程序--MP3播放器(简单版),我的第一个程序是比较实用的通讯录(文档地址是:/view/d013f64fc8 ...

  4. 使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)

    使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件) 使用beep播放mp3文件(10num) 使用go语言GUI库fyne实现音乐播放器 要是想使用go语言实现播放mp3需要借助be ...

  5. jquery:使用 SoundManager 2 创建简单的网页音频播放器

    官网:http://www.schillmania.com/projects/soundmanager2/ HTML5 标准中加入了两个非常强大的标签 audio 和 video ,让我们在网页中嵌入 ...

  6. 用vue简单写一个音乐播放器

    简单地写一个功能比较全的音乐播放器 前言 因为音乐播放器是一个很可能在项目遇到的东西,早写总比晚写好.趁没事先写个. 思路 一个音乐播放器该有的东西: 封面,歌名,专辑,作者 控制器(上一首,下一首, ...

  7. 实现简单的自定义音乐播放器

    这篇博客只是记录自己写的js插件,着重点在于js,而不是css或者html.所以在js方面会比较详细,而其他的就只是简单提提. 刚学前端js那会,只是应付式的把书看完了,demo也没写几个.碰巧这学期 ...

  8. 简单的多屏播放器示例(vlc+qt)

    介绍 简单的多屏播放器 最多同时播放16个视频 支持本地文件和rtsp.rtmp等流媒体播放 VS2015工程,依赖Qt+VLC 练手作品 截图 下载 程序:download.csdn.net/det ...

  9. 最简单的基于FFMPEG+SDL的音频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...

最新文章

  1. Linux常用基本命令:三剑客命令之-awk输入输出分隔符
  2. java程序能转变为javafx_如何将intellij中的普通Java项目转换为JavaFx项目
  3. 为什么放弃治疗_百度百科
  4. Go 语言的%d,%p,%v等占位符的使用
  5. idea package自动生成_懒人必备,IntelliJ IDEA中代码一键生成
  6. 简单聊下5G与V2X
  7. c++虚函数和虚函数表
  8. Spring.Net学习笔记(3)-创建对象
  9. 安装SQL Server 2012 RTM遇到 Microsoft NET Framework 4 0 install
  10. c盘满了怎么办?如何快速清理内存(6个方法)
  11. 微信公众号吸粉8大策略,实战运营指南
  12. 火柴棍能组成的最大数字
  13. Python技能树及 CSDN MarkDown编辑器测评
  14. tm1650中文资料_TM1650+msp430单片机 调试及遇到问题的总结
  15. 一年级的孩子可以学习机器人编程
  16. BUAA 439 孟竹屌丝玩儿游戏
  17. 第4课 从键盘读入变量的值及保留小数位问题
  18. 3-6岁经典绘本分级大推荐,给孩子先收藏起来
  19. (附源码)python电影院购票系统 毕业设计221133
  20. 分类评价指标、目标检测评价指标(AUC,IOU,mAP等)

热门文章

  1. 熄灯问题POJ1222的一些思考
  2. VirtualBox 6.0.10
  3. 通过Node.js解析stl文件
  4. 简单的购物卡管理系统 可开源
  5. 5G MEC场景下移动终端IP地址固定方法研究
  6. cesium 指南针、比例尺
  7. quartz原理 java_Quartz原理解密
  8. 浅谈共线性的产生以及解决方法(上篇——前世)
  9. Win10无法升级Win11体验版解决方法
  10. Java银联卡支付小系统