• 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;
    }
    

    完结撒花

  • 相关阅读:
    z-index只能在position属性值为relative或absolute或fixed的元素上有效。
    margin负值得理解
    <em>标签与<strong>标签区别
    文字的垂直居中
    data-*的定义和用法
    one()方法的介绍
    <meta name="application-name" content="优酷网" /> 是什么意思?
    <meta property="qc:admins" content="70003766576320416375" />是什么意思?具体功能是什么?
    head部分关于搜索引擎
    java第三次作业
  • 原文地址:https://www.cnblogs.com/fox-nest/p/13216655.html
Copyright © 2020-2023  润新知