【问题标题】:SFML Sound not playingSFML 声音不播放
【发布时间】:2015-03-20 04:38:54
【问题描述】:

我正在尝试在 SFML 中播放声音文件,但它没有播放。这是声音(警告:音量很大):http://freesound.org/people/thanvannispen/sounds/9550/。我使用在线转换器将其转换为 wav (http://audio.online-convert.com/convert-to-wav),但声音在 Windows 中播放良好,所以这不应该是问题。

SoundManager.h

#pragma once

#include <SFML\Audio.hpp>
#include <map>

class SoundManager
{
public:
    SoundManager();
    ~SoundManager();

    static bool load();

    static std::map<std::string, sf::Sound> sound;
};

声音管理器.cpp

#include "SoundManager.h"
#include <SFML\Audio.hpp>
#include <map>

std::map<std::string, sf::Sound> SoundManager::sound = std::map<std::string, sf::Sound>();

SoundManager::SoundManager()
{
}

SoundManager::~SoundManager()
{
}

bool SoundManager::load() {
    sf::SoundBuffer laughterBuffer;
    if (!laughterBuffer.loadFromFile("data/sound/laughter.wav")) {
        return false;
    }
    sf::Sound laughter;
    laughter.setBuffer(laughterBuffer);
    SoundManager::sound["laughter"] = laughter;
}

我在这里加载声音:

Logger::print("Loading sound...");
if (!SoundManager::load()) {
    Logger::error("Failed to load sound! Exiting...");
    exit();
}
Logger::print("Sound loaded.");

我在进入游戏循环之前就是这样玩的(我试过从多个地方调用它;没有工作)

SoundManager::sound["laughter"].play();

当我第一次尝试导入 SFML\Audio.hpp 时,它给了我一个关于找不到 libsndfile-1.dll 的错误,所以我将它复制/粘贴到文件夹中,现在它可以工作了,但我不确定为什么会这样自从我静态链接以来就发生了。是否与我链接到 SFML 的方式有关?

sfml-main.lib
sfml-network-s.lib
ws2_32.lib
sfml-audio-s.lib
sndfile.lib
openal32.lib
sfml-window-s.lib
sfml-system-s.lib
opengl32.lib
gdi32.lib
winmm.lib
sfml-graphics-s.lib
glew.lib
freetype.lib
jpeg.lib

【问题讨论】:

    标签: c++ audio sfml


    【解决方案1】:

    不仅sf::SoundBuffer,sf::Sound也需要存活。

    您可以将它们都设置为类变量或全局变量(但不能在函数中设置变量,因为它会在执行后被杀死)。

    例如:

    .h 文件

    #pragma once
    #include <SFML/Audio.hpp>
    class SoundManager
    {
    private:
        sf::SoundBuffer missile_launch_buff;
        sf::Sound fire_sound;
    public:
        SoundManager();
        void playMissileLaunch();
    
    };
    

    .cpp 文件

    #include "SoundManager.h"
    #include <iostream>
    using namespace std;
    
    
    SoundManager::SoundManager()
    {
    
        missile_launch_buff.loadFromFile("sound/missile_launch.wav");
    
    }
    
    void SoundManager::playMissileLaunch()
    {
    
        fire_sound.setBuffer(missile_launch_buff);
        fire_sound.play();
        cout << "Missile launch sound \n";
    }
    

    【讨论】:

      【解决方案2】:

      来自关于 sf::Sound::setBuffer() 的 SFML 文档:

      需要注意的是,声音缓冲区不会被复制,因此 sf::SoundBuffer 实例必须保持活动状态,只要它附加到声音上。

      laughterBuffer 并非如此。

      我建议看看Thor resourcessftools resources

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 2019-05-30
        • 1970-01-01
        • 2011-02-25
        • 2020-02-15
        • 2015-12-22
        • 2022-01-25
        相关资源
        最近更新 更多