C++利用控制台播放音樂


寫在前面

先給你倆個文件,由於只有倆,又由於某度的網盤很黑,我就不放網盤了

注:本文用到了基於window系統的windows.h庫,所以用linux的可以(點完贊后再)跳過這篇文章

又注:播放的音樂格式貌似只支持MP3文件(比如可能不支持flac格式)

㕛注:可以自己起的都叫bulabula(僅適用於本文)

//name: AudioClip.cpp
#include"AudioClip.h"
#include<iostream>
#include<time.h>

Mci::Mci()
{
	HINSTANCE hins = LoadLibraryA("winmm.dll");
	wmci=(w32mci)GetProcAddress(hins, "mciSendStringA");
	wmcierror = (w32mcierror)GetProcAddress(hins, "mciGetErrorStringA");
}
Mci::~Mci()
{
	FreeLibrary(hins);
}
bool Mci::send(std::string command)
{
	int errcode = wmci(command.c_str(), buf, 254, 0);
	if (errcode)
	{
		wmcierror(errcode, buf, 254);
		return false;
	}
	return true;
}
AudioClip::AudioClip()
{
	//do nothing
}
AudioClip::~AudioClip()
{
	std::string cmd;
	cmd = "close " + alias;
	mci.send(cmd);
}
bool AudioClip::load(const std::string& _filename)
{
	filename = _filename;
	for (unsigned int i = 0; i < filename.length(); i++)
	{
		if (filename[i] == '/')
			filename[i] = '\\';
	}
	alias = "mp3_";
	srand(time(NULL));
	char randstr[6];
	_itoa(rand() % 65536, randstr, 10);
	alias.append(randstr);
	std::string cmd;
	cmd = "open " + filename + " alias " + alias;
	if (mci.send(cmd) == false)
		return false;
	cmd = "set " + alias + " time format milliseconds";
	if (mci.send(cmd) == false)
		return false;
	cmd = "status " + alias + " length";
	if (mci.send(cmd) == false)
		return false;
	length_ms = atoi(mci.buf);
	return true;
}
bool AudioClip::play(int start_ms , int end_ms)
{
	if (end_ms == -1) end_ms = length_ms;
	std::string cmd;
	char start_str[16], end_str[16];
	_itoa(start_ms, start_str,10);
	_itoa(end_ms, end_str, 10);
	cmd = "play " + alias+" from ";
	cmd.append(start_str);
	cmd.append(" to ");
	cmd.append(end_str);
	return mci.send(cmd);
}
bool AudioClip::stop()
{
	std::string cmd;
	cmd = "stop "+alias;
	if (mci.send(cmd) == false)
		return false;
	cmd = "seek " + alias + " to start";
	if (mci.send(cmd) == false)
		return false;
	return true;
}
bool AudioClip::pause()
{
	std::string cmd;
	cmd = "pause " + alias;
	if (mci.send(cmd) == false)
		return false;
	return true;
}
bool AudioClip::unpause()
{
	std::string cmd;
	cmd = "resume " + alias;
	if (mci.send(cmd) == false)
		return false;
	return true;
}
int AudioClip::milliseconds()
{
	return length_ms;
}

//name: AudioClip.h
#include<string>
#include<Windows.h>
typedef  int(__stdcall* w32mci)(const char*, char*, int,  int);
typedef int(__stdcall *  w32mcierror)(int, char*, int);
class Mci
{
private:
	HINSTANCE hins;
	w32mci wmci;
	w32mcierror wmcierror;
public:
	Mci();
	~Mci();
	char buf[256];
	bool send(std::string command);//error  return false
};
class AudioClip
{
private:
	Mci mci;
	std::string filename;
	std::string alias;
	int length_ms;
public:
	AudioClip();
	~AudioClip();
	bool load(const  std::string& _filename);
	bool play(int start_ms=0, int end_ms=-1);
	bool stop();
	bool pause();
	bool unpause();
	int milliseconds();
};

使用教程

最好把這倆文件放進和你要編譯的源文件同一個文件夾里,如:

A Floder
|
|---AudioClip.cpp(我給你的)
|
|---AudioClip.h(也是我給你的)
|
|---main.cpp(介個是你要編譯的源文件)
|
|---main.exe(假裝main.cpp編譯出來的是這玩意)

然后把音樂放進這個文件夾里,但我更推薦再建一個文件夾,如:

A Floder
|
|---Music
|   |
|   |---bulabula.mp3
|
|---AudioClip.cpp(我給你的)
|
|---AudioClip.h(也是我給你的)
|
|---main.cpp(介個是你要編譯的源文件)
|
|---main.exe(假裝main.cpp編譯出來的是這玩意)

使用的時候創建一個音樂類變量,寫法:

AudioClip bulabula;
//AudioClip是個類(小白可以理解成結構體)
//就像寫個int bulabula一樣簡單
bulabula.load("音樂路徑");//加載歌曲
bulabula.load("Music/bulabula.mp3");//這是個相對路徑的栗子

bulabula.play();//開始播放
bulabula.stop();//停止播放
bulabula.pause();//暫停播放
bulabula.unpause();//繼續播放

文章快結束了,再來顆栗子吧:

#include"AudioClip.cpp"//調用音樂類
AudioClip bulabula;
int main()
{
    bulabula.load("Music/bulabula.mp3");//加載歌曲(相對路徑)
    bulabula.play();//播放
    while(1){}//一結束程序就停止播放了
    //所以我寫了個死循環卡住程序
    return 0;
}

完結撒花


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM