Привет, я пытаюсь запустить несколько музыкальных композиций, вот код.
Mix_Music *mix_list[MUSIC_COUNT] ;
//init music with SDL
int result = 0;
int flags = MIX_INIT_MP3;if (SDL_Init(SDL_INIT_AUDIO) < 0) {
printf("Failed to init SDL\n");
exit(1);
}
if (flags != (result = Mix_Init(flags))) {
printf("Could not initialize mixer (result: %d).\n", result);
printf("Mix_Init: %s\n", Mix_GetError());
exit(1);
}
//load music
Mix_OpenAudio(44100, AUDIO_S16SYS, 2, 640);
for (int i = 0 ; i < musiclist.size() ; ++i){
mix_list[i] = Mix_LoadMUS(musiclist[i].c_str());
}
Затем в цикле,
for (; ;){
//trigger from here, some code detect if there's a new music need to be played//play sound here
if (!Mix_PlayingMusic()){
//if not playing just start fresh play
std::cout << "Start Play " << musiclist[markerIds[0]] << std::endl ;
Mix_FadeInMusic(mix_list[markerIds[0]],1,1000) ;
}
else{
//only if change to next music
if (lastDetected != markerIds[0]){
std::cout << "Fading out current" << std::endl ;
//first need to fade out current
while(!Mix_FadeOutMusic(2000) && Mix_PlayingMusic()) {
// wait for any fades to complete
SDL_Delay(100);
}
Mix_HaltMusic() ;
//then start the one
//problem happens here
//there will always be several seconds it plays from the middle somewhere, then plays from the beginning.
Mix_FadeInMusic(mix_list[markerIds[0]],1,4000) ;
}
}
}
Моя проблема указана в коде, проблема в том, когда воспроизводить музыку, которая была сыграна раньше, независимо от того, Mix_FadeInMusic ()
или Mix_PlayMusic()
всегда играет музыку из случайного места сначала в течение нескольких секунд, а затем с самого начала. Но все, что мне нужно, это просто плавное прохождение.
ОС: Ubuntu 16.04
SDL: 2.0.4
Смеситель: 2.0.1
Я понял это сам, на самом деле это проблема с mp3. Библиотека SDL в комплекте с Ubuntu 16.04 имеет небольшие проблемы при воспроизведении некоторых mp3-файлов. Поэтому после того, как я конвертирую файл в OGG и использую int flags = MIX_INIT_OGG;
проблема только ушла
Других решений пока нет …