1. 程式人生 > >mciSendCommand對本地音樂的播放

mciSendCommand對本地音樂的播放

下面給出我對它進行的一個簡單的封裝,呼叫時只需要定義一個CPlayer的物件,然後呼叫Open()函式即可播放。

程式碼如下:

//Player.h
#pragma once
#include<windows.h>
#include<mmsystem.h>
#include<string>
#pragma comment(lib,"winmm.lib")
//命令參見:http://www.360doc.com/content/12/0904/09/10660072_234175177.shtml
typedef struct _MP3INFO //MP3資訊的結構
{
	char Identify[3]; //TAG三個字母
					  //這裡可以用來鑑別是不是檔案資訊內容
	char Title[31];   //歌曲名,30個位元組
	char Artist[31];  //歌手名,30個位元組
	char Album[31];   //所屬唱片,30個位元組
	char Year[5];	  //年,4個位元組
	char Comment[29]; //註釋,28個位元組
	unsigned char reserved;  //保留位,	1個位元組
	unsigned char reserved2; //保留位,1個位元組
	unsigned char reserved3; //保留位,1個位元組
} MP3INFO;
class CPlay
{
public:
	CPlay();
	CPlay(const std::string&);
	~CPlay();
	
	//對於播放新的歌曲則需要制定路徑,若是暫停後需要恢復播放,則不需要新增引數
	void Play( std::string  f="");
	void Pause();
	void Close();
	int GetLength();//輸出音樂總長,以ms為單位
	int GetCurrentPlayPos();//輸出當前音樂播放位置
	void Go(int); //快進or快退,int代表跳轉的間隔時間
	void SetFile(std::string);
	void SetHwnd(HWND);
	bool GetInfo(const std::string &path, MP3INFO& mp3info);
	//bool GetCurrentMusicInfo(MP3INFO& mp3info);
	void StartRecord();
	void EndRecord();
private:
	void Open();
	MCI_PLAY_PARMS playParms; //播放命令訊息引數
	MCI_OPEN_PARMS openParms; //開啟命令訊息引數
	MCI_STATUS_PARMS statusParms; //狀態命令訊息引數
	MCI_SEEK_PARMS seekParms; // 定位命令訊息引數
	MCI_RECORD_PARMS  recordParms; //錄音命令訊息引數
	MCI_SAVE_PARMS   saveParms; //儲存命令訊息引數
	MCI_GENERIC_PARMS genericParms;
	MCIDEVICEID wDeviceID; //裝置ID,系統用ID來標識不同的裝置,以保證命令發給正確的物件。

	HWND hWnd; //視窗控制代碼
	std::string filePath; //檔案位置



};
#include"Player.h"
#include<algorithm>
using namespace std;

CPlay::CPlay() {}
CPlay::~CPlay() {}
CPlay::CPlay(const std::string &path) :filePath(path) { }
void CPlay::Open()
{
	Close();
	openParms.dwCallback = (DWORD)hWnd;
//	openParms.lpstrDeviceType = "avivideo";
	openParms.lpstrElementName = filePath.c_str();
	mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&openParms);
}
void CPlay::Play(  std::string  f)
{
	if (f != "")
	{
		filePath = f;
		Open();
	}
	mciSendCommand(wDeviceID, MCI_STOP, MCI_NOTIFY, (DWORD)(LPVOID)&playParms);
	wDeviceID = openParms.wDeviceID;
	mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&playParms);
}
void CPlay::Pause()
{
	mciSendCommand(wDeviceID, MCI_PAUSE, MCI_NOTIFY, (DWORD)(LPVOID)&playParms);
}
void CPlay::Close()
{
	mciSendCommand(wDeviceID, MCI_CLOSE, NULL, NULL);
}
int CPlay::GetLength()
{
	statusParms.dwItem = MCI_STATUS_LENGTH;
	DWORD dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,
		MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParms);
	int nTime = statusParms.dwReturn;
	return nTime;
}
int CPlay::GetCurrentPlayPos()
{
	statusParms.dwItem = MCI_STATUS_POSITION;
	DWORD dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,
		MCI_STATUS_ITEM, (DWORD)(LPVOID)&statusParms);
	int nTime = statusParms.dwReturn;
	return nTime;
}

void CPlay::Go(int t)//跳轉,t為跳轉的時間,如 5 則前進5s,-5則後退5s
{
	//先獲得當前播放位置
	int Time = GetCurrentPlayPos();
	//再調整時間
	seekParms.dwTo = Time + t*1000;
	DWORD dwReturn = mciSendCommand(wDeviceID, MCI_SEEK, MCI_WAIT | MCI_NOTIFY | MCI_TO, (DWORD)(LPVOID)&seekParms);
	mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID)&playParms);
}
void CPlay::SetFile(string file)
{
	filePath = file;
	Open();
}
void CPlay::SetHwnd(HWND hwnd)
{
	hWnd = hwnd;
}
bool CPlay::GetInfo(const std::string &path, MP3INFO& mp3info)
{
	if (path.empty())
		return false;
	FILE * fp;
	unsigned char mp3tag[128] = { 0 };

	fp = fopen(path.c_str(), "rb");
	if (NULL == fp)
	{
		//	QMessageBox::information(this, "提示", "開啟檔案失敗");
		return false;
	}
	fseek(fp, -128, SEEK_END);
	fread(&mp3tag, 1, 128, fp);
	if (!((mp3tag[0] == 'T' || mp3tag[0] == 't')
		&& (mp3tag[1] == 'A' || mp3tag[1] == 'a')
		&& (mp3tag[2] == 'G' || mp3tag[0] == 'g')))
	{
		printf("mp3 file is error!!");
		fclose(fp);
		//QMessageBox::information(this, "提示", "解析當前檔案失敗");
		return false;
	}
	//獲取Mp3資訊
	memcpy((void *)mp3info.Identify, mp3tag, 3); //獲得tag
	memcpy((void *)mp3info.Title, mp3tag + 3, 30); //獲得歌名
	memcpy((void *)mp3info.Artist, mp3tag + 33, 30); //獲得作者
	memcpy((void *)mp3info.Album, mp3tag + 63, 30); //獲得唱片名
	memcpy((void *)mp3info.Year, mp3tag + 93, 4); //獲得年
	memcpy((void *)mp3info.Comment, mp3tag + 97, 28); //獲得註釋
	memcpy((void *)&mp3info.reserved, mp3tag + 125, 1); //獲得保留
	memcpy((void *)&mp3info.reserved2, mp3tag + 126, 1);
	memcpy((void *)&mp3info.reserved3, mp3tag + 127, 1);
	fclose(fp);
}
void CPlay::StartRecord() //錄音
{
	//先停止當前播放
	mciSendCommand(wDeviceID, MCI_STOP, MCI_WAIT,
		(DWORD)(LPVOID)&playParms);
	mciSendCommand(wDeviceID, MCI_CLOSE, NULL, NULL);
	//再刪除原來的錄音檔案
	try
	{
		DeleteFile("D:\\LuYin.wav");
	}
	catch(...)
	{
	//  刪除出錯處理
	//	cout << "\nDelete Error!!  Error Code: ";
	//	cerr << GetLastError() << endl;
		return;
	}
	//system("del D:\\LuYin.wav");
	//重新開啟一個新的檔案
	openParms.dwCallback = 0;
	openParms.wDeviceID = 0;
	openParms.lpstrDeviceType = "waveaudio"; //檔案型別
	openParms.lpstrElementName = "";
	mciSendCommand(0, MCI_OPEN,
		MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
		(DWORD)(LPVOID)&openParms);
	//開始錄音
	wDeviceID = openParms.wDeviceID;
	recordParms.dwFrom = 0;
	recordParms.dwTo = 0;
	recordParms.dwCallback = (DWORD)hWnd;
	mciSendCommand(wDeviceID, MCI_RECORD, MCI_NOTIFY,
		(DWORD)(LPVOID)&recordParms);
}
void CPlay::EndRecord()
{
	//退出迴圈後暫停錄音
	mciSendCommand(wDeviceID, MCI_STOP, MCI_WAIT, (DWORD)(LPVOID)&genericParms);
	saveParms.dwCallback = 0;
	saveParms.lpfilename = "D:\\LuYin.wav";
	mciSendCommand(wDeviceID, MCI_SAVE, MCI_WAIT | MCI_SAVE_FILE, (DWORD)(LPVOID)&saveParms);//保存錄音
	mciSendCommand(wDeviceID, MCI_CLOSE, NULL, NULL);//關閉裝置
													 //暫停後播放錄音
	filePath = "D:\\LuYin.wav";
	openParms.lpstrElementName = filePath.c_str();
	openParms.dwCallback = (DWORD)hWnd;
	mciSendCommand(wDeviceID, MCI_OPEN, MCI_WAIT | MCI_OPEN_ELEMENT, (DWORD)(LPVOID)&openParms);
	wDeviceID = openParms.wDeviceID;
	mciSendCommand(wDeviceID, MCI_PLAY, MCI_WAIT, (DWORD)(LPVOID)&playParms);
}

相關推薦

mciSendCommand本地音樂播放

下面給出我對它進行的一個簡單的封裝,呼叫時只需要定義一個CPlayer的物件,然後呼叫Open()函式即可播放。 程式碼如下: //Player.h #pragma once #include<windows.h> #include<mmsystem

安卓仿網易雲介面的本地音樂播放器的實現

前言:讀研究生之前,老闆讓學IOS,老老實實看了一個學期的IOS(在這裡強烈安利一下騰訊課堂的小碼哥IOS視訊,基本剛開始只需要10塊買第一部,後面的就可以用可視幣來兌換了,質量還不錯,能學到很多東西,看三部基本IOS就能入門了),結果開學提前兩個月被叫去幹活,一開會,說IO

Android之簡單本地音樂播放

平臺:Android studio 本地的音樂播放器,主要功能就是可以播放音樂,能夠讀取本地的音樂,並顯示出來,播放,暫停,上一首,下一首,進度條可以拖拽播放,添加了前臺service,看一下實現        首先我是先做了一個大概的佈局,樣子先出來,需要其他的空間後期

22_Android中的本地音樂播放器和網路音樂播放器的編寫,本地視訊播放器和網路視訊播放器,照相機案例,偷拍案例實現

1 編寫以下案例:當點選了”播放”之後,在手機上的/mnt/sdcard2/natural.mp3就會播放。2 編寫佈局檔案activity_main.xml<LinearLayout xmlns

IOS 播放本地音樂(播放記憶體卡中的MP3) 及 檔案的寫入

在IOS開發中, 每一個應用程式都擁有一個Documents的資料夾來存放自己的檔案。 在這裡為了測試, 我們首先得把mp3檔案匯入到專案中。 然後讀出資源裡的mp3檔案,寫入到documents中, 然後再從documents中讀取該mp3檔案來播放。 (在實際當中也許我

[HTML5]簡單網頁本地音樂播放

     既然HTML5提出與本地互動方便,就想寫個HTML5的本地音樂播放器。一開始問題主要集中在怎麼讀取本地檔案路徑,我想肯定可以用JS實現去操作本地檔案(因為node.js很容易實現讀取本地檔案,但是原生JS怎麼寫不太清楚),不過簡單一點就用<input typ

iOS-純程式碼編寫本地音樂播放器AVAudioPlayer

背景:天天聽著網易雲音樂,想著哪天要是自己能做一個類似網易雲音樂的播放器就好了(大三還沒畢業)。在CocoaChina程式碼庫裡面逛了有些日子了,就乾脆下載幾個音樂播放器的demo來練練手。實踐結果告訴我:一個完整的播放器確實要做很多功能,確實有些難度。那麼就開

手機影音第十四天,本地音樂列表的展示與播放(利用視頻播放的布局)

獲取本地音樂 共用視頻播放頁面來播放音樂 代碼已經托管到碼雲,有興趣的小夥伴可以下載看看 https://git.oschina.net/joy_yuan/MobilePlayer 效果圖: Android系統提供了MediaScanner,MediaProvider,MediaS

iOS音頻播放之AudioQueue(一):播放本地音樂

init方法 函數 完成 一起 utc getprop 應用 清洗 spl AudioQueue簡單介紹 AudioStreamer說明 AudioQueue具體

使用libvlc簡單的播放一首本地音樂檔案

#include <iostream> #include <unistd.h> #include "vlc/vlc.h" #include "libvlc.h" #include "libvlc_media_player.h" #include "log_

Android開發本地及網路Mp3音樂播放器(十五)網路音樂及歌詞下載功能實現

實現功能: 實現網路音樂歌詞下載功能(下載音樂的同時,下載對應歌詞) 下載好的歌詞目前不在播放器內,可以通過檔案瀏覽器檢視。 後續將博文,將實現本地音樂歌詞下載和已下載音樂掃描功能。 因為,沒有自己的伺服器,所以網路音樂所有相關功能(包含搜尋音樂、下載音樂、下載歌詞)均無法

用AndroidStudio播放網易雲本地音樂

網易雲音樂是一款非常優秀的音樂軟體,它的播放介面由唱片機組成,顯得非常的古樸典雅。 現在我們就用AndirdStudio來實現這個任務: 效果圖 第一步:建立一個新的專案,例如wymusicdemo12 第二步:在java目錄下的第一個

基於android的網路音樂播放器-本地音樂的載入和後臺播放(一)

作為android初學者,最近把瘋狂android講義和瘋狂Java講義看了一遍,看到書中介紹的知識點非常多,很難全部記住,為了更好的掌握基礎知識點,我將開發一個網路音樂播放器-EasyMusic來鞏固下,也當作是練練手。感興趣的朋友可以看看,有設計不足的地方也

Android mediaplayer 播放本地音樂檔案

上一個部落格講到了搜尋本地音樂檔案,那麼當搜尋到後,我們怎麼使用這個音樂檔案呢?當然是根據路徑來播放他,而要播放音樂,自然而然是要用到Android的mediaplayer這個類。 對於mediapl

Android基礎之本地音樂後臺播放

使用service後臺播放音樂,彈出通知public class MainActivity extends Activity { private MusicAdpater adapter; private IMusicPlay mMusicPlay; private

Android開發 本地與線上音樂播放器(基於Service實現)

專案裡需要做一個類似於QQ音樂,網易雲音樂一樣的實現本地與線上播放的音樂播發器。 本地的好做,查詢安卓自己的媒體庫ContentProvidre返回Cursor,一個個讀出來就好了。 關鍵是線上播放。 一開始在網上搜了搜Demo.找到一個線上播放的Demo.但看了看原始碼,

Android開發本地及網路Mp3音樂播放器(五)實現專輯封面圖片

實現功能: 在MyMusicListFragment中實現專輯封面圖片 在item_music_list中實現專輯封面圖片 實現效果如圖: 實現程式碼如下: 在MediaUtiles中新增如下程式碼:/** * 獲取預設專輯圖片 */ pub

Android開發本地及網路Mp3音樂播放器(二)SplashActivity(歡迎介面)

SplashActivity(歡迎介面) 實現功能: 修改背景圖片 通過java修改歡迎介面文字資訊 在xml中增加文字陰影 實現6秒自動跳轉到MainActivity 實現點選Button跳轉到MainActivity 以上2種跳轉方法不衝突 (以上2種跳轉方法不衝突

非常漂亮的HTML5音樂播放

tps min 播放 gre 頁面 row 簡單 div tle APlayer是一個非常漂亮的HTML5音頻播放器,它將audio標簽封裝,並結合CSS制作出漂亮的播放器UI,它支持設置歌名、歌手和歌詞,可以設置是否自動播放,支持縮略圖,支持播放進度以及設置播放源。

10個免費開源的JS音樂播放器插件

一個 很好 tle ef7 制作 obi tex ios開發者 選擇 音樂播放器在網頁設計中有時候會用到,比如一些時尚類、音樂或影視類等項目,但這些 網頁播放器 插件比較少見,所以這裏為大家整理一個集合,也許會有用到的時候。 下面整理的播放器有些是支持自適應的,如果需要