【问题标题】:Cannot play mp3 with mciSendString in C++ console application无法在 C++ 控制台应用程序中使用 mciSendString 播放 mp3
【发布时间】:2021-11-29 17:07:47
【问题描述】:

我正在尝试从 win32 C++ 控制台应用程序播放 mp3 文件。根据我在网上阅读的内容,mciSendString 是我正在寻找的 API,我希望以下内容可以正常工作,但它没有。

#include <cstdio>
#include <array>

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <mmsystem.h>
using namespace std;

#pragma comment(lib, "Winmm.lib")

int main() {
    std::array<char, MAXERRORLENGTH> errorString;
    mciGetErrorStringA(
        mciSendStringA(
            "open \"C:\\path\\to\\1_.mp3\" type mpegvideo alias click1",
            nullptr,
            0,
            nullptr),
        errorString.data(),
        MAXERRORLENGTH);
    std::printf("%s\n", errorString.data());
    mciGetErrorStringA(
        mciSendStringA("play click1", nullptr, 0, nullptr),
        errorString.data(),
        MAXERRORLENGTH);
    std::printf("%s\n", errorString.data());
}

我在 Visual Studio 2019 中创建了一个新的 C++ 控制台应用程序,构建了此代码,并从控制台运行它。它打印:

The specified command was carried out.
The specified command was carried out.

在我的耳机中,我听到了短暂的爆裂声,但仅此而已。会发生什么?我是否首先需要配置音频设备?设置音量?

【问题讨论】:

    标签: c++ winapi audio visual-c++ console-application


    【解决方案1】:

    您的程序在您调用 mci 命令后结束。当进程退出时,音乐将停止播放。

    只需在程序末尾添加一些内容以防止其退出。

    而不是这个:

        std::printf("%s\n", errorString.data());
    }
    

    这个:

        std::printf("%s\n", errorString.data());
        
        printf("press ctrl-c to exit");
        while (1) {
            Sleep(1000);
        }
    }
    

    【讨论】:

    • std::cin.get()getch()Sleep() 循环更有意义。如果您要使用Sleep(),请使用Sleep(INFINITE) 而不是无限循环。或者,您可以简单地将wait 标志添加到play 命令,这样mciSendString() 在声音播放完毕之前不会退出。
    • 哦!它异步执行!当然可以。谢谢。
    • @EricNiebler per The Wait Flag 文档:“MCI 命令通常会立即返回给用户,即使需要几分钟才能完成命令发起的操作 。您可以使用“等待”(MCI_WAIT) 标志来指示设备等到请求的操作完成后再将控制权返回给应用程序。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    相关资源
    最近更新 更多