Имеется 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.