Wohlstand
@Wohlstand
Инженер-программист С++

Как заставить SDL2_mixer воспроизводить mp3-формат?

Имеется Qt-приложение, в котором я использовал SDL2_mixer для проигрывания музыки.
SDL2_mixer очень шустро воспроизводит почти любой формат, в отличие от QMediaPlayer который ещё думает перед началом воспроизведения (задержка возникает из-за аниматора, который воспроизводит анимацию для 10000 рендерящихся объектов). Но формат mp3 как ни крути, воспроизводится не хочет.
Интересно то, что даже когда либа smpeg2.dll (в Windows-версии) на месте и запущена, и никаких ошибок не возникает ни с указателем Mix_Music *, Mix_LoadMUS() прогружает файл и Mix_PlayMusic(play_mus, -1) возвращает 0, в колонках тишина.
- Пути к фалам абсолютные, в формате "/path/to/file.mp3" и "C:/path/to/file.mp3" (пути получаю через QFileInfo)
- Проигрываются ВСЕ остальные форматы, (Тестировал OGG, FLAC, WAV, MIDI).

Вот кусочки кода, которые отвечают за работу SDL-плеера:

В функцие main()
SDL_Init(SDL_INIT_AUDIO);
    int iniFlags = Mix_Init(MIX_INIT_FLAC | MIX_INIT_MOD | MIX_INIT_MP3 | MIX_INIT_OGG );
    Mix_OpenAudio(44100, AUDIO_S16, 2, 4096);


Сам плеер:
namespace xxxxxxx
{
Mix_Music *play_mus = NULL;

    void MUS_stopMusic()
    {
        Mix_HaltMusic();
    }

    void MUS_playMusic()
    {
        if(play_mus)
        {
            if(Mix_PlayMusic(play_mus, -1)==-1)
            {
                qDebug() << QString("Mix_PlayMusic: %1\n").arg(Mix_GetError());
                // well, there's no music, but most games don't break without music...
            }
        }
        else
        {
            qDebug() << QString("Play nothing: Mix_PlayMusic: %1\n").arg(Mix_GetError());
        }
    }

    void MUS_changeVolume(int volume)
    {
        Mix_VolumeMusic(volume);
    }

    void MUS_openFile(QString musFile)
    {
        if(play_mus!=NULL) {Mix_FreeMusic(play_mus);play_mus=NULL;}
        play_mus = Mix_LoadMUS( musFile.toLocal8Bit() );
        if(!play_mus) {
            qDebug() << QString("Mix_LoadMUS(\"%1\"): %2").arg(musFile).arg(Mix_GetError());
        }

        qDebug() << "Pointer is " << static_cast<void*>(&play_mus);
    }

}


MP3-формат пока ещё нужен некоторое время, пока существует огромное количество старых не преобразованных проектов, использующих MP3-музыку, а новые проекты уже давно создаю с использованием форматов OGG Vorbis и FLAC.
  • Вопрос задан
  • 2949 просмотров
Решения вопроса 1
EXL
@EXL
Энтузиаст
Почему используете smpeg, а не libmad? Попробуйте собрать SDL2_mixer так, чтобы декодером был именно mad. Не знаю, как в SDL2_mixer, но в SDL_mixer собрать с libmad можно было как-то так.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы