[Expertenrunde] Problem mit ID3_v3.4.au3 UDF

  • Hallo Zusammen,

    ich lese mir in einer for schleife bis array anzahl 0 mp3 Daten ein.
    Titel, Artisten, Alben.
    Diese lasse ich dann in eine Listview darstellen.
    Alles schick, nur scheint es ... als macht die ID3 (UDF zum auslesen/setzen von mp3 tags) bei einer großen Anzahl von mp3 Files,schlapp.

    Zitat

    C:\Program Files (x86)\AutoIt3\Include\ID3_v3.4.au3 (1136) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $ID3v2_RawDataBinary_Temp &= BinaryMid($ID3v2_RawDataBinary,7,$aIndex[1])
    $ID3v2_RawDataBinary_Temp &= BinaryMid($ID3v2_RawDataBinary,7,^ ERROR

    Das passiert bei ca 4000 mp3 Files. Nehme ich weniger mp3s. 3000 zb. funktioniert es wunderbar.
    Aber sobald ich "alle" einlese. Crashed das Script mit der oben genannten Fehlermeldung.

    Weiß jemand warum? ICh bin nich so der UDF experte und bekomme das auch mit Sicherheit nich raus.
    Aber wenn ich nur eine bestimmte anzahl vom mp3s einlesen kann, ists dämlich bzw unnütz.

    Grüße

  • [autoit]


    Func _h_ID3v2Tag_RemoveUnsynchronisation()
    ;....
    Local $aIndex[1]
    $aIndex[0] = 0
    For $ibyte=1 To BinaryLen($ID3v2_RawDataBinary)-1
    If BinaryMid($ID3v2_RawDataBinary,$ibyte,1) == Binary("0xFF") Then
    If BinaryMid($ID3v2_RawDataBinary,$ibyte+1,1) == Binary("0x00") Then
    _ArrayAdd($aIndex,$ibyte)
    $aIndex[0] += 1
    EndIf
    EndIf
    Next
    ;~ _ArrayDisplay($aIndex)

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

    Local $ID3v2_RawDataBinary_Temp = BinaryMid($ID3v2_RawDataBinary,1,5)
    Local $bCurrentTagFlags = BinaryMid($ID3v2_RawDataBinary,6,1)
    $ID3v2_RawDataBinary_Temp &= Binary("0x" & Hex(BitAND(127, Dec(Hex($bCurrentTagFlags,2))),2)) ;Clear unsynchronisation flag in Tag header
    $ID3v2_RawDataBinary_Temp &= BinaryMid($ID3v2_RawDataBinary,7,$aIndex[1])
    Local $Start, $Length = $aIndex[1]
    For $ibyte = 1 To $aIndex[0]-1
    $ID3v2_RawDataBinary_Temp &= BinaryMid($ID3v2_RawDataBinary,$aIndex[$ibyte] + 2,$aIndex[$ibyte+1]-$aIndex[$ibyte]-1)
    Next
    $ID3v2_RawDataBinary_Temp &= BinaryMid($ID3v2_RawDataBinary,$aIndex[$aIndex[0]]+2)

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

    $ID3v2_RawDataBinary = $ID3v2_RawDataBinary_Temp

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

    EndFunc

    [/autoit]

    Der Fehler steckt wohl hier. Grund ist vermutlich eine nicht vorhandene Prüfung ob das Array überhaupt mit ArrayAdd vergrößert wurde oder nicht. Es wird einfach davon ausgegangen, dass das schon alles klappt.

    Einmal editiert, zuletzt von misterspeed (27. Juni 2013 um 18:11)

  • Es scheitert wohl eher an Dateien die nicht so sind wie von der UDF erwartet.
    Im Detail hab ich es mir nicht angesehen aber ich würde mal in Zeile 1132 der UDF ein paar Variablen ausgeben lassen
    (Am besten in ne Datei oder per Consolewrite())
    Es scheitert daran dass eine der beiden if's nie True ist (Zeile 1124 und 1125):

    [autoit]


    If BinaryMid($ID3v2_RawDataBinary,$ibyte,1) == Binary("0xFF") Then
    If BinaryMid($ID3v2_RawDataBinary,$ibyte+1,1) == Binary("0x00") Then

    [/autoit]


    Intressant wären vmtl.

    [autoit]


    $aIndex[0]
    $ibyte
    $ID3v2_RawDataBinary

    [/autoit]

    In der textdatei oder Console siehst du ja dann bei was genau er scheitert.

  • Ein schneller fix könnte auch so ausschaun, dann kommt es jedenfalls nicht mehr zum Absturz in besagter Funktion, allerdings evtl. in späteren Funktionen die erwarten, dass die Daten von dieser Funktion verändert wurden...

    [autoit]


    Local $aIndex[1]
    $aIndex[0] = 0
    For $ibyte=1 To BinaryLen($ID3v2_RawDataBinary)-1
    If BinaryMid($ID3v2_RawDataBinary,$ibyte,1) == Binary("0xFF") Then
    If BinaryMid($ID3v2_RawDataBinary,$ibyte+1,1) == Binary("0x00") Then
    _ArrayAdd($aIndex,$ibyte)
    $aIndex[0] += 1
    EndIf
    EndIf
    Next
    ;~ _ArrayDisplay($aIndex)
    if ubound($aIndex) < 2 then return -1

    [/autoit]
  • Es liegt nicht an der Anzahl der MP3-Dateien. Bei manchen MP3-Dateien gibt es immer Fehler, egal ob Du die in einer Stapelverarbeitung übergibst oder ob Du sie einzeln versuchst zu öffnen. Ich verwende mittlerweile eine andere UDF, die diesen Fehler nicht erzeugt, da die UDF nicht gerade ausgereift ist, um die ID3-Tags auszulesen...

    Falls Dir das helfen würde, sende ich Dir die UDF zu. Glaube, die hatte ich auch von Autoit.de ... ;)