c++ - 使用SDL_mixer时没有声音

标签 c++ sdl sdl-mixer

出于某些非常奇怪的原因,SDL_mixer 绝对没有声音播放。我已经尝试了一切:重新安装库,检查音乐是否真的可以播放,使用 Mix_FadeInMusic 和 Mix_FadeOutMusic,绝对没有效果。它告诉我音乐正在加载,它告诉我它正在播放。我在 VC 2013 中使用 Windows 8.1 64 位。

代码:

SDL_Init(SDL_INIT_EVERYTHING);
// Create window

Mix_Init(MIX_INIT_MP3 | MIX_INIT_OGG | MIX_INIT_FLAC | MIX_INIT_FLUIDSYNTH | MIX_INIT_MOD | MIX_INIT_MODPLUG);

if (Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096)) {
    printf("Unable to open audio!\n");
    ovr_Shutdown();
    SDL_Quit();
    exit(1);
}

music = Mix_LoadMUS(tmpLoc);
if (music == NULL) SDL_ShowSimpleMessageBox(NULL, "", "Music is null", window);
Mix_PlayMusic(music, -1,1000);
if (!Mix_PlayingMusic()) SDL_ShowSimpleMessageBox(NULL, "", "No music playing", window);

// OpenGL stuff
while (quit == false)
{
    // Loop
}
Mix_HaltMusic();
Mix_FreeMusic(music);
Mix_CloseAudio();
Mix_Quit();
SDL_DestroyWindow(window);
SDL_Quit();
return 0;

最佳答案

令人惊讶的是,SDL 需要 Windows 下的环境变量(最初针对 Linux 的工件)才能实际输出音频。

尝试设置 SDL_AUDIODRIVER=waveout(或者您可以使用 =dsound)。

或者,您可以在调用 SDL_Init() 之后调用 SDL_AudioInit("waveout") 或 SDL_AudioInit("dsound")。 (为了提高效率,您可以将您的标志参数修改为 SDL_Init() 以指定除音频外的所有内容)。

SDL_AudioInit() 被作者评论为“内部”api。在库的其他地方调用它来...猜猜...使用从环境变量中获取的字符串初始化您的音频。

我在使用 ffmpeg 的 ffplay 时遇到了这个问题,它依赖于(静态链接的)SDL 来输出音频(然后无法输出音频,除非/直到我手动设置 env 变量)。

我推测 SDL 作者有一些默认设置,在 Linux 下是合理的,但在 Windows 下会造成麻烦:

像您的(和 ffplay)这样的客户端代码没有返回任何错误,也没有异常,只是 SDL 愉快地将音频推送到空白中。

关于c++ - 使用SDL_mixer时没有声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24825274/

相关文章:

macos - 在OSX上使用Waf编译OpenGL/SDL应用程序时,如何抑制 '-arch'和 'x86_64'标志?

c++ - SDL_Mixer 是否可以在自身上播放单个 block ?

c++ - SDL C++ 程序在大约 12 秒后持续崩溃

c++ - SDL_TTF 和 SDL 2 不能一起工作。给出未处理的异常

c++ - 如何追踪 "tcmalloc : large alloc .... "

c++ - 指针和带指针的结构

c++ - 如何在正则表达式中匹配 '*'

c++ - 调用作为模板参数从 lambda 崩溃传递的成员函数指针

c++ - SDL2.DLL 丢失

C++ union 赋值,有什么好办法吗?