php怎么控制mp3播放器,简单的C++ MP3播放器类
作者: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播放器类相关推荐
- vhdl八路抢答器简单程序_贵州抢答器plc程序编程图-云南尼邦商贸
贵州抢答器plc程序编程图 应答设备装有使用嵌入式ppt设计的软件的新升级版本,该软件可以支持导入各种格式的问题库(文本文档,单词).问题将在几秒钟内导入.导入的问题以ppt模式直接显示,并且可以直接 ...
- WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)
刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...
- android简单歌词,《Android_MP3播放器(初学简单版_歌名、歌手、歌词同步显示)》.doc...
Android_MP3播放器(初学简单版) --乐拐 这是我学习Android以来的第二个程序--MP3播放器(简单版),我的第一个程序是比较实用的通讯录(文档地址是:/view/d013f64fc8 ...
- 使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件)
使用go语言GUI库实现对mp3文件的播放1(简单的播放mp3文件) 使用beep播放mp3文件(10num) 使用go语言GUI库fyne实现音乐播放器 要是想使用go语言实现播放mp3需要借助be ...
- jquery:使用 SoundManager 2 创建简单的网页音频播放器
官网:http://www.schillmania.com/projects/soundmanager2/ HTML5 标准中加入了两个非常强大的标签 audio 和 video ,让我们在网页中嵌入 ...
- 用vue简单写一个音乐播放器
简单地写一个功能比较全的音乐播放器 前言 因为音乐播放器是一个很可能在项目遇到的东西,早写总比晚写好.趁没事先写个. 思路 一个音乐播放器该有的东西: 封面,歌名,专辑,作者 控制器(上一首,下一首, ...
- 实现简单的自定义音乐播放器
这篇博客只是记录自己写的js插件,着重点在于js,而不是css或者html.所以在js方面会比较详细,而其他的就只是简单提提. 刚学前端js那会,只是应付式的把书看完了,demo也没写几个.碰巧这学期 ...
- 简单的多屏播放器示例(vlc+qt)
介绍 简单的多屏播放器 最多同时播放16个视频 支持本地文件和rtsp.rtmp等流媒体播放 VS2015工程,依赖Qt+VLC 练手作品 截图 下载 程序:download.csdn.net/det ...
- 最简单的基于FFMPEG+SDL的音频播放器:拆分-解码器和播放器
===================================================== 最简单的基于FFmpeg的音频播放器系列文章列表: <最简单的基于FFMPEG+SDL ...
最新文章
- Linux常用基本命令:三剑客命令之-awk输入输出分隔符
- java程序能转变为javafx_如何将intellij中的普通Java项目转换为JavaFx项目
- 为什么放弃治疗_百度百科
- Go 语言的%d,%p,%v等占位符的使用
- idea package自动生成_懒人必备,IntelliJ IDEA中代码一键生成
- 简单聊下5G与V2X
- c++虚函数和虚函数表
- Spring.Net学习笔记(3)-创建对象
- 安装SQL Server 2012 RTM遇到 Microsoft NET Framework 4 0 install
- c盘满了怎么办?如何快速清理内存(6个方法)
- 微信公众号吸粉8大策略,实战运营指南
- 火柴棍能组成的最大数字
- Python技能树及 CSDN MarkDown编辑器测评
- tm1650中文资料_TM1650+msp430单片机 调试及遇到问题的总结
- 一年级的孩子可以学习机器人编程
- BUAA 439 孟竹屌丝玩儿游戏
- 第4课 从键盘读入变量的值及保留小数位问题
- 3-6岁经典绘本分级大推荐,给孩子先收藏起来
- (附源码)python电影院购票系统 毕业设计221133
- 分类评价指标、目标检测评价指标(AUC,IOU,mAP等)