【问题标题】:No sound when using SDL_mixer使用 SDL_mixer 时没有声音
【发布时间】:2014-09-09 14:35:05
【问题描述】:

由于某些非常奇怪的原因,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;

【问题讨论】:

    标签: c++ sdl sdl-mixer


    【解决方案1】:

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

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

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

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

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

    我推测 SDL 作者有一些默认值,在 Linux 下是合理的,但在 Windows 下会造成混乱:

    像您的(和 ffplay)这样的客户端代码不会返回任何错误,也不会出现异常,只是 SDL 愉快地将音频推入了虚空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多