Memory allocating-error beim Id3 tag in ein Array schreiben

  • Hey Leute,
    ich hab ein kleines Problem mit meinem Script:
    Es funktioniert super, doch leider bekomme ich nach einiger Zeit immer folgenden Error:
    [Blockierte Grafik: http://www.bilder-upload.eu/thumb/5d90c3-1334161402.png]

    hier das Script:

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    #include <ID3.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIListView.au3>
    #include <GuiToolbar.au3>
    #include <ListViewConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Func _LoadVars($flag)

    [/autoit] [autoit][/autoit] [autoit]

    Switch $flag
    Case 1
    Global $startfile = @ScriptDir & "\settings.cfg"
    Global $open = FileOpen($startfile)
    Global $option_1 = StringSplit(FileReadLine($open, 1), "=")
    Global $option_2 = StringSplit(FileReadLine($open, 2), "=")
    Global $path = StringTrimLeft($option_2[2], 1)
    Global $mp3_Files = 0
    Global $dir_Files = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;~------------------------------------------------GUI--------------------------------------------------------------------------~;
    Global $GUI = GUICreate("Sync!", 800, 500, 190, 120)

    [/autoit] [autoit][/autoit] [autoit]

    Global $listview1 = GUICtrlCreateListView("Titel|Name", 44, 100, 304, 320)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150)
    _GUICtrlListView_JustifyColumn(GUICtrlGetHandle($listview1), 0, 2)
    _GUICtrlListView_JustifyColumn(GUICtrlGetHandle($listview1), 1, 2)

    [/autoit] [autoit][/autoit] [autoit]

    Global $listview2 = GUICtrlCreateListView("Titel|Name", 374, 100, 304, 320)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150)
    _GUICtrlListView_JustifyColumn(GUICtrlGetHandle($listview2), 0, 2)
    _GUICtrlListView_JustifyColumn(GUICtrlGetHandle($listview2), 1, 2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $Button1 = GUICtrlCreateButton("", 12, 8, 30, 30, BitOR($BS_BITMAP, $BS_DEFPUSHBUTTON))
    GUICtrlSetImage(-1, "connect.bmp")
    Global $Button2 = GUICtrlCreateButton("", 44, 8, 30, 30, $WS_GROUP)
    Global $Button3 = GUICtrlCreateButton("", 76, 8, 30, 30, $WS_GROUP)
    Global $Button4 = GUICtrlCreateButton("", 108, 8, 30, 30, $WS_GROUP)
    Global $Button5 = GUICtrlCreateButton("", 140, 8, 30, 30, $WS_GROUP)
    Global $Button6 = GUICtrlCreateButton("", 172, 8, 30, 30, $WS_GROUP)
    ;Global $Pic1 = GUICtrlCreatePic("toolbar.BMP", 4, 4, 205, 37, $WS_CLIPSIBLINGS)
    ;~----------------------------------------------GUI-END------------------------------------------------------------------------~;

    [/autoit] [autoit][/autoit] [autoit]

    Case 2
    Global $option_1 = StringSplit(FileReadLine($open, 1), "=")
    Global $option_2 = StringSplit(FileReadLine($open, 2), "=")

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    EndFunc ;==>_LoadVars

    [/autoit] [autoit][/autoit] [autoit]

    Func _FirstRun()
    $drive = FileSelectFolder("Select your current music-dir!", @HomeDrive & "\Users\" & @UserName & "\", BitOR(1, 4))
    _FileWriteToLine($startfile, 2, "music-dir = " & $drive & "\", 1)
    _FileWriteToLine($startfile, 1, "first run = false", 1)
    EndFunc ;==>_FirstRun

    [/autoit] [autoit][/autoit] [autoit]

    _LoadVars(1)

    [/autoit] [autoit][/autoit] [autoit]

    If $option_1[2] = " true" Then _FirstRun()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case $Button1
    $files = _FileListToArray($path)

    [/autoit] [autoit][/autoit] [autoit]

    For $a = 1 To $files[0]
    If StringInStr($files[$a], ".mp3") Then
    $mp3_Files += 1
    Else
    $dir_Files += 1
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Local $tag[$mp3_Files + $dir_Files + 1]

    [/autoit] [autoit][/autoit] [autoit]

    For $b = 1 To $files[0]
    If Not StringInStr($files[$b], ".jpg") Or StringInStr($files[$b], ".jpeg") Then
    _ID3ReadTag($path & $files[$b])
    $tag[$b] = _ID3GetTagField("TIT2")
    If @error Then
    $tag[$b] = _ID3GetTagField("Title")
    If @error Then
    $tag[$b] = StringTrimRight($files[$b], 4)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndIf
    Next
    msgBox(0, "", "habe fertig!!! :D")
    For $c = 1 To (UBound($tag) + 1)
    _GUICtrlListView_AddItem($listview1, $tag[$c])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($open)
    Exit

    [/autoit]

    Das Script funktioniert, aber wie gesagt ich bekomme immer diesen error.
    Ich habe 8 GigaByte RAM, beim gesammten durchlauf des scriptes bis zum error beträgt die Maximalauslastung max. 22% :S

    es werden ca. 300 Lied-Dateien auf ihre Titel geprüft und anschliessend in die Listview eingefügt.
    Im Anhang die ID3.au3

    €: Der Error kommt genau nach der 220ten Datei, wenn ich sie lösche geht es :wacko:

    Ich hoffe ihr könnt mir helfen.
    Bekommt eigentlich noch irgendjemand anderes den Fehler?

    mfg Yellow

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

    3 Mal editiert, zuletzt von YellowWeedSeed (12. April 2012 um 23:19)

  • Hi,
    Das hat nichts mit dem ursprünglichen Problem zu tun, aber Die letzte Schleife ist falsch. Es muss (UBound($tag) - 1) lauten

  • stimmt :D
    aber ich komme ja leider nicht mal bis dorthin ;(

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

  • Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <File.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <ID3.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Func _LoadVars($flag)

    [/autoit] [autoit][/autoit] [autoit]

    Switch $flag
    Case 1
    Global $startfile = @ScriptDir & "\settings.cfg"
    Global $open = FileOpen($startfile)
    Global $option_1 = StringSplit(FileReadLine($open, 1), "=")
    Global $option_2 = StringSplit(FileReadLine($open, 2), "=")
    Global $path = StringTrimLeft($option_2[2], 1)
    Global $mp3_Files = 0
    Global $dir_Files = 0

    [/autoit] [autoit][/autoit] [autoit]

    ;~------------------------------------------------GUI--------------------------------------------------------------------------~;
    Global $GUI = GUICreate("Sync!", 800, 500, 190, 120)

    [/autoit] [autoit][/autoit] [autoit]

    Global $listview1 = GUICtrlCreateListView("Titel|Name", 44, 100, 304, 320)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150)
    _GUICtrlListView_JustifyColumn(GUICtrlGetHandle($listview1), 0, 2)
    _GUICtrlListView_JustifyColumn(GUICtrlGetHandle($listview1), 1, 2)

    [/autoit] [autoit][/autoit] [autoit]

    Global $listview2 = GUICtrlCreateListView("Titel|Name", 374, 100, 304, 320)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 150)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 150)
    _GUICtrlListView_JustifyColumn(GUICtrlGetHandle($listview2), 0, 2)
    _GUICtrlListView_JustifyColumn(GUICtrlGetHandle($listview2), 1, 2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $Button1 = GUICtrlCreateButton("", 12, 8, 30, 30, BitOR($BS_BITMAP, $BS_DEFPUSHBUTTON))
    GUICtrlSetImage(-1, "connect.bmp")
    Global $Button2 = GUICtrlCreateButton("", 44, 8, 30, 30, $WS_GROUP)
    Global $Button3 = GUICtrlCreateButton("", 76, 8, 30, 30, $WS_GROUP)
    Global $Button4 = GUICtrlCreateButton("", 108, 8, 30, 30, $WS_GROUP)
    Global $Button5 = GUICtrlCreateButton("", 140, 8, 30, 30, $WS_GROUP)
    Global $Button6 = GUICtrlCreateButton("", 172, 8, 30, 30, $WS_GROUP)
    ;Global $Pic1 = GUICtrlCreatePic("toolbar.BMP", 4, 4, 205, 37, $WS_CLIPSIBLINGS)
    ;~----------------------------------------------GUI-END------------------------------------------------------------------------~;

    [/autoit] [autoit][/autoit] [autoit]

    Case 2
    Global $option_1 = StringSplit(FileReadLine($open, 1), "=")
    Global $option_2 = StringSplit(FileReadLine($open, 2), "=")

    [/autoit] [autoit][/autoit] [autoit]

    EndSwitch
    EndFunc ;==>_LoadVars

    [/autoit] [autoit][/autoit] [autoit]

    Func _FirstRun()
    $drive = FileSelectFolder("Select your current music-dir!", @HomeDrive & "\Users\" & @UserName & "\", BitOR(1, 4))
    _FileWriteToLine($startfile, 2, "music-dir = " & $drive & "\", 1)
    _FileWriteToLine($startfile, 1, "first run = false", 1)
    EndFunc ;==>_FirstRun

    [/autoit] [autoit][/autoit] [autoit]

    _LoadVars(1)

    [/autoit] [autoit][/autoit] [autoit]

    If $option_1[2] = " true" Then _FirstRun()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    FileClose($open)
    Exit
    Case $Button1
    Local $aFiles = _FileListToArray($path,'*.mp3')
    _GetID3Tag($aFiles)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetID3Tag(ByRef $aFiles)
    Local $aFilesTags[UBound($aFiles)][2]
    For $i = 1 To UBound($aFiles)-1
    _ID3ReadTag($path & $aFiles[$i])
    $aFilesTags[$i][0] = _ID3GetTagField("TIT2")
    If @error Then ConsoleWrite("ERROR " & @ScriptLineNumber & "bei Funktion _ID3GetTagField('TIT2')"&@CRLF)
    $aFilesTags[$i][1] = _ID3GetTagField("Title")
    If @error Then ConsoleWrite("ERROR " & @ScriptLineNumber & "bei Funktion _ID3GetTagField('Title')"&@CRLF)
    _GUICtrlListView_AddItem($listview1,$aFilesTags[$i][1])
    If @error Then ConsoleWrite("ERROR " & @ScriptLineNumber & "beim hinzufügen eines LV Eintrages"&@CRLF)
    If Not @error Then ConsoleWrite("Titel Eingelesen Nr: "&$i&" ID3 Tags: "&$aFilesTags[$i][0] & " " & $aFilesTags[$i][1]&@CRLF)
    Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit]

    ist nicht getestet, hab keine Musik auf dem Rechner auf der Arbeit :D eventuell hilft es ja was

    Gruß Marvin

    • Offizieller Beitrag

    Lass Dir mal die MP3-Dateinamen in die Console ausgeben, dann siehst Du, bei welcher Datei der Fehler auftritt.
    Ich hatte nämlich mit der obigen UDF auch schon Probleme mit einigen MP3s, die total verkorkste ID3-Tags besaßen.

    Alternativ (wenn Du die ID3-Tags nur auslesen willst, nicht schreiben) könntest Du auch meine Funktion (Anhang) benutzen.

  • Wie benutze ich den deine udf? Ich komm damit nicht ganz klar.
    Ich möchte nur den Titel haben und so habe ich es probiert:

    Spoiler anzeigen
    [autoit]

    #include "ID3Tag.au3"

    [/autoit] [autoit][/autoit] [autoit]

    $file = @ScriptDir & "\Lied.mp3"
    $tag = _ReadID3Tag($file)

    [/autoit] [autoit][/autoit] [autoit]

    If @error Then
    ConsoleWrite(@error & @CRLF )
    Else
    ConsoleWrite($tag["Title"] & @CRLF )
    EndIf
    Exit

    [/autoit]

    mfg Yellow

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

    • Offizieller Beitrag

    Du bekommst ein 2D-Array zurück. In $array[0][1] befindet sich der Titel.
    Hier ein Beispielskript:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <ID3Tag.au3>
    Global $sPath, $iTimer, $aRet
    While True
    $sPath = FileOpenDialog('Select MP3-File', @ScriptDir, 'MP3-Files (*.mp3)', 3)
    If @error Then Exit
    $iTimer = TimerInit()
    $aRet = _ReadID3Tag($sPath)
    ConsoleWrite($sPath & @CR & 'Error = ' & @error & @CR & Round(TimerDiff($iTimer), 3) & ' msec.' & @CR & @CR)
    _ArrayDisplay($aRet)
    WEnd

    [/autoit]
  • und deine Udf ließt auch "verkorkste" ID Tags aus? ^^

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o

    • Offizieller Beitrag

    Was nicht da ist, lässt sich nicht auslesen. :D
    Die Funktion habe schon ich ausgiebig getestet (mehrere tausend MP3-Dateien), da ich sie in meinem Musik-Quiz benutze. Sie produziert jedenfalls keinen Absturz und bis jetzt habe ich noch keine MP3-Datei gefunden, bei der sie Probleme hätte.
    Solltest Du bei Dir eine Datei finden, so wäre ich Dir dankbar für einen Hinweis.

  • ich hab meine Funktion auch so eingestellt das wenn nichts da ist der Dateiname verwendet wird^^
    ich werd`s mal testen

    §1 Ich kann nicht für meine scripts inhaftiert werden, auch wenn bereits 3 Menschen erblindeten an den Folgen der Korrekturlesung.  8o