ncurses + SLD2 和 SDL2_Mixer:尝试播放 mp3 时没有声音

Posted

技术标签:

【中文标题】ncurses + SLD2 和 SDL2_Mixer:尝试播放 mp3 时没有声音【英文标题】:ncurses + SLD2 and SDL2_Mixer: No sound when trying to play mp3 【发布时间】:2017-05-08 03:07:46 【问题描述】:

我正在用 C++ 编写一个程序,它使用 ncurses 库并播放音效。编译编译时,没有声音。

我已安装 SDL2 和 SDL2_Mixer 框架并将其添加到我的 IDE 项目中(我正在使用 Xcode)。我还将 mp3 文件添加到与其他项目文件相同的目录中。这是我的代码:

#include <SDL2/SDL.h>
#include <SDL2_Mixer/SDL_Mixer.h>
#if defined(WIN32)
#include "curses.h"
#else
#include <curses.h>
#endif
...
int main(int argc, char * argv[]) 
Mix_Music *music;

// Initialize music.
if (SDL_Init(SDL_INIT_AUDIO) < 0) 
    fprintf(stderr, "unable to initialize SDL\n");
    exit(EXIT_FAILURE);

if (Mix_Init(MIX_INIT_MP3) != MIX_INIT_MP3) 
    fprintf(stderr, "unable to initialize SDL_mixer\n");
    exit(EXIT_FAILURE);

if (Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 1024) != 0) 
    fprintf(stderr, "unable to initialize audio\n");
    exit(EXIT_FAILURE);

Mix_AllocateChannels(1); // only need background music
music = Mix_LoadMUS("sound.mp3");
if (music) 
    Mix_PlayMusic(music, -1);

...
Mix_HaltMusic();
Mix_FreeMusic(music);
Mix_CloseAudio();
Mix_Quit();


return 0;

构建编译成功,我去终端打开我的项目,然后……没有声音!?我做错了什么?

【问题讨论】:

更新:我的“sound.mp3”文件似乎没有正确加载。也许我在 main() 中没有正确引用它?它与项目中的其他文件位于同一目录中。 SDL_GetError 告诉你什么?文件是否在“相同”目录中并不重要,进程是否具有其“当前工作目录”,以及针对它解析的相对路径。如果您没有更改工作目录,则它由父进程传递。如果不确定,可以通过getcwd 进行检查。 谢谢你,凯尔塔。 SDL_GetError 告诉我:“无法打开 'sound.mp3'。”在我进行 getcwd 查询后,它告诉我我的工作目录是:/private/tmp。 (因为我正在运行 ncurses,所以我必须为项目的构建分配一个临时目录,该目录是:/tmp。)知道问题出在哪里吗?也许只是无法识别文件?? 【参考方案1】:

原来需要的是音乐文件的绝对路径:

Mix_AllocateChannels(1); 
music = Mix_LoadMUS("/.../sound.mp3");
if (music) 
Mix_PlayMusic(music, -1);

【讨论】:

以上是关于ncurses + SLD2 和 SDL2_Mixer:尝试播放 mp3 时没有声音的主要内容,如果未能解决你的问题,请参考以下文章

NCurses – getstr() 和功能键

鼠标向上滚动(Ncurses / C++)

无法使用 CMake 和 ncurses 进行编译

ncurses 到外壳并返回弄乱键

NCurses 和 ESC、ALT 键

使用 ncurses 和 cmake 链接期间未定义的引用