C語言使用mciSendString實(shí)現(xiàn)播放音樂功能
使用 mciSendString 播放音樂
mciSendString 支持 mp3、wma、wav、mid 等多種媒體格式,使用非常簡單。這里做一個(gè)簡單的范例,用 mciSendString 函數(shù)播放 MP3 格式的音樂,代碼如下:
// 編譯該范例前,請(qǐng)把 music.mp3 放在項(xiàng)目文件夾中 // 發(fā)布時(shí),請(qǐng)把 music.mp3 和編譯的 exe 放在一起 // 編譯環(huán)境:VC6~VC2019 + EasyX_20210115 // #include <graphics.h> #include <conio.h> // 引用 Windows Multimedia API #pragma comment(lib, "Winmm.lib") int main() { initgraph(640, 480); // 打開音樂 mciSendString(_T("open music.mp3 alias mymusic"), NULL, 0, NULL); outtextxy(0, 0, _T("按任意鍵開始播放")); _getch(); // 播放音樂 mciSendString(_T("play mymusic"), NULL, 0, NULL); outtextxy(0, 0, _T("按任意鍵停止播放")); _getch(); // 停止播放并關(guān)閉音樂 mciSendString(_T("stop mymusic"), NULL, 0, NULL); mciSendString(_T("close mymusic"), NULL, 0, NULL); outtextxy(0, 0, _T("按任意鍵退出程序")); _getch(); closegraph(); return 0; }
簡單講解一下:
一定要引用 Winmm.lib 庫文件。這個(gè)范例中是通過 #pragma comment 命令引用的,也可以在項(xiàng)目屬性中設(shè)置,這里不作介紹。
mciSendString 函數(shù)的功能很強(qiáng)大,甚至可以播放視頻,不過這里就不多作介紹了,詳細(xì)請(qǐng)參見 MSDN。多數(shù)情況只需要用到第一個(gè)參數(shù),將另外三個(gè)參數(shù)置為 NULL, 0, NULL 即可。
第一個(gè)參數(shù)是多媒體命令字符串,不區(qū)分大小寫。程序中,先要通過 open 命令打開 background.mp3,并用 alias 指定了別名為“mymusic”,這樣在之后的代碼中就可以方便的通過“mymusic”這個(gè)別名訪問該音樂了。當(dāng)然,并不是必須要指定別名,每次通過文件名訪問也是可以的。
open 后面的 mp3 用絕對(duì)路徑或相對(duì)路徑都可以。
然后就是:play mymusic 開始播放,stop mymusic 停止播放,close mymusic 關(guān)閉文件。
如果需要同時(shí)播放多個(gè)音樂,請(qǐng)為不同的音樂指定不同的別名,然后分別操作即可。
不再需要播放的音樂,請(qǐng)記得用 close 命令關(guān)閉。
另外還有一個(gè) PlaySound 函數(shù)也可以用來播放聲音,不過可惜不支持 mp3 / wma,這里就不多做介紹了。
一些有用的多媒體命令:
從頭播放 xxx:
"play xxx from 0"
循環(huán)播放 .mp3 文件(.wma 文件同樣可以):
"open xxx.mp3"
"play xxx.mp3 repeat"
循環(huán)播放 .wav 文件(.mid 文件同樣可以):
"open xxx.wav type MPEGVideo"
"play xxx.wav repeat"
關(guān)閉當(dāng)前程序打開的所有多媒體文件:
"close all"
如果文件名中有空格,需要用雙引號(hào)引起來文件名(注意轉(zhuǎn)義):
mciSendString("open \"D:\\My Music\\俞麗拿 梁祝 化蝶.mp3\" alias mymusic", NULL, 0, NULL);
使用 mciSendCommand 播放音樂
mciSendCommand 與 mciSendString 的功能類似,只是控制方式略有區(qū)別。因此,對(duì) mciSendCommand 不做過多介紹,只看一個(gè)使用例子吧。以下范例實(shí)現(xiàn) mp3 的循環(huán)播放:
// 該范例演示使用 mciSendCommand 函數(shù)循環(huán)播放 mp3 // 編譯環(huán)境:VC2008~VC2019 + EasyX_20210115 // #include <graphics.h> #include <Digitalv.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main() { initgraph(640, 480); // 打開音樂文件 MCI_OPEN_PARMS mciOpenParms; mciOpenParms.lpstrDeviceType = L"sequencer"; mciOpenParms.lpstrElementName = L"R:\\Downloads\\test.mp3"; mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT, DWORD_PTR(&mciOpenParms)); // 打開指定媒體文件 UINT wDeviceID = mciOpenParms.wDeviceID; // 返回的 Device ID 需要保存下來,以便實(shí)現(xiàn)后續(xù)控制 outtextxy(0, 0, L"按任意鍵開始播放"); _getch(); // 播放音樂 MCI_PLAY_PARMS mciPlayParms; mciSendCommand(wDeviceID, MCI_PLAY, MCI_DGV_PLAY_REPEAT, DWORD_PTR(&mciPlayParms)); outtextxy(0, 0, L"按任意鍵停止播放"); _getch(); // 停止播放并關(guān)閉音樂 mciSendCommand(wDeviceID, MCI_STOP, 0, NULL); // 停止播放 mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); // 關(guān)閉音樂 outtextxy(0, 0, L"按任意鍵退出程序"); _getch(); closegraph(); return 0; }
解決某些 MP3 無法播放的問題
有些 mp3 無法用 mciSendString 播放,是因?yàn)橛昧吮容^大的封面,我測(cè)試過一個(gè) mp3 的封面尺寸是 1824x1824,直接無法播放。將封面尺寸修改為 500x500,順利播放。當(dāng)然,更簡單的辦法是直接移除封面。這里給大家推薦個(gè)工具:Mp3tag,官網(wǎng):https://www.mp3tag.de,Mp3tag 的操作方法非常簡單,點(diǎn)點(diǎn)鼠標(biāo)就能搞定,這里不再詳述。
使用 PlaySound 函數(shù)播放音樂
PlaySound 可以用來播放 wav 和系統(tǒng)聲音,使用很簡單,一些常用的用法如下:
// 注意: // 1. 需要使用預(yù)編譯指令 #pragma comment(lib, "winmm.lib") 鏈入庫文件 // 2. 第一個(gè)參數(shù)是字符串,注意使用程序中約定的字符集,例如 Unicode 字符集需要在字符串前面加 L // PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_SYNC); // 播放 Bells.wav,并等待直到播放結(jié)束 PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_ASYNC); // 后臺(tái)播放 Bells.wav,函數(shù)立即返回 PlaySound("SystemExclamation", NULL, SND_ASYNC); // 后臺(tái)播放系統(tǒng)定義的 SystemExclamation 聲音 PlaySound("C:\\SOUNDS\\BELLS.WAV", NULL, SND_LOOP | SND_ASYNC); // 后臺(tái)循環(huán)播放 Bells.wav PlaySound(NULL, NULL, 0); // 停止后臺(tái)播放
到此這篇關(guān)于C語言使用mciSendString實(shí)現(xiàn)播放音樂功能的文章就介紹到這了,更多相關(guān)C語言mciSendString播放音樂內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++非繼承時(shí)函數(shù)成員訪問屬性和類繼承過程中的訪問控制
這篇文章主要介紹了C++非繼承時(shí)函數(shù)成員訪問屬性和類繼承過程中的訪問控制,非繼承時(shí),protected成員和private成員沒有任何區(qū)別,都是類內(nèi)部可以直接訪問它們、類外部的類對(duì)象不可訪問它們、類內(nèi)部的類對(duì)象可以訪問它們,更多詳細(xì)內(nèi)容請(qǐng)參考下面相關(guān)資料2022-03-03詳細(xì)講解C語言中的數(shù)據(jù)以及位運(yùn)算
這篇文章主要為大家詳細(xì)介紹了C語言中數(shù)據(jù)表示方法以及位運(yùn)算的相關(guān)知識(shí)點(diǎn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06C++友元函數(shù)與拷貝構(gòu)造函數(shù)詳解
這篇文章主要介紹了C++友元函數(shù)與拷貝構(gòu)造函數(shù),需要的朋友可以參考下2014-07-07詳解C語言如何執(zhí)行HTTP GET請(qǐng)求
在現(xiàn)代互聯(lián)網(wǎng)時(shí)代,網(wǎng)絡(luò)數(shù)據(jù)的獲取和分析變得越來越重要,本文我們將使用C語言和libcurl庫來編寫一個(gè)簡單的網(wǎng)絡(luò)爬蟲,以執(zhí)行HTTP GET請(qǐng)求并獲取淘寶網(wǎng)頁的內(nèi)容,感興趣的可以了解下2023-11-11C++實(shí)現(xiàn)LeetCode(110.平衡二叉樹)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(110.平衡二叉樹),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07應(yīng)用程序操作NorFlash示例代碼分享(norflash接口使用方法)
相對(duì)于操作NandFlash,操作NorFlash相對(duì)簡單,因?yàn)榛静恍枰紤]壞塊,NorFlash也沒有OOB區(qū)域,也跟ECC沒有關(guān)系。讀寫擦除相對(duì)容易,下面看個(gè)例子吧2013-12-12