3

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

1 回答 1

0

令人惊讶的是,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 愉快地将音频推到了空白中。

于 2015-04-14T15:21:55.320 回答