songlänge einer .mp3 datei auslesen
-
ich habe schon gegoogelt und auch hier im forum was gefunden,
aber ich kann mit allem nichts anfangen.
ich brauche was kleines um die song länge von mp3 files rauszufinden,
das sowohl unter windows als auch unter linux funktioniert.danke im voraus
-
Das hat recht wenig mit reinem C++ zu tun, was hier zu Hause ist.
Denn du beim Standard bleiben willst und dir ein ungefährer Wert reicht, kannst du dich ja über das Format schlau machen und schauen, ob du Informationen in einem Haeder findest(Haben mp3s sowas? - ich weiß es nicht!?)Und sonst: Versuchen mit Dateigröße und Komprimierungsfaktor rausbekommen :D:D:D
-
-
danke leider bringt mir das nichts den beitrag habich schon gefunden und wie du siehst habich da auch schon gepostet.
und das mit dateigrösse und komprimierungsfaktor: ist das nicht ein bisschen ungenau? ausserdem weissich den nicht.
-
das ist relative einfach.
schau dir mal lame an.
Er liefert in C eine include datei lame.h
und die lib liblame.a die musst du nur noch includen
und nach dem lame doku kannst du nun den FILE zeiger
den funktion von lame uebergeben. Damit kannst du:
Auslesen bzw. Einlesen, decoden, encoden.Gg
-
soviel mussich gar nicht das is wahrscheinlich nu wieder unnütz gross.
hab jetzt irgendwo im internet endlich was gefunden und das funktioniert auch.
danke trotzdem. sollich den code noch posten?
-
smash schrieb:
sollich den code noch posten?
Lieber nicht.
-
Lieber nicht.
Denk dir nichts. Nicht auf solche Sandkastenritter hören!Bitte schreib das wesentliche hier rein
Alle anderen, die nach dir das Problem haben, und nach "*mp3* *länge*" mittels der Forensuche suchen werden, werden deinen Beitrag finden und dir für deine Lösung dankbar sein
-
also das ist jetzt die von mir überarbeitete version die bei mir geht und da für mich nur die länge wichtig war habich alles andere was dafür nicht gebraucht wird in kommentarzeichen gesetzt.
int MP3Length( char * path ) { FILE *file = fopen( path, "rb" ); if( !file ) return -1; int curch; // finding first frame for MPEG 1 LAYER III int flag = 0; do { curch = fgetc( file ); if( curch == 255 ) { curch = fgetc( file ); if( tolower(curch/16) == 15 ) flag = 1; } } while( flag != 1); // position of first frame header...... fpos_t filepos; fgetpos( file, &filepos ); filepos -= 2; int firstheaderpos = filepos; /*char firstframeposition[10]; _ltoa( firstheaderpos, firstframeposition, 10 ); m_strinfo="First frame found at byte :"; m_strinfo+=firstframeposition; m_ctlinfo.AddString(m_strinfo);*/ // version check MPEG 1/2... int impegversion=tolower(((curch%16)/4)/2); /*if(impegversion==1) m_strinfo="MPEG 1 "; if(impegversion==0) m_strinfo="MPEG 2 ";*/ // layer check.... //int layer = tolower((((curch%16)/4)%2)*2+(((curch%16)%4)/2)); /*CString mpeglayer[4]={"Reserved","Layer III","Layer II","Layer I"}; m_strinfo+=mpeglayer[layer]; m_ctlinfo.AddString(m_strinfo);*/ /*if(layer!= 1) { fclose( file ); return -1; }*/ // CRC check....... //int protectbit = tolower( ( ( curch % 16 ) % 4 ) % 2 ); /*if(protectbit==1) m_strinfo="CRCs : No"; else m_strinfo="CRCs : Yes"; m_ctlinfo.AddString(m_strinfo);*/ //get next byte to read 3rd byte of header. curch = fgetc( file ); // bitrate info int bitratetable[2][16]={0,8,16,24,32,64,80,56,64,128,160,112,128,256,320,0,0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}; int mp3bitrate=bitratetable[impegversion][tolower(curch/16)]; /*char mp3bps[2]; _itoa(mp3bitrate,mp3bps,10); m_strinfo="Bitrate (kbps) : "; m_strinfo+=mp3bps; m_ctlinfo.AddString(m_strinfo);*/ // frequency info long int frequencytable[2][4]={22050,24000,16000,0,44100,48000,32000,0}; int mp3frequency=frequencytable[impegversion][tolower((curch%16)/4)]; /*char mp3fs[10]; _itoa(mp3frequency,mp3fs,10); m_strinfo="Frequency (Hz) : "; m_strinfo+=mp3fs; m_ctlinfo.AddString(m_strinfo);*/ // padding bit int paddingbit=tolower(((curch%16)%4)/2); /*if(paddingbit==0) m_strinfo="Padding : No"; else m_strinfo="Padding : Yes"; m_ctlinfo.AddString(m_strinfo);*/ // private bit //int privatebit=tolower(((curch%16)%4)%2); /*if(privatebit==0) m_strinfo="Private : No"; else m_strinfo="Private : Yes"; m_ctlinfo.AddString(m_strinfo);*/ // get next char to read 4th byte of header. curch=fgetc( file ); //channel mode //int ichannelmode=tolower((curch/16)/4); /*CString channelmode[4]={"Stereo","Joint Stereo","Dual Channel","Single Channel"}; m_ctlinfo.AddString(channelmode[ichannelmode]);*/ // mode extension ignored. // copyright bit //int copyrightbit=tolower(((curch%16)/4)/2); /*if(copyrightbit==1) m_strinfo="Copyrighted : Yes"; else m_strinfo="Copyrighted : No"; m_ctlinfo.AddString(m_strinfo);*/ //original bit //int originalbit=tolower(((curch%16)/4)%2); /*if(originalbit==1) m_strinfo="Original : Yes"; else m_strinfo="Original : No"; m_ctlinfo.AddString(m_strinfo);*/ //emphasis //int emphasis=tolower((curch%16)%4); /*if(emphasis==0) m_strinfo="Emphasis : None"; if(emphasis==1) m_strinfo="Emphasis : 50/15 ms"; if(emphasis==3) m_strinfo="Emphasis : CCITT J.17"; m_ctlinfo.AddString(m_strinfo);*/ // all header info over..... calculating frame size. int iframesize=(144000*mp3bitrate/mp3frequency)+paddingbit; /*char framesize[5]; _itoa(iframesize,framesize,10); m_strinfo="Framesize : "; m_strinfo+=framesize; m_ctlinfo.AddString(m_strinfo);*/ fseek( file, 0, SEEK_END ); long filesize = ftell( file ); //no. of frames... int iframes=(filesize-firstheaderpos)/iframesize; /*char frames[10]; _itoa(iframes,frames,10); m_strinfo="Frames : "; m_strinfo+=frames; m_ctlinfo.AddString(m_strinfo);*/ //song length... int iplaytime=toupper(iframes*26/1000); /*char playtime[5]; _itoa(iplaytime,playtime,10); m_strinfo="Length (in sec) : "; m_strinfo+=playtime; m_ctlinfo.AddString(m_strinfo);*/ fclose( file ); return iplaytime; }
-
na gut auch eine variante.
aber die is auch in CMit Lame haettest du es in 3min suchen und progen gehabt.
Ein lehrer sagte mal:
Erfinde nichts, was es schon gibt,
verwende es nur, wenn du weist was es tut.Dies soll kein beleidigter Post sein.
Dein code ist sauber und gut.
Ich wollte nur eine anregung postenGg
-
rofl zeig mir mal nen beleidigten post
und das mit dem lame: geht das unter win und linux und habich dann nicht n weiss nicht wie viel grösseres file wegen der library?
bei der variante hier merkich eigentlich nichts.
-
Lame geht soweit ich weis auf:
BSD / Linux / Windows / Solaris / Mac / ...die Lib ist:
336 KBDu musst es ja nicht static compilen.
dann gibst du die seite als referenz an,
und jeder kann es sich selbst installieren.die DLL wird auf der seite auch direckt angeboten,
dann kannst du die dll nur beim zip/installer beilegen.
Und alles geht von selbst.Gg
-
wie gesagt...
viel zu gross!
und zu umständlich!würde ich dann wahrscheinlich nicht benutzen so ein plugin wo ich noch zusätliche dlls oder weiss ich was brrauche
-
Dann willst du naetuerlich auch den DIVX, X264,H.264 ect, alles neu
schreiben, wenn du was damit machst.Oder du benutzt natuerlich nie eine db schnit stelle,
sonder progst alles neu.Auch die libstdc++ schreibtst du von hand, und benutzt nicht
das "plugin" des systemes.Noch was, nicht Plugin sondern library, auch wenn du auf windows
bist.Wenn du mal wirklich was grosses in C++ machen willst,
wuerde ich dir deinen vorsatz nochmals ueberlegen.
ausser VLC und Mplayer benutzt "jeder" player lame.
Sogar WindowsMediaPlayer
(ich gehe jetzt bewusst nicht auf die com. mp3 lib!)Gg
-
Funktioniert dein Code auch mit MP3 mit variabler Bitrate? Ich vermute nicht.
-
vbr schrieb:
Funktioniert dein Code auch mit MP3 mit variabler Bitrate? Ich vermute nicht.
Da hast recht ^^ vbr welch ironie...
Als erstes mal, wenn du das rechnen neu erfinden willst ^^
Das sind alles ISO std. allso gibt es irgendwo eine
technische referenc. die nimmst du, und an hand desen
kannst du dein programm schreiben. googlen nach sourcecode bringt
es einfach nicht.Technische referenz (auf deutsch):
http://www.fh-jena.de/contrib/fb/et/personal/ansorg/mp3/mp3_2_res.htmInteressant:
http://de.wikipedia.org/wiki/Mp3
-
Noch was, nicht Plugin sondern library, auch wenn du auf windows
bist.doch plugin! ich programmiere ein plugin für cs:s, bzw. ich baue im moment einfach neue features ein.
und das mit der variable bitrate habich mich auch schon gefragt, bin nur noch nicht zum ausprobieren gekommen
deine links schauen interessant aus, aber ich hab grad keine zeit werds mir sonst mal anschauen.
aber habt ihr vlt noch einen vorschlag für vbr? sonst is auch wurst dann weisich einfach darauf hin...
-
-
hm jo so wie ich da lese müsste ich den header jedes frames auslesen um das auch für vbr mp3s hinzukriegen wat?
aber is mir jetzt grade wurst.