connaitre la durée d'un mp3
Publié : lun. 18/janv./2010 2:35
voila comme kcc cherchait a savoir et qu'encore une fois il cherchait a faire les choses simplement 
bref je me suis penché un peu sur le format mp3 et sa structure et j'ai crée une procédure qui permet de connaitre la durée en hr:min:sec d'un mp3 ...
peut être que je tenterais une version plus propre (la c'est pas super niveau code) un de ces jours, mais la c'est tard je vais me coucher :p
j'ai testé avec quelque mp3 , ca fonctionne reste plus qu'a trouver les cas particuliers ou ca plante

bref je me suis penché un peu sur le format mp3 et sa structure et j'ai crée une procédure qui permet de connaitre la durée en hr:min:sec d'un mp3 ...
peut être que je tenterais une version plus propre (la c'est pas super niveau code) un de ces jours, mais la c'est tard je vais me coucher :p
j'ai testé avec quelque mp3 , ca fonctionne reste plus qu'a trouver les cas particuliers ou ca plante

Code : Tout sélectionner
Declare.s mp3length(file.s)
chk$=OpenFileRequester("choisissez un fichier mp3","","*.mp3",1)
Debug mp3length(chk$)
Procedure.s mp3length(file.s)
rd=ReadFile(#PB_Any,file) ;ouverture du fichier
If rd ; ouvert correctement
Repeat ;lecture du fichier
retry:
head.s
b1=ReadByte(rd) ; lecture des 4 premiers octets du fichier
b2=ReadByte(rd) ;
b3=ReadByte(rd) ;
b4=ReadByte(rd) ;
; transformation en chaine de caractere binaire sur 32 bit
head = RSet(Bin(b1&$ff),8,"0")
head = head + RSet(Bin(b2&$ff),8,"0")
head = head + RSet(Bin(b3&$ff),8,"0")
head = head + RSet(Bin(b4&$ff),8,"0")
If Mid(head,1,11)="11111111111" ; ;"frame sync ??? "
firstsync=1
; quelle version de mpeg ?
Select Mid(head,12,2)
Case "00"
v=25 ; "mpeg 2.5"
Case "01" ;"reserved"
Case "10"
v=2 ; mpeg 2
Case "11"
v=1 ; mpeg 1
EndSelect
;
;
; quel layer
Select Mid(head,14,2)
Case "00" ; "reserved"
Case "01"
l=3 ;layer 3"
Case "10"
l=2;layer 2"
Case "11"
l=1;"layer 1"
EndSelect
;
;
;protegé par un CRC ?
Select Mid(head,16,1)
Case "0"
crc=0; "protected by crc"
Case "1"
crc=1; "no crc protected"
EndSelect
;
;
;
;debug "bitrate"
bitrate=0
If l=1 ; LAYER 1
Select Mid(head,17,4)
Case "0000"
;debug "vbr"
Case "0001"
bitrate=32
Case "0010"
bitrate=64
Case "0011"
bitrate=96
Case "0100"
bitrate=128
Case "0101"
bitrate=160
Case "0110"
bitrate=192
Case "0111"
bitrate=224
Case "1000"
bitrate=256
Case "1001"
bitrate=288
Case "1010"
bitrate=320
Case "1011"
bitrate=352
Case "1100"
bitrate=384
Case "1101"
bitrate=416
Case "1110"
bitrate=448
Case "1111"
;debug "bad"
EndSelect
EndIf
If l=2 ; LAYER 2
Select Mid(head,17,4)
Case "0000"
;debug "vbr"
Case "0001"
bitrate=32
Case "0010"
bitrate=48
Case "0011"
bitrate=56
Case "0100"
bitrate=64
Case "0101"
bitrate=80
Case "0110"
bitrate=96
Case "0111"
bitrate=112
Case "1000"
bitrate=128
Case "1001"
bitrate=160
Case "1010"
bitrate=192
Case "1011"
bitrate=224
Case "1100"
bitrate=256
Case "1101"
bitrate=320
Case "1110"
bitrate=384
Case "1111"
;debug "bad"
EndSelect
EndIf
If l=3 ;LAYER 3
Select Mid(head,17,4)
Case "0000"
;debug "vbr"
Case "0001"
bitrate=32
Case "0010"
bitrate=40
Case "0011"
bitrate=48
Case "0100"
bitrate=56
Case "0101"
bitrate=64
Case "0110"
bitrate=80
Case "0111"
bitrate=96
Case "1000"
bitrate=112
Case "1001"
bitrate=128
Case "1010"
bitrate=160
Case "1011"
bitrate=192
Case "1100"
bitrate=224
Case "1101"
bitrate=256
Case "1110"
bitrate=320
Case "1111"
;debug "bad"
EndSelect
;Debug bitrate
EndIf
;frequence d'echantillonage
freq=0
If v=1
Select Mid(head,21,2)
Case "00"
freq=44100
Case "01"
freq=48000
Case "10"
freq=32000
Case "11"
;debug "reserved"
EndSelect
EndIf
If v=2
Select Mid(head,21,2)
Case "00"
freq=22050
Case "01"
freq=24000
Case "10"
freq=16000
Case "11"
;debug "reserved"
EndSelect
EndIf
If v=25
Select Mid(head,21,2)
Case "00"
freq=11025
Case "01"
freq=12000
Case "10"
freq=8000
Case "11"
;debug "reserved"
EndSelect
EndIf
; padding byte ?
Select Mid(head,23,1)
Case "0"
padded=0; "not padded"
Case "1"; "padded"
padded=1
EndSelect
Select Mid(head,25,2)
Case "00"
;debug "stereo"
Case "01"
;debug "joint stereo"
Case "10"
;debug "dual channel"
Case "11"
;debug "mono"
EndSelect
Select Mid(head,27,2)
Case "00"
;debug "intensity stereo off: ms stereo off"
Case "01"
;debug "intensity stereo off: ms stereo off"
Case "10"
;debug "intensity stereo off: ms stereo on"
Case "11"
;debug "intensity stereo off: ms stereo on"
EndSelect
Select Mid(head,29,1)
Case "0"
;debug "audio not copyrighted"
Case "1"
;debug "audio copyrighted"
EndSelect
Select Mid(head,30,1)
Case "0"
;debug "copy of original media"
Case "1"
;debug "original media"
EndSelect
Select Mid(head,31,2)
Case "00"
;debug "none"
Case "01"
;debug "50/15 ms"
Case "10"
;debug "reserved"
Case "11"
;debug "ccit j.17"
EndSelect
Else
If firstsync=1
Break
Else
FileSeek(rd,Loc(rd)-3)
Goto retry
EndIf
EndIf
framesize=((144*(bitrate*1000))/freq)+padded
totalsec.f=totalsec+(((framesize*8)/1000)/bitrate)
;Debug totalsec
FileSeek(rd,Loc(rd)+(framesize-4))
ForEver
EndIf
CloseFile(rd)
total=Int(totalsec)
hour=(total/3600)
total=(total-(hour*3600))
min=Int(total/60)
sec=total-(min*60)
ProcedureReturn(RSet(Str(hour),2,"0")+":"+RSet(Str(min),2,"0")+":"+RSet(Str(sec),2,"0"))
EndProcedure