Länge eines mp3s auslesen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Hops

Betreff: Länge eines mp3s auslesen

BeitragDi, Sep 11, 2007 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Morgen...
also:
ich bin dabei ein "audio-abspielprogramm" (ich vermeide hier den begriff DJ-software^^)zu verbrechen, doch nund steh ich vor dem (wie mir scheint) vorerst einzigen problem dabei:
man muss nicht spulen können (falls dass dann eh nur noch ein kleiner schritt sein sollte, dann nätürlich schon), weil das programm nur für eigene zwecke eingesetzt wird, aber die länge der mp3 dateien müsste ich auslesen, um die übergänge zu gestalten...
da das programm wirklich nur einfach sein sollte, habe ich bis jetzt aus faulheit auf die bass.dll (is das die??)
verzichtet, aber nun sehe ich fast keine andere möglichkeit... oder?
und wie kompliziert/umschreibaufwädig wird die einbindung?
läuft dann das ganze abspielen über die bass.dll?
danke schon mal im vorraus!!
mfg
achja:
noch eine andere frage nebenbei:
eignen sich (bei blitzplus!) die "trees" auch für die darstellung der gesamten festplatten ordner oder dauert das zu lange?
danke
hops
 

sdjh

BeitragDi, Sep 11, 2007 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieso eigendlich "morgen"?

Also auslesen von Mp3s: schau mal auf http://www.wotsit.org/list.asp...tton=GO%21. Du musst die einzelnen Frames der Datei auslesen und zusammenaddieren. Vielleicht hat es schon jemand gemacht. Ich kann dir morgen (wenn ich es nicht vergesse [am besten mal 'ne Mail schicken]) den Source posten. Vllt aber schafft es jemand anderes vorher.

BlitzBass ist eigendlich sehr einfach gehalten und da die Ausgabequelität deutlich besser ist, emfehle ich dir das wärmstens. Schreibe einfach die Function PlayMusic(), PauseChannel(), StopChannel() etc mit BlitzBass neu und du kannst den gesamten Quelltext weiternutzen (ohne Gewähr, versteht sich =)).

Und Die gesamte Festplatte würde ich niemals in einem auslesen. Fange die Auswahl des Nutzers ab und lese dann das gewähle Verzeichnis aus. Die ganze Festplatte in einem zu scannen kann dich möglicherweise mehrere Minuten dauern.

Hoffe das hilft erstmal. Und hoffe, du kannst bis morgen warten Wink.
 

sdjh

BeitragDi, Sep 11, 2007 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Du Glückskeks du!

Habe zufälligerweise den Code auch auf meinem zweiten Rechner gefunden. Dafür krieg ich aber ein großes Dankeschön, okeh?

Code: [AUSKLAPPEN]
Print milli2min(getmp3laenge("blahblahblah.mp3"))
Input
End

Function milli2min$(i)
t=i/1000
t2=t*1000
m2$=Str(i-t2)

If Len(m2$)=2 Then m2$="0"+m2$
If Len(m2$)=1 Then m2$="00"+m2$

mt=t/60
t2=mt*60
m$=Str(mt)
s$=Str(t-t2)

If Len(s$)=1Then s$="0"+s$

Return m$+":"+s$+"."+m2$
End Function

Function getmp3laenge(f$)
   vbr=0
   f1=ReadFile(f$)
   x=0
   p=0
   start=0
   
   Repeat
   b=ReadByte(f1)
   If b=255
      b=ReadByte(f1)
      c=b And 224
      If c=224
         error=0
         
         d=b And 24
         d=d Shr 3
         If d=0Then version=3
         If d=1Then error=1
         If d=2Then version=2
         If d=3Then version=1
         
         
         d=b And 6
         d=d Shr 1
         If d=0Then error=1
         If d=1Then layer=3
         If d=2Then layer=2
         If d=3Then layer=1
   
   
         b=ReadByte(f1)
         
         d=b Shr 4
         bitrate=0
         If version=1
            If layer=3
               If d=0 Then bitrate=-1
               If d=1 Then bitrate=32
               If d=2 Then bitrate=40
               If d=3 Then bitrate=48
               If d=4 Then bitrate=56
               If d=5 Then bitrate=64
               If d=6 Then bitrate=80
               If d=7 Then bitrate=96
               If d=8 Then bitrate=112
               If d=9 Then bitrate=128
               If d=10 Then bitrate=160
               If d=11 Then bitrate=192
               If d=12 Then bitrate=224
               If d=13 Then bitrate=256
               If d=14 Then bitrate=320
               If d=15 Then bitrate=-1
            EndIf
         EndIf
         
         d=b And 12
         d=d Shr 2
         If version=1
            If d=0Then frequenz=44100
            If d=1Then frequenz=48000
            If d=2Then frequenz=32000
         EndIf
         
         d=b And 2
         d=d Shr 1
         padding=d
         
         If bitrate<=0 Or error=1
            x=x-1
         Else
            If x=0 Then start=FilePos(f1)-3
            totbit=totbit+bitrate
            SeekFile(f1,FilePos(f1)-8+(bitrate*1000*144/frequenz+padding))
         EndIf
         
         x=x+1
      EndIf
   EndIf
   
   Until Eof(f1)
   CloseFile(f1)
   vbr=totbit/x
   Return (FileSize(f$)-start)*8/vbr
End Function


Ich habe die Funktion bereits seit einigen Monaten in Benutzung und bin noch nie auf irgendwelche seltsamen Ergebnisse gekommen. Es ist nur ratsam, da die Funktion völlig exakt und deshalb langsam ist, die errechnete Länge zu speichern anstatt sie bei jedem Programmstart neu zu berechnen.
 

Hops

BeitragMi, Sep 12, 2007 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
geeeilheit pur!! Laughing

das gibt neuen schwung^^
dachte nich, dass das geht, und dann gleich mit beispiel dazu!
jetzt bekommste auch dein dickes DANKESCHÖN! Very Happy
jaa, wegen blitzbass, ich denk ma, ich werd dass früher oder später einbauen...
aber erstma sich da sein zeug zusammenzufinden in den 100ten threads ohne sinn Rolling Eyes
naja, ich such ma...
bis denne

hops


edit:
boah.. sry, aber bei bass steig ich grad ganich durch, gibt soo viele threads mit iwelchen verwirrenden besipielen, die allemiteinander nicht funktionieren da (schätze ich) die version 2.3 nicht mehr abwärtskompatibel is... naja... wie auch immer...
 

sdjh

BeitragMi, Sep 12, 2007 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Mir fällt noch ein: Brauchst du auch die Längenberechnung für WAVs? Wenn wir schon dabei sind.

Zu BlitzBass:
Eigendlich machst du in etwa folgendes:

Code: [AUSKLAPPEN]
function playmusic(path$)
BASS_end()
BASS_clear()
BASS_Play(path$)
end function


die Funktionen von BASS heißen sicherlich anders, aber der Sinn ist hoffentlich klar: Channel beenden, RAM aufräumen und neuen Stream abspielen. Wenn die Funktion einmal funktioniert, dann ist's genauso einfach zu benutzen, wie die Blitz-Funktionen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group