【问题标题】:SDL MIX_LOADWAV() crashes on loading some wav filesSDL MIX_LOADWAV() 在加载某些 wav 文件时崩溃
【发布时间】:2021-06-09 03:01:50
【问题描述】:

我有一个加载波形文件的 C++ 程序。并接受击键以用作钢琴。最近,我尝试将 wav 文件从互联网上的笔记更改为现场录音笔记。文件的唯一区别可能是现场录音是立体声的。无论如何,当我给 Mix_LoadWAV(a.wav) 它返回 null [例如,所有现场录音都加载 null]。

我应该知道的 sdl 1.2 MIX_LOADWAV() 有什么限制吗?

bool LoadFiles()
{
    Background = LoadImage("graphics/background.bmp");

    cNote = Mix_LoadWAV("notes/c.wav" );
    csNote = Mix_LoadWAV("notes/cs.wav" );
    dNote = Mix_LoadWAV("notes/d.wav" );
    dsNote = Mix_LoadWAV("notes/ds.wav" );
    eNote = Mix_LoadWAV("notes/e.wav" );
    fNote = Mix_LoadWAV("notes/f.wav" );
    fsNote = Mix_LoadWAV("notes/fs.wav" );
    gNote = Mix_LoadWAV("notes/g.wav" );
    gsNote = Mix_LoadWAV("notes/gs.wav" );
    aNote = Mix_LoadWAV("notes/a.wav" );
    asNote = Mix_LoadWAV("notes/as.wav" );
    bNote = Mix_LoadWAV("notes/b.wav" );
    highCNote = Mix_LoadWAV("notes/highC.wav" );

    if(Background == NULL || cNote == NULL || csNote == NULL || dNote == NULL || dsNote == NULL || eNote == NULL || fNote == NULL || fsNote == NULL || gNote == NULL || gsNote == NULL || aNote == NULL || asNote == NULL || bNote == NULL || highCNote == NULL)
    {
        printf("File load error\n");
        return false;
    }

    return true;
}

【问题讨论】:

  • 来自 SDL 文档:sdl.beuc.net/sdl.wiki/Mix_LoadWAV。所以我会将它转换为 OGG(或任何其他列出的东西),看看它是否有效。无论如何,我自己在 SDL_mixer 中对格式支持的体验很糟糕,但也许我们都做错了。文档对音频格式的细节不是很清楚:/
  • 另外,我不确定 SDL_mixer 是否适合您尝试做的事情。我建议切换到更复杂的音频库(您可以尝试查看here,因为我敢打赌,即使您解决了这个问题,您也会遇到 SDL 的其他限制。
  • 我刚刚尝试了 Mix_LoadMUS() 而不是 Mix_LoadWAV(),它似乎可以工作。似乎 Mix_LoadWAV 不适用于所有 wav 文件 Mix_LoadMUS 似乎可以很好地打开其他 wav。虽然令人困惑,但我尝试找到有关 wav 和 wav 音乐文件之间区别的明确文档。我尝试将我的现场录音制作成单声道 chanel 波形文件,但这没有帮助。

标签: c++ sdl


【解决方案1】:

经过今天的艰辛,我想我找到了 SDL Mixer 的 WAV 加载功能的问题。我重新录制了一些音效,一旦更换它们,我正在开发的游戏就完全崩溃了。经过一些错误跟踪,我推断是 Mixer 拒绝加载新的 WAV 文件,但我不知道为什么。

然后我突然想到我已经在 Audacity 中录制了新的音效,并将它们保存为 32 位签名 PCM, 而不是 16 位 PCM。

事实证明,Load_WAV 不支持 32 位签名的 PCM WAV 文件,如果您尝试加载它们会崩溃。相反,您必须将它们转换为 16 位签名的 PCM WAV 文件,即使用 Audacity 之类的程序。一旦你这样做了,它就会完美地工作。

希望这可以帮助像我和 OP 一样困惑的人!据我所知,文档从来没有在任何地方提到过这个限制,所以我相信它已经让很多人感到困惑。

(其他地方注明:https://gamedev.stackexchange.com/questions/136817/how-to-get-sdl2-to-play-32bit-wav-files

【讨论】:

  • 我忘记了这篇文章。当我从事这个项目时,我基本上在 SDL 文档中发现了这一点。 SDL 中有一个更宽松的声音功能,我最终使用了它,但我不记得它是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 2013-09-25
相关资源
最近更新 更多