Durée d'un OGG

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Durée d'un OGG

Message par Ar-S »

Salut à tous,

Je suis en train de me faire un avertisseur d'anniversaires, lorsque l'alerte se mettra en route, une fenêtre et un son se mettront en marche.
Je ne vois pas comment choper la durée d'un morceau ogg avec les fonctions natives de PB, j'aimerai ne pas avoir à utilise de lib externe car je n'ai besoin que de jouer 2 sons ogg.

Pour le moment je me débrouille avec un delay (dureedumorceau) puis je stop mais l'utilisateur aura la possibilité de mettre un fichier de son choix (ogg ou wav) pour être prévenu. De plus delay va me bloquer la fenetre le temps de la lecture mais le soucis c'est surtout comment trouver la durée du morceau !

Avec la fonction recherche je précise que j'ai trouvé moult infos.. mais pas ça..

Voilà le code actuel traitant le son :

Code : Tout sélectionner

;Gestion du son

InitSound()
UseOGGSoundDecoder()

sonAn$="an.ogg" ; durée  :  7754
duree=7754

Procedure JoueSon(IDfichierSon,FichierSon$,volume)
  If LoadSound(IDfichierSon, FichierSon$)
    SoundVolume(IDfichierSon, volume) ; volume entre 0 et 100
    PlaySound(IDfichierSon)
  Else
    MessageRequester("Erreur","Impossible de charger le fichier son : "+FichierSon$)
  EndIf
EndProcedure

Procedure StopSon(IDfichierSon)
  StopSound(IDfichierSon)
  FreeSound(IDfichierSon)
EndProcedure

JoueSon(0,sonAn$,85)
Delay(duree)
StopSon(0)
End
Et voià le fichier son employé (je me suis amusé à faire un effet vieillot pour l'annonce) : FICHIER SON ICI (enregistrer la cible sous) :P

D'avance merci.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Durée d'un OGG

Message par Progi1984 »

La seule solution va être d'utiliser une lib externe !

Car j'ai cherché dans la doc ou dans les APIs par défaut (SDL compris) et j'ai rien trouvé.
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Re: Durée d'un OGG

Message par KarLKoX »

Code : Tout sélectionner

#SAMPLE_RATE = 44100
#BPS = 16
#NCH = 2

; taille = 9700631 bytes
; durée  =  550 secondes (soit 9 min 10 sec)
sonAn$="G:\Musics\7.ogg" 

Macro CONVERT_bytes_to_ms(bytes)
  Round( MulDiv_(bytes, 1000, #SAMPLE_RATE * (#BPS >> 3) * #NCH), 1)
EndMacro

Macro CONVERT_ms_to_bytes(ms)
  MulDiv_(ms, #SAMPLE_RATE, 1000) * (#BPS >> 3) * #NCH
EndMacro

Macro CONVERT_bytes_to_time(bytes)
  bytes / (#SAMPLE_RATE * (#BPS >> 3) * #NCH)
EndMacro

Macro CONVERT_samples_to_ms(samples)
  1000 * samples / #SAMPLE_RATE
EndMacro

Macro CONVERT_ms_to_samples(ms, total_ms, total_samples)
  ms / total_ms * total_samples
EndMacro

Procedure.s Format(chaine.s, caractere.s, padding.b)

  dummy = (padding +1) - Len(chaine) 
  For i = 1 To dummy
    tmp$ + caractere
  Next i

  ProcedureReturn tmp$ + chaine  

EndProcedure

Procedure.s SecondsToTime(m_Secondes.l)

    minutes = m_Secondes / 60
    secondes = m_secondes - minutes * 60
    m_secondsToTime$ = Format(Str(minutes), "0", 1) + ":" + Format(Str(secondes), "0", 1)
    
    ProcedureReturn m_secondsToTime$
    
EndProcedure

file_size = FileSize(sonAn$)
If file_size > 0
  sec.l = CONVERT_bytes_to_ms(file_size) / 100
  ; retourne 9 min 10 sec, cependant,
  ; pour un résultat proche, il faudrait que tu check s'il y a un tag,
  ; que tu vérifies son format (ape, idtag v1/v2 etc ...)
  ; tu calcules sa taille que tu soustrais à la taille initiale
  ; Enfin, pour un résultat parfait, il faudrait que tu soustrais la taille
  ; des différents headers ogg et vorbis (cf spec)
  Debug SecondsToTime(sec)   
EndIf
"Qui baise trop bouffe un poil." P. Desproges
Répondre