Problème d'accés memoire, pas tout le temps

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Problème d'accés memoire, pas tout le temps

Message par venom »

Bonjour,

voilà j'ai retrouvé une procédure qui permettait de récupérer la durée d'une vidéo ou d'un audio.
j'ai compiler pour essayé (uniquement sur des mp3), la procédure fonctionne mais pas avec tous les mp3 8O .
Donc j'ai du mal a comprendre pourquoi. Pensez vous que cela puisse venir de la version du mp3 ?

je vous poste la procédure, dites moi si chez vous ça fonctionne avec tous vos fichiers ? Merci.
Et si non avez vous une idée de l'erreur ?

Code : Tout sélectionner

Procedure Time(Filename$)
Structure MovieStruc
   Movie.IGraphBuilder
   MediaControl.IMediaControl
   MediaEvent.IMediaEventEx
   Window.IVideoWindow
   Audio.IBasicAudio
   Video.IBasicVideo
   MediaSeeking.IMediaSeeking
   State.l
EndStructure

If Filename$
   InitMovie()

   *movie.MovieStruc = LoadMovie(0,Filename$)
   *movie\MediaSeeking\GetDuration(@Duration.q)

   Millisecs = Duration / 10000   
   Duration / 10000000
   Hours = (Duration / 3600)
   Minutes = (Duration / 60) - (60 * Hours)
   Seconds = Duration - (60 * (Duration / 60))

   Hours$ = Str(Hours) : Minutes$ = Str(Minutes) : Seconds$ = Str(Seconds)

   If Seconds < 10 : Seconds$ = "0" + Seconds$ : EndIf
      If Minutes < 10 : Minutes$ = "0" + Minutes$ : EndIf
         If Hours   < 10 : Hours$   = "0" + Hours$   : EndIf

          MessageRequester("Durée", "La durée est de : "+ Hours$ + ":" + Minutes$ + ":" + Seconds$, 0)
EndIf 
EndProcedure

Filename$ = OpenFileRequester("",Filename$,"",0)
Time(Filename$)
Voici l'erreur renvoyé par le compilateur:
Accès mémoire invalide (erreur de lecture a l'adresse 24)
J’obtiens cette erreur a la ligne 17.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Problème d'accés memoire, pas tout le temps

Message par Backup »

et comme ça ?

Code : Tout sélectionner


Structure MovieStruc
	Movie.IGraphBuilder
	MediaControl.IMediaControl
	MediaEvent.IMediaEventEx
	Window.IVideoWindow
	Audio.IBasicAudio
	Video.IBasicVideo
	MediaSeeking.IMediaSeeking
	State.l
EndStructure

Declare  duree(Filename$)


Filename$ = OpenFileRequester("",Filename$,"",0)

duree(Filename$)

procedure duree(Filename$)
	
	If Filename$
		InitMovie()
		
		*movie.MovieStruc = LoadMovie(0,Filename$)
		*movie\MediaSeeking\GetDuration(@Duration.q)
		
		Millisecs = Duration / 10000   
		Duration / 10000000
		Hours = (Duration / 3600)
		Minutes = (Duration / 60) - (60 * Hours)
		Seconds = Duration - (60 * (Duration / 60))
		
		Hours$ = Str(Hours) : Minutes$ = Str(Minutes) : Seconds$ = Str(Seconds)
		
		If Seconds < 10 : Seconds$ = "0" + Seconds$ : EndIf
		If Minutes < 10 : Minutes$ = "0" + Minutes$ : EndIf
		If Hours   < 10 : Hours$   = "0" + Hours$   : EndIf
		
		Debug "Soundfile = " + Filename$
		Debug "Duration = " + Str(Millisecs) + " Ms"
		Debug "Time Format = " + Hours$ + ":" + Minutes$ + ":" + Seconds$ + " (H:M:S)"
	EndIf
	
EndProcedure; EPB
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par falsam »

Dobro ton code fonctionne, mais pas quand il est intégré dans une procédure recursive. J'ai des erreurs sur quelques mp3 (Toujours les memes). Mais quand j'utilise ta procédure pour ouvrir un seul fichier à la fois alors ça fonctionne.

Mon code :

Code : Tout sélectionner

Structure MovieStruc
   Movie.IGraphBuilder
   MediaControl.IMediaControl
   MediaEvent.IMediaEventEx
   Window.IVideoWindow
   Audio.IBasicAudio
   Video.IBasicVideo
   MediaSeeking.IMediaSeeking
   State.l
EndStructure
 
Global *movie.MovieStruc 

Global CountMp3.i

Procedure Time(Filename$)
  If Filename$
    ;InitMovie()

    *movie.MovieStruc = LoadMovie(0,Filename$)
    *movie\MediaSeeking\GetDuration(@Duration.q)

    Millisecs = Duration / 10000   
    Duration / 10000000
    Hours = (Duration / 3600)
    Minutes = (Duration / 60) - (60 * Hours)
    Seconds = Duration - (60 * (Duration / 60))

    Hours$ = Str(Hours) : Minutes$ = Str(Minutes) : Seconds$ = Str(Seconds)

    If Seconds < 10 : Seconds$ = "0" + Seconds$ : EndIf
    If Minutes < 10 : Minutes$ = "0" + Minutes$ : EndIf
    If Hours   < 10 : Hours$   = "0" + Hours$   : EndIf
    ;MessageRequester("Durée", "La durée est de : "+ Hours$ + ":" + Minutes$ + ":" + Seconds$, 0)  
    Debug "La durée de "+ Filename$ + " est de : "+ Hours$ + ":" + Minutes$ + ":" + Seconds$
  EndIf   
EndProcedure


Procedure.s ParseDirectory(folder.s, id.l = 0)
  
  If Right(folder, 1) <> "\"
    folder + "\"
  EndIf
  
  If ExamineDirectory(id, folder, "*.*")
    
    While NextDirectoryEntry(id)
      
      If DirectoryEntryName(id) <> "." And DirectoryEntryName(id) <> ".."
               
        Filename$ = folder + DirectoryEntryName(id)
        
        If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
          ParseDirectory(folder + DirectoryEntryName(id), id + 1)
        EndIf
        
        If GetExtensionPart(Filename$) = "mp3"
          CountMp3 +1
          Time(Filename$)
        EndIf

      EndIf
      
    Wend
    
    FinishDirectory(id)
    
  EndIf
  
EndProcedure 

InitMovie()
DireName$ = PathRequester("","")

If DireName$<>""
  ParseDirectory(DireName$)
EndIf

Time(Filename$)

Debug "Nombre de mp3 : " + Str(CountMp3)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par falsam »

Solution alternative en passant par l'api MCI (Media Control Interface)

Code : Tout sélectionner

Global CountMp3.i

Procedure MCI_Load(Nb, file.s)
  Protected i.l

  i=mciSendString_("OPEN "+Chr(34)+file+Chr(34)+" Type MPEGVIDEO ALIAS MCI_"+Str(Nb), 0, 0, 0)
  If i=0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure MCI_GetLength(Nb)
  Protected a$=Space(#MAX_PATH)
  Protected i.l

  i=mciSendString_("status MCI_"+Str(Nb)+" length", @a$, #MAX_PATH, 0)
  ProcedureReturn Val(a$)
EndProcedure

Procedure.s MCI_TimeString(Time)
  Protected sek.l, min.l

  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

Procedure MCI_Free(Nb)
  Protected i.l

  i=mciSendString_("close MCI_"+Str(Nb), 0, 0, 0)
  ProcedureReturn i
EndProcedure


Procedure Time(Filename$)
  If Filename$ <> ""
    MCI_Free(1)
    MCI_load(1, Filename$)
    Time=MCI_GetLength(1)
    Debug "La durée de "+ Filename$ + " est de : "+ MCI_TimeString(Time)  
  EndIf

EndProcedure


Procedure.s ParseDirectory(folder.s, id.l = 0)
  
  If Right(folder, 1) <> "\"
    folder + "\"
  EndIf
  
  If ExamineDirectory(id, folder, "*.*")
    
    While NextDirectoryEntry(id)
      
      If DirectoryEntryName(id) <> "." And DirectoryEntryName(id) <> ".."
               
        Filename$ = folder + DirectoryEntryName(id)
        
        If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
          ParseDirectory(folder + DirectoryEntryName(id), id + 1)
        EndIf
        
        If GetExtensionPart(Filename$) = "mp3"
          CountMp3 +1
          Time(Filename$)
        EndIf

      EndIf
      
    Wend
    
    FinishDirectory(id)
    
  EndIf
  
EndProcedure 

InitMovie()
DireName$ = PathRequester("","d:\musique\un soir")

If DireName$<>""
  ParseDirectory(DireName$)
EndIf

Time(Filename$)

Debug "Nombre de mp3 : " + Str(CountMp3)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par venom »

Test effectuer sur les mêmes mp3:

@Dobro
Hélas, toujours la même erreur avec les mêmes mp3 :oops:

@falsam
Ton premier code me renvoie aussi la même erreur. :oops:
En revanche, avec l'api MCI je n'ai plus d'erreur, mais les mp3 qui étaient en défaut, me renvoie 00:00:00 8O

Étrange ses phénomène non ? 8O De plus ça ne se fait pas sur tout mes mp3 mais quasiment. :?






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par falsam »

venom a écrit :Étrange ses phénomène non ? De plus ça ne se fait pas sur tout mes mp3 mais quasiment. :?
Je viens de voir ça avec un de mes mp3. Pure Basic n'aime pas ABBA :mrgreen:
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par venom »

Arf... j'avais cru trouvé la cause mais non. :( . J'ai cru que ça pouvait etre du au bitrate mais non.
falsam a écrit :Je viens de voir ça avec un de mes mp3. Pure Basic n'aime pas ABBA :mrgreen:
Il aime les Daft Punk c'est déjà ça :P




@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par falsam »

Je repris le code alternatif pour mettre le résultat de la lecture récursive des mp3 dans un ListIconGadget.

Cette Lecture s'effectue dans un thread de manière à commencer et même jouer un premier morceau sans attendre la fin de la lecture récursive des fichiers. C'est pratique en cas de gros dossier.

Pensez à bien sélectionner un item avant de lancer la lecture.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Mainform
  
  #Mp3
  
  #Mp3List
  
  #Mp3Load
  #Mp3Play
  
  #Mp3Balance
EndEnumeration

Global FileName.s
Global Mp3Folder.s

Define.l Event, WEvent, MEvent, GEvent, TEvent


Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered

Procedure.s MCI_GetDuration(Filename.s)
  Protected Time.q, Nb.i =1
  Protected a$=Space(#MAX_PATH)
  Protected sek.l, min.l
  
  mciSendString_("close MCI_"+Str(Nb), 0, 0, 0)
  mciSendString_("OPEN "+Chr(34)+FileName+Chr(34)+" Type MPEGVIDEO ALIAS MCI_"+Str(Nb), 0, 0, 0)
  mciSendString_("status MCI_"+Str(Nb)+" length", @a$, #MAX_PATH, 0)
  Time=Val(a$)
    
  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


Procedure.s ParseDirectory(folder.s, id.l = 0)
  
  If Right(folder, 1) <> "\"
    folder + "\"
  EndIf
  
  If ExamineDirectory(id, folder, "*.*")
    
    While NextDirectoryEntry(id)
      
      If DirectoryEntryName(id) <> "." And DirectoryEntryName(id) <> ".."
               
        Filename = folder + DirectoryEntryName(id)
        
        If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
          ParseDirectory(folder + DirectoryEntryName(id), id + 1)
        EndIf
        
        If GetExtensionPart(Filename) = "mp3"
          AddGadgetItem(#Mp3List,-1, FileName + Chr(10) +MCI_GetDuration(Filename))
        EndIf

      EndIf
      
    Wend
    
    FinishDirectory(id)
    
  EndIf
  
EndProcedure 

Procedure StartThread(*Value)
  ClearGadgetItems(#Mp3List)
  
  ParseDirectory(Mp3Folder)    
EndProcedure

;Selection du dossier à explorer
Procedure.s Mp3Load()
  Protected N.i
  
  ;Selection du dossier à explorer
  Mp3Folder = PathRequester("","d:\musique")
    
  ;On lance un Thread de maniere à ne pas attendre la fin de la lecture recursive
  ;Plus rapide à l'affichage en cas de gros dossier
  CreateThread(@StartThread(), 0) 
  
EndProcedure

;Fenetre de l'application
Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "MP3 Player", WindowStyle)   
  ListIconGadget(#Mp3List, 10, 50, 480, 280, "Titre", 380, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#Mp3List, 1, "Durée", 80)
  ButtonGadget(#Mp3Load, 10, 350, 80, 22, "Load")
  ButtonGadget(#Mp3Play, 100, 350, 80, 22, "Play")  
  TrackBarGadget(#Mp3Balance, 200, 350, 100, 20, 0, 100)
  SetGadgetState(#Mp3Balance, 70) ;Son à 70%

EndProcedure

Procedure Start()
  ;Initialisation application, police, etc ..
  InitMovie()
  
  Open_MainForm()
EndProcedure

start()

Repeat
  Event  = WaitWindowEvent(10)
  ;WEvent = EventWindow()
  ;MEvent = EventMenu()
  GEvent = EventGadget()
  ;TEvent = EventType()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
        Case #Mp3Load
          Mp3Load()
          
        Case #Mp3play
          If CountGadgetItems(#Mp3List)<>0
            LoadMovie(#Mp3, GetGadgetItemText(#Mp3List, GetGadgetState(#Mp3List)))
            MovieAudio(#Mp3, GetGadgetState(#Mp3Balance), 0) 
            PlayMovie(#Mp3, WindowID(#MainForm))
          EndIf
          
        Case #Mp3Balance
          If IsMovie(#Mp3) 
            MovieAudio(#Mp3, GetGadgetState(#Mp3Balance), 0)
          EndIf
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      If IsMovie(#Mp3) 
        StopMovie(#Mp3) 
        FreeMovie(#Mp3) 
      EndIf 

      End
  EndSelect
ForEver
Dernière modification par falsam le sam. 03/août/2013 22:36, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par venom »

Sympa ce code en effet un thread est plus approprier pour des grosses bibliothèques. 8)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par falsam »

venom a écrit :Sympa ce code en effet un thread est plus approprier pour des grosses bibliothèques. 8)
Merci Venom. ça permet aussi de ne pas voir l’écran se figer ou freezer.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par falsam »

Petite modification du code.
- Ajout du volume
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par venom »

falsam a écrit :Merci Venom. ça permet aussi de ne pas voir l’écran se figer ou freezer.
Aussi :D

Sympa la barre de volume.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par venom »

J'ai regarder un petit peut, en faite c'est le LoadMovie qui renvoie 0 comme si le fichier était introuvable :?

si je prend mon mp3 avec ce code :

Code : Tout sélectionner

InitMovie()
NomFichier$ = OpenFileRequester("", "", "mp3|*.mp3" , 0)
Debug NomFichier$
Resultat = LoadMovie(0, NomFichier$)
Debug "resultat du LoadMovie : "+Resultat
Le chemin du fichier est bon mais le résultat est de 0. Donc le format n'est pas pris en charge. Étrange.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par Ar-S »

Ton debug ne devrait pas appeler un str(resultat) plutôt ?
~~~~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
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Problème d'accés memoire, pas tout le temps

Message par venom »

Ar-S a écrit :Ton debug ne devrait pas appeler un str(resultat) plutôt ?
Le résultat reste le même.

J'ai ré encoder mon mp3 avec ffmpeg maintenant il fonctionne. c'est bien au niveau de l'encodage du mp3.

En revanche j'ai un autre album même avec ffmpeg qui encode sa ne veut rien savoir. :? :x





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre