SDL2_mixer und deren Sample Rate
-
Hiho,
Ich versuche einen perfekten MP3-Sound abzuspielen, aber das klappt nicht bei jedem Track. Mal ist der Sound perfekt, manchmal ist der Track langsamer, manchmal schneller, obwohl ich immer die korrekte Sample Rate bei Mix_OpenAudio mit angebe. Hier ein paar Zeilen Code...
Meine file_info (benutzt die TagLib):
struct file_info{ int frequency; void get(const std::string& fp){ ... frequency = reference.audioProperties()->sampleRate(); } };Und dann mein music_initializer mit der music-Klasse (file_info in Konjunktion mit SDL2_mixer):
struct music_initializer{ music_initializer(const std::string& file_path){ file_info info; info.get(file_path); if(Mix_OpenAudio(info.frequency, MIX_DEFAULT_FORMAT, 2, 4096)) throw std::runtime_error{Mix_GetError()}; } ~music_initializer(){ Mix_CloseAudio(); } }; class music{ ... void open(const std::string& fp){ if(music_handle && (is_playing() || is_paused())) stop(); initializer.reset(new music_initializer(file_path = fp)); music_handle.reset(Mix_LoadMUS(file_path.c_str())); ... } void play(){ if(!music_handle) open(file_path); if(Mix_PlayMusic(music_handle.get(), -1)) throw std::runtime_error{Mix_GetError()}; } };Bei den lazyfoo-Tutorials wird der magische Wert 22050 als Sample Rate benutzt. Das macht den einen oder anderen Track, der ne andere Sample Rate hat, saulahm. Mit der TagLib funktioniert es nun fast so wie gewollt, aber eben nur fast.
Ist die TagLib vielleicht hier nicht das Richtige dafür, bzw. liefert mir die TagLib ungenaue Werte? Ich denk mal schon.
Was brauche ich um die genaue Sample Rate zu bekommen?
Oder Allgemeiner gefragt: Wie krieg ich den perfekten Sound hin?
-
http://www.mega-nerd.com/libsndfile/ gibt dir so ziemlich alle nützlichen Infos, auf jeden Fall die verlässlich die Sample Rate, zu Soundfiles.
Die library ist auch überall vorhanden, wird in vielen prominenten Projekten verwendet
-
Ok, danke für die Info, aber kuck mal:
#include <sndfile.hh> #include <iostream> int main(){ SndfileHandle f("track.mp3"); std::cout << f.samplerate(); }Das da gibt mir ne 0 aus.
Ich habs wie hier gemacht, ab Zeile 51.Kann mir vielleicht noch einer verraten, was daran so falsch ist?
-
Ahja, libsndfile supportet kein MP3, hab ich grad gelesen.
Muss wohl was anderes her, denn ich benutze den SDL2_mixer einzig und allein aus dem Grund, und weil es so einfach ist.
-
*push*
Gibt es noch andere Wege einen perfekten MP3-Sound hinzubekommen? Muss ja nicht SDL2_mixer sein.
Ich habe schon libmad versucht, der Code klappt auch, das Problem ist nur, dass ich ihn kaum zur Hälfte verstehe. Das ganze Bit Twiddling macht mich wahnsinnig und ich möchte keinen Code benutzen, den ich selber nicht verstehe.
Gibt es vielleicht eine Library, die +- so einfach in der Benutzung ist, wie der SDL2_mixer?
Ansonsten, gibt es sonst noch was, was mir weiterhelfen könnte?
-