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
Fichier son énorme
oui ! en utilisant la commande qui lit un film !!
PlayMovie(#Film, FenetreID)
puis MovieSeek(#Film, Trame)
avec TRame tu regle le depart sur le film et donc la bande son !!
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) !!
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 !!

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) !!
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...
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 ?
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...

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 ?
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
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)
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
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
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