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

完结撒花

原文链接: https://www.cnblogs.com/fox-nest/p/13216655.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

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

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/360703

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午1:27
下一篇 2023年3月2日 下午1:27

相关推荐