C++怎么播放MP3啊! - 爱问答

(爱问答)

C++怎么播放MP3啊!

我第一次用vc++6.0制作小游戏,我只有MP3的素材,怎么播放?

[cpp] view plain copy

毫无疑问,c++本身无法播放声音。在windows下可以借助mci(媒体控制接口)播放MP3资源,并且很好的控制播放对象。如果你是C++新人,想写一个控制台下播放mp3的小程序,那么本文完全适合你。

 

调用mci一般要借助mciSendString函数,使用该函数需要包含头文件mmsystem.h 然而这样一来就会依赖整个mfc框架,导致普通的控制台程序根本无法编译(其实是链接不过去)。所以我在下面的代码中直接从系统的 wimmm.dll 中调用函数,即使用LoadLibraryA("winmm.dll") 。C++新人可能不懂这些,没关系,你只要知道我的代码可以直接贴到你的控制台程序中去就行了。

AudioClip.h文件

 

<pre name="code" class="cpp">#include<string>  

<pre name="code" class="cpp">#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();  

};  

 

实现文件:

AudioClip.cpp

 

[cpp] view plain copy

<pre name="code" class="cpp">#include"audio_clip.h"  

#include<iostream>  

#include<random>  

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

}  

 

代码就这么多,在你的代码中这样做就可以播放了


下一篇:我gopro6拍的4k60fps(以hevch.265)编码的视频能用什么播放器直接播放?

上一篇:请问Dev-c++5.10如何调试?

热门标签:
excel 网盘 破解 word dll
最新更新:
微软重新评估新的Outlook的使用时机 联想推出搭载联发科Helio G80芯片组的Tab M9平板 英特尔创新大赛时间确定! 微软Edge浏览器在稳定渠道中推出Workspaces功能 英伟达RTX4060TiGPU推出MaxSun动漫主题! 谷歌地图为用户提供了街景服务! GameSir 在T4 Kaleid中推出了一款出色的控制器! 微软开始在Windows 11 中测试其画图应用程序的新深色模式! LG电子推出全球首款无线OLED电视 英伟达人工智能芯片崭露头角! Steam Deck可以玩什么游戏-Steam Deck价格限时优惠 雷蛇推出CobraPro鼠标 Kindle电子阅读器可以访问谷歌商店吗 Windows10如何加入组策略 window10图片查看器怎么没有了?