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