Fichier son énorme

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Fichier son énorme

Message par Thyphoon »

Bonjour,

J'aimerais utiliser un gros fichier son pour les voix off de mon jeu et eviter de devoir le charger en mémoire. Il fait 600Mo en Wav et 100Mo en MP3 je vais peut être passer en ogg d'ailleur. Y a t'il une astuce pour lire en direct to disc d'un point a un autre ?
exemple:

Play(Files.s, From.s,To.s)

ce qui donnerait Play("VoiceFr.xx","00:10:12","00:11:00")

Toutes idées,pistes, ou solution est la bienvenu !

Merci
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui ! en utilisant la commande qui lit un film !!
tous types de film (ou même de média) peut être diffusé à partir de cette bibliothèque: AVI, MPG, DivX, Mp3 etc..

PlayMovie(#Film, FenetreID)

puis MovieSeek(#Film, Trame)
avec TRame tu regle le depart sur le film et donc la bande son !! :D

PAR CONTRE !!!

cela t'oblige a cree un AVI sans image !!
car certaines fonction ne marche qu'avec un "Vrais film"
comme la fonction MovieLength(#Film)

mais ce film peut etre un Divx , (donc avec la bande son en mp3) !!
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci Dobro !
j'y avais un peu pensé a Playmovie() mais le problème c'est que ça ne marche pas pour Linux et que transformer un fichier son en film sans image c'est un peu du bidouillage... :P

Si je charge en mémoire qu'une partie du gros fichier...exemple
de tel adresse a tel adresse et que j'utilise catchsound est ce que ça peut fonctionner ? ou bien faut-il obligatoire une entête au fichier. Si c'est le cas ou puis-je trouver comment faire une entête de fichier ogg et/ou wav ?
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

voici ce que je voudrais essayer de faire mais ça ne marche pas...Si quelqu'un a une idée ...
j'ai trouvé des infos sur le Header d'un fichier ogg ici
http://en.wikipedia.org/wiki/Ogg

Code : Tout sélectionner

InitSound()
UseOGGSoundDecoder()

Procedure LoadSnd(Sound.l,Files.s,Start.l,Length.l)
  *MemoryID = AllocateMemory(Length)
  If ReadFile(0,"zic.ogg") And *MemoryID
    ;Lecture de l'entête
    For z=0 To 27
      PokeB(*MemoryID+z,ReadByte(0)) 
    Next
    ;Lecture du Morceau
    FileSeek(0,Start+27)
    For z=0 To Length
      PokeB(*MemoryID+z,ReadByte(0)) 
    Next
    CloseFile(0)
  EndIf
  Debug CatchSound(Sound,*MemoryID,Length)
EndProcedure
LoadSnd(0,"zic.ogg",50,1000)
PlaySound(0,1)
Delay(5000)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

salut typhoon,
en fait ce que tu cherches à faire, çà s'appelle du 'direct to disc'.
je m'y étais déjà essayé il y a longtemps avec l'API windows.
çà m'étonnerais que j'ai encore les sources :?

à priori la lib 'ovLib' de traumatic est plus adaptée pour çà avec notamment la commande
Result.l = ovOpenMem( MemoryLocation.l, Size.l )

mais à mon avis il faut récréer l'entete (chunks) ogg vorbis en mémoire pour qu'à chaque itération le player ogg sache comment interpréter la zone de datas qui suit (la musique).
Cette zone de data devrait par ailleurs etre de la taille de la mémoire tampon utilisé pour la lecture en direct to disc.

http://files.connection-refused.org/ovL ... b-0.26.zip
http://www.purebasic.fr/english/viewtop ... hlight=ogg
Image
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Tu as ce code sur codearchiv (entre autres!)

Code : Tout sélectionner

; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=2786&highlight=
; Author: GPI
; Date: 09. November 2003

;Info: MCI-MP3-Commands 
Enumeration 0 
  #MP3_Unknown 
  #MP3_Stopped 
  #MP3_Playing 
  #MP3_Paused 
EndEnumeration 
Procedure MP3_GetStatus(Nb) 
  Result=#MP3_Unknown 
  a$=Space(#MAX_PATH) 
  i=mciSendString_("status MP3_"+Str(Nb)+" mode",@a$,#MAX_PATH,0) 
  If i=0 
    Debug a$ 
    Select a$ 
      Case "stopped":Result=#MP3_Stopped 
      Case "playing":Result=#MP3_Playing 
      Case "paused":Result=#MP3_Paused 
    EndSelect 
  EndIf 
  ProcedureReturn Result 
EndProcedure 
Procedure MP3_Load(Nb,file.s) 
  ;i=mciSendString_("open Sequencer!"+Chr(34)+file+Chr(34)+" alias mid"+Str(Nb),0,0,0) 
  i=mciSendString_("OPEN "+Chr(34)+file+Chr(34)+" Type MPEGVIDEO ALIAS MP3_"+Str(Nb),0,0,0) 
  If i=0 
    ProcedureReturn #True 
  Else 
    ProcedureReturn #False 
  EndIf 
EndProcedure 
Procedure MP3_Play(Nb) 
  i=mciSendString_("play MP3_"+Str(Nb),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_PlayStart(Nb) 
  i=mciSendString_("play MP3_"+Str(Nb)+" from "+Str(0),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_PlayPart(Nb,Start,endPos) 
  i=mciSendString_("play MP3_"+Str(Nb)+" from "+Str(Start)+" to "+Str(endPos),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_Pause(Nb) 
  i=mciSendString_("pause MP3_"+Str(Nb),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_Resume(Nb) 
  i=mciSendString_("resume MP3_"+Str(Nb),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_Stop(Nb) 
  i=mciSendString_("stop MP3_"+Str(Nb),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_Free(Nb) 
  i=mciSendString_("close MP3_"+Str(Nb),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_SetVolume(Nb,volume) 
  i=mciSendString_("SetAudio MP3_"+Str(Nb)+" volume to "+Str(volume),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_GetVolume(Nb) 
  a$=Space(#MAX_PATH) 
  i=mciSendString_("status MP3_"+Str(Nb)+" volume",@a$,#MAX_PATH,0) 
  ProcedureReturn Val(a$) 
EndProcedure 


Procedure MP3_SetSpeed(Nb,Tempo) 
  i=mciSendString_("set MP3_"+Str(Nb)+" Speed "+Str(Tempo),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure MP3_GetSpeed(Nb) 
  a$=Space(#MAX_PATH) 
  i=mciSendString_("status MP3_"+Str(Nb)+" Speed",@a$,#MAX_PATH,0) 
  ProcedureReturn Val(a$) 
EndProcedure 
Procedure MP3_GetLength(Nb) 
  a$=Space(#MAX_PATH) 
  i=mciSendString_("status MP3_"+Str(Nb)+" length",@a$,#MAX_PATH,0) 
  ProcedureReturn Val(a$) 
EndProcedure 
Procedure MP3_GetPosition(Nb) 
  a$=Space(#MAX_PATH) 
  i=mciSendString_("status MP3_"+Str(Nb)+" position",@a$,#MAX_PATH,0) 
  ProcedureReturn Val(a$) 
EndProcedure 
Procedure MP3_Seek(Nb,pos) 
  i=mciSendString_("Seek MP3_"+Str(Nb)+" to "+Str(pos),0,0,0) 
  ProcedureReturn i 
EndProcedure 
Procedure.s MP3_TimeString(Time) 
  Time/1000 
  sek=Time%60:Time/60 
  min=Time%60:Time/60 
  ProcedureReturn RSet(Str(Time),2,"0")+":"+RSet(Str(min),2,"0")+":"+RSet(Str(sek),2,"0") 
EndProcedure 
;Example 

Enumeration 1 
  #gadget_File 
  #Gadget_VolumeTxt 
  #Gadget_Volume 
  #Gadget_SpeedTxt 
  #Gadget_Speed 
  #Gadget_PositionTxt 
  #Gadget_Position 
  #Gadget_Load 
  #Gadget_Play 
  #Gadget_Stop 
  #Gadget_Pause 
  #Gadget_Resume 
EndEnumeration 

Procedure SetVol(x) 
  SetGadgetText(#Gadget_VolumeTxt,"Volume:"+Str(x)) 
  SetGadgetState(#Gadget_Volume,x) 
EndProcedure 
Procedure SetSpeed(x) 
  SetGadgetText(#Gadget_SpeedTxt,"Speed:"+Str(x)) 
  SetGadgetState(#Gadget_Speed,x) 
EndProcedure 
Procedure SetPosition(x,max) 
  SetGadgetText(#Gadget_PositionTxt,"Position:"+MP3_TimeString(x)+" : "+MP3_TimeString(max)) 
  If max>0 
    SetGadgetState(#Gadget_Position,x*1000/max) 
  Else 
    SetGadgetState(#Gadget_Position,0) 
  EndIf 
EndProcedure 

If OpenWindow(0, 100, 200, 310,310 , "Simple MP3-Player",#PB_Window_SystemMenu |#PB_Window_ScreenCentered) 
  If CreateGadgetList(WindowID(0)) 
    top=5 
    TextGadget    (#gadget_File       ,5,top,300,20,"File:"):top+25 
    TextGadget    (#Gadget_VolumeTxt,  5,top,300,20,"Volume"):top+20 
    TrackBarGadget(#Gadget_Volume     ,5,top,300,25,0,100):top+30 
    TextGadget    (#Gadget_SpeedTxt   ,5,top,300,20,"Speed"):top+20 
    TrackBarGadget(#Gadget_Speed      ,5,top,300,25,0,200):top+30 
    TextGadget    (#Gadget_PositionTxt,5,top,300,20,"Position"):top+20 
    TrackBarGadget(#Gadget_Position   ,5,top,300,25,0,1000):top+30 
    ButtonGadget  (#Gadget_Load       ,5,top,300,20,"Load"):top+25 
    ButtonGadget  (#Gadget_Play       ,5,top,300,20,"Play"):top+25 
    ButtonGadget  (#Gadget_Pause      ,5,top,300,20,"Pause"):top+25 
    ButtonGadget  (#Gadget_Resume     ,5,top,300,20,"Resume"):top+25 
    ButtonGadget  (#Gadget_Stop       ,5,top,300,20,"Stop"):top+25 
    loaded=#False 
    Quit=#False 
    
    Repeat 
      EventID.l = WindowEvent() 

      Select EventID 
        Case 0 
          If loaded And max>0 
            x=MP3_GetPosition(1) 
            If GetGadgetState(#Gadget_Position)<>x*1000/max 
              SetPosition(x,max) 
            EndIf 
          EndIf 
          Delay(100) 
        Case #PB_Event_CloseWindow ; If the user has pressed on the close button 
          Quit=#True 
        Case #PB_Event_Gadget 
          Select EventGadget() 
            Case #Gadget_Load 
              File$=OpenFileRequester("","","Media (Wave,MP3,OGG)|*.wav;*.ogg;*.mp3|Wave|*.wav|mp3|*.mp3|OGG|*.OGG|ALL|*.*",0) 
              If File$<>"" 
                If loaded 
                  MP3_Free(1) 
                  loaded=#False 
                EndIf 
                If MP3_Load(1,File$) 
                  max=MP3_GetLength(1) 
                  SetVol(MP3_GetVolume(1)/10) 
                  SetSpeed(MP3_GetSpeed(1)/10) 
                  SetPosition(0,max) 
                  loaded=#True 
                  SetGadgetText(#gadget_File,"File:"+File$) 
                Else 
                  SetGadgetText(#gadget_File,"File") 
                EndIf 
              EndIf 
            Case #Gadget_Resume 
              If loaded 
                MP3_Resume(1) 
              EndIf 
            Case #Gadget_Pause 
              If loaded 
                MP3_Pause(1) 
              EndIf 
            Case #Gadget_Play 
              If loaded 
                MP3_Play(1) 
              EndIf 
            Case #Gadget_Stop 
              If loaded 
                MP3_Stop(1) 
              EndIf 
            Case #Gadget_Position 
              If loaded And max>0 
                x=GetGadgetState(#Gadget_Position)*max/1000 
                SetPosition(x,max) 
                MP3_Seek(1,x) 
                MP3_Resume(1) 
              EndIf 
            Case #Gadget_Volume 
              If loaded 
                x=GetGadgetState(#Gadget_Volume) 
                SetVol(x) 
                MP3_SetVolume(1,x*10) 
              EndIf 
            Case #Gadget_Speed 
              If loaded 
                x=GetGadgetState(#Gadget_Speed) 
                SetSpeed(x) 
                MP3_SetSpeed(1,x*10) 
              EndIf 
          EndSelect 
      EndSelect 
      
    Until Quit 
    If loaded 
      MP3_Stop(1) 
      MP3_Free(1) 
    EndIf 
  EndIf 
EndIf 

End
; ExecutableFormat=Windows
; EnableXP
; EOF
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message par Thyphoon »

Merci beaucoup a tous... :o) Avec tout ça je devrais reussir a fair quelques choses ! Merci
Répondre