windows环境下音频文件播放

最近一个小项目要用到音乐播放模块,于是翻了一下资料,发现windows环境下播放音频文件有MCI、DirectShow等几种方式,当然也可以使用底层的api WaveOut播放。其中第一种方式最为简单,程序仅需通过发送MCI命令即可控制媒体设备,实现音频文件播放、暂停、停止等操作。其他两种方式就比较繁琐了,首先搭建DirectShow开发环境就比较周折,而使用WaveOut播放音频,需要先解码音频以获取pcm数据,然后才能播放。对于不涉及音频数据处理、仅需播放音频的简单使用场景,推荐使用MCI方式播放音频文件。MCI的用法思路可以概括为:先获取设备id,然后再向该设备发送各种媒体控制命令,以实现媒体播放操作。下面为本人简单封装的MCI使用接口,头、源文件分别如下所示:

#ifndef _MUSIC_PLAYING_MANAGER_H
#define _MUSIC_PLAYING_MANAGER_H

#include <MMSystem.h>
#pragma comment(lib, "winmm.lib")

#define RESULT_ERROR -999

class MusicPlayingManager
{
public:
	MusicPlayingManager(DWORD dwCallback);
	~MusicPlayingManager(void);

private:
	DWORD m_dwCallback;
	MCIDEVICEID m_mciDeviceId;
	WCHAR m_szFileName[MAX_PATH];

public:
	// 打开音乐文件
	void OpenMusicFile();
	// 播放/暂停/停止音乐
	void PlayMusic();
	void PauseMusic();
	void StopMusic();

	// 关闭音频设备
	void CloseDevice();
};

#endif
#include "StdAfx.h"
#include "MusicPlayingManager.h"

MusicPlayingManager::MusicPlayingManager(DWORD dwCallback)
{
	m_mciDeviceId = RESULT_ERROR;
	m_dwCallback = dwCallback;
}

MusicPlayingManager::~MusicPlayingManager(void)
{
	CloseDevice();
}

// 关闭设备
void MusicPlayingManager::CloseDevice()
{
	if (m_mciDeviceId != RESULT_ERROR)
	{
		mciSendCommand(m_mciDeviceId, MCI_CLOSE, NULL, NULL);
		m_mciDeviceId = RESULT_ERROR;
	}
}

// 打开音乐文件
void MusicPlayingManager::OpenMusicFile()
{
	// 选择待播放的文件
	CFileDialog dlg(
		TRUE, NULL, NULL,
		OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
		L"音乐(*.mp3) | *.mp3||",
		NULL);
	dlg.m_ofn.lpstrTitle = L"请选择歌曲文件";

	if (dlg.DoModal() == IDOK)
	{
		CString srcFileName = dlg.GetPathName();
		wcscpy_s(m_szFileName, srcFileName.GetBuffer(srcFileName.GetLength()));
		srcFileName.ReleaseBuffer();
	}

	// 先关闭设备
	CloseDevice();

	// 再打开设备
	MCIERROR mciERR = ERROR_SUCCESS;
	MCI_OPEN_PARMS mciParams;
	ZeroMemory(&mciParams, sizeof(mciParams));

	mciParams.lpstrDeviceType = NULL;
	mciParams.lpstrElementName = m_szFileName;
	mciParams.dwCallback = m_dwCallback;
	mciERR = mciSendCommand(NULL, MCI_OPEN, MCI_NOTIFY | MCI_OPEN_ELEMENT, (DWORD_PTR)&mciParams);

	if (mciERR == ERROR_SUCCESS)
	{
		m_mciDeviceId = mciParams.wDeviceID;

		MCI_SET_PARMS mciParams;
		ZeroMemory(&mciParams, sizeof(mciParams));
		mciParams.dwCallback = m_dwCallback;
		mciParams.dwTimeFormat = MCI_FORMAT_MILLISECONDS;
		mciSendCommand(m_mciDeviceId, MCI_SET, MCI_NOTIFY | MCI_SET_TIME_FORMAT, (DWORD_PTR)&mciParams);
	}
	else
	{
		m_mciDeviceId = RESULT_ERROR;
		AfxMessageBox(L"设备打开失败");
	}
}

// 播放音乐
void MusicPlayingManager::PlayMusic()
{
	if (m_mciDeviceId != RESULT_ERROR)
	{
		MCI_PLAY_PARMS mciParams;
		ZeroMemory(&mciParams, sizeof(mciParams));

		mciParams.dwCallback = m_dwCallback;
		mciSendCommand(m_mciDeviceId, MCI_PLAY, MCI_NOTIFY, (DWORD_PTR)&mciParams);
	}
}

// 暂停音乐
void MusicPlayingManager::PauseMusic()
{
	if (m_mciDeviceId != RESULT_ERROR)
	{
		MCI_GENERIC_PARMS mciParams;
		ZeroMemory(&mciParams, sizeof(mciParams));

		mciParams.dwCallback = m_dwCallback;
		mciSendCommand(m_mciDeviceId, MCI_PAUSE, MCI_NOTIFY, (DWORD_PTR)&mciParams);
	}
}

// 停止音乐
void MusicPlayingManager::StopMusic()
{
	if (m_mciDeviceId != RESULT_ERROR)
	{
		MCI_GENERIC_PARMS mciParams;
		ZeroMemory(&mciParams, sizeof(mciParams));

		mciParams.dwCallback = m_dwCallback;
		mciSendCommand(m_mciDeviceId, MCI_STOP, MCI_NOTIFY, (DWORD_PTR)&mciParams);
		mciSendCommand(m_mciDeviceId, MCI_SEEK, MCI_SEEK_TO_START, (DWORD_PTR)&mciParams);
	}
}

用法很简单,如下所示:

// 打开文件
void CTestMusicPlayingDlg::OnBnClickedButtonOpenMusic()
{
	m_pMusicPlayingMgr->OpenMusicFile();
	m_pMusicPlayingMgr->PlayMusic();
}

// 播放音乐
void CTestMusicPlayingDlg::OnBnClickedButtonPlayMusic()
{
	m_pMusicPlayingMgr->PlayMusic();
}

// 暂停音乐
void CTestMusicPlayingDlg::OnBnClickedButtonPauseMusic()
{
	m_pMusicPlayingMgr->PauseMusic();
}

// 停止音乐
void CTestMusicPlayingDlg::OnBnClickedButtonStopMusic()
{
	m_pMusicPlayingMgr->StopMusic();
}

完整工程下载链接:http://download.csdn.net/detail/u013085897/7770721

windows环境下音频文件播放

时间: 2024-12-14 16:53:22

windows环境下音频文件播放的相关文章

Windows环境下用C#编程将文件上传至阿里云OSS笔记

本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/ex_net/article/details/24962567 作者:张建波 邮箱: [email protected]  欢迎来信交流! 第1步: 下载阿里云OSS的SDK包,由于笔者的环境是PHP服务,所以下载的是PHP的SDK包 http://help.aliyun.com/view/13438816.html 第2步:将代码整合进你的网站或服务中. 第3步:配置OSS访问接口 (1)找到c

windows环境下备份与恢复,与文件拷贝

mySQL数据库在windows环境下备份与恢复 解压版需进入数据库安装目录.安装版可以忽略本步骤: 1.先在运行中输入CMD,启动命令行2.进入Mysql的Bin目录:E:\Program Files\MySQL\MySQL Server 5.0\bin 进入目录常见方式实例:在命令行输入 E:在命令行输入 CD "E:\Program Files\MySQL\MySQL Server 5.0\bin" 一,数据库备份 第一种:(cmd窗口使用)在命令提示符用mysqldump命令行

《高可用MySQL》1 – Windows环境下压缩版MySQL安装

近日在读O'REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容. Master-Slave这东西吧.在很多公司都是标配.开发中基本天天都用.遇到的问题自然也不少(如主从不同步,Master宕机).但操作权限很有限.有些东西,仅仅有自己看了.做了,才干真正知道原理是什么,也才干更好的去把握. 本文是高可用MySQL的第一篇读书笔记,主要记录Windows环境下压缩版MySQL(基于安装版的傻瓜式安装过程这里不再提及)的安装过程. 1. 从

python MySQLdb在windows环境下的快速安装、问题解决方式

使用Python访问MySQL,需要一系列安装 Linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装 http://blog.csdn.net/wklken/article/details/7271019 ------------------------------------------------------------- 以下是windows环境下的: 1.      安装数据库mysql 下载地址:http://www.mysql.com/downloa

Windows环境下Android Studio v1.0安装教程

Windows环境下Android Studio v1.0安装教程 Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包. 要求:JDK 7以及以上版本. Android Studio安装文件. Windows: exe(包含SDK) (813 MB) exe(不包含SDK) (250 MB) zip (235 MB) Mac dmg (234 MB) zip (233 MB) Linux: zip (233 MB) 说明: 32位系统和64位系统是同一个安

[转]Windows环境下尝试安装并配置PHP PEAR备忘

转自:http://wangye.org/blog/archives/266/ 什么是PEAR 来自百度百科:PEAR 是PHP扩展与应用库(the PHP Extension and Application Repository)的缩写.它是一个PHP扩展及应用的一个代码仓库,简单地说,PEAR之于PHP就像是CPAN(Comprehensive Perl Archive Network)之于Perl. 由此可见PEAR是PHP代码的仓库,在这里可以找到很多有用的代码,避免我们重复写一些功能,

Windows环境下搭建Redis

当网站从数据库加载大量数据的时候会遇到页面响应速度特别缓慢的情形,为了能够更快的从数据库中取得数据加载至内存中,可以考虑使用Memcached来做数据缓存,或者使用内存数据库(比如Redis)将数据库的内容加载至内存中以键值对的形式存储,当页面请求数据的时候可以直接从内存数据库中获取,从而提高了网站的响应速度. Redis在官方文档中声明推荐在Linux环境下安装部署,但实际情况下会有很多开发者需要在Windows环境下解决以上类似的问题并想要采取Redis方案来解决问题,好在微软开放了这方面的

【转】Windows环境下Android Studio v1.0安装教程

原文网址:http://ask.android-studio.org/?/article/9 http://android-studio.org/index.php/docs/experience/158-androidstudio-v1-0-win-install Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包.要求:JDK 7以及以上版本. Android Studio安装文件. Windows:exe(包含SDK) (813 MB)exe(不包含

《高可用MySQL》读书笔记1 – Windows环境下压缩版MySQL安装

近日在读O'REILIY系列的<高可用MySQL>, 自然少不了主从(Master-Slave)配置和横向扩展相关的内容.Master-Slave这东西吧,在许多公司都是标配,开发中基本天天都用,遇到的问题自然也不少(如主从不同步,Master宕机),但操作权限非常有限.有些东西,只有自己看了.做了,才能真正知道原理是什么,也才能更好的去把握. 本文是高可用MySQL的第一篇读书笔记,主要记录Windows环境下压缩版MySQL(基于安装版的傻瓜式安装过程这里不再提及)的安装过程. 1. 从官