Hallo zusammen,
ich brauch mal eure Hilfe!
Ich such eine einfache Möglichkeit mp3-Tags aus zu lesen.
Die ID3_v3.4.au3 funktioniert nicht bzw. gibt keine Tags aus. Siehe Anhang (zum Testen)
Kennt einer noch eine Alternative??
Gruß
MrB
Hallo zusammen,
ich brauch mal eure Hilfe!
Ich such eine einfache Möglichkeit mp3-Tags aus zu lesen.
Die ID3_v3.4.au3 funktioniert nicht bzw. gibt keine Tags aus. Siehe Anhang (zum Testen)
Kennt einer noch eine Alternative??
Gruß
MrB
Forensuche mal bemüht?
Memory allocating-error beim Id3 tag in ein Array schreiben
Eigentlich schon!
Der Link von dir beschreibt ja nicht mein Problem.
Ich bekomme ja nicht einen Fehler, sondern es werden einfach nur leere Felder ausgegeben bzw. @extended ist 0 welches bedeutet " Keine Tags gefunden"
Beispiel:
#include <ID3_v3.4.au3>
#include <FileConstants.au3>
$File = FileOpenDialog("Auswahl", "", "Musik (*.mp3)")
If not @error And $File <> "" Then
$tag = _ID3ReadTag($File)
;Return Werte für @extended
;0 -> No Tags Found
;1 -> ID3v1 Found
;2 -> ID3v2 Found
;4 -> APEv2 Found
MsgBox(0, @extended & " - " & @error, $tag)
ClipPut($tag)
Else
MsgBox(0, "Achtung", "ungültige Auswahl")
EndIf
Alles anzeigen
So bekomm ich immer @extended=0 und @error=0
Glaub mitlerweile das ich da was falsch mache.
Oscars UDF funktioniert einwandfrei....
#include <Array.au3>
#include <FileConstants.au3>
$File = FileOpenDialog("Auswahl", "", "Musik (*.mp3)")
[/autoit] [autoit][/autoit] [autoit]If not @error And $File <> "" Then
$tag = _Readid3Tag($File)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $tag = ' & $tag & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
_arraydisplay($tag)
EndIf
;===============================================================================
; Function Name: _ReadID3Tag($sPath)
; Description:: gibt ein Array mit den Daten aus den ID3-Tags zurück
; unterstützt werden die ID3-Tag-Versionen 1.0, 1.1, 2.3 und 2.4
; bei v2.4 müssen sich die ID3-Tags am Anfang der Datei befinden
; Parameter(s): $sPath = Pfad zu einer MP3-Datei
; Requirement(s): min. AutoIt v3.3.0.0
; Return Value(s): bei Erfolg: Array mit den ID3-Tagdaten (@error = 0)
; im Fehlerfall bekommt @error:
; 1 = Datei existiert nicht
; 2 = Datei konnte nicht zum lesen geöffnet werden
; 3 = falsche ID3 v2 Version
; 4 = Datei ist keine MP3-Datei
; Author(s): Oscar (http://www.autoit.de)
;===============================================================================
Func _ReadID3Tag($sPath)
If Not FileExists($sPath) Then Return SetError(1, 0, 0)
Local $hFile, $sData, $sID3Header, $iID3HeaderSize = 0, $iOffset, $iSize, $tmp
Local $aID3v2Tags[8] = ['TIT2', 'TPE1', 'TALB', 'TYER', 'TLEN', 'TRCK', 'TCON', 'TENC']
Local $aID3[11][2] = [ _
['Title', ''],['Artist', ''],['Album', ''],['Year', ''], _
['Length', '0'],['Track', ''],['Genre', ''],['Encoder', ''], _
['MPEG-Version', ''],['Bitrate', ''],['Sample-Freq.', '']]
Local $aMP3Version[4] = ['MPEG2.5', 'Reserved', 'MPEG2', 'MPEG1']
Local $aMP3Layer[4] = ['Reserved', 'Layer III', 'Layer II', 'Layer I']
Local $aMP3Bitrate[5][16] = [ _
[000, 032, 064, 096, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 000], _
[000, 032, 048, 056, 064, 080, 096, 112, 128, 160, 192, 224, 256, 320, 384, 000], _
[000, 032, 040, 048, 056, 064, 080, 096, 112, 128, 160, 192, 224, 256, 320, 000], _
[000, 032, 048, 056, 064, 080, 096, 112, 128, 144, 160, 176, 192, 224, 256, 000], _
[000, 008, 016, 024, 032, 040, 048, 056, 064, 080, 096, 112, 128, 144, 160, 000]]
Local $aSampleFreq[3][4] = [[44100, 48000, 32000, 0],[22050, 24000, 16000, 0],[11025, 12000, 8000, 0]]
Local $sMP3FrameHeader, $iMP3Version, $sMP3Version, $sMP3Layer, $iMP3Bitrate, $iMP3SampleFreq
Local $iVBRFrames = -1, $iVBRFilesize, $iVBRFlags
$hFile = FileOpen($sPath, 16)
If $hFile = -1 Then Return SetError(2, 0, 0)
$sData = Binary(FileRead($hFile, 4))
If BinaryMid($sData, 1, 3) = '0x494433' Then ; ID3 v2.x Kennung gefunden
If (BinaryMid($sData, 4, 1) = '0x03') Or (BinaryMid($sData, 4, 1) = '0x04') Then ; nur v2.3 und 2.4
FileRead($hFile, 2) ; 2 Bytes überspringen
For $i = 0 To 3 ; berechne ID3-Headergröße (4 Bytes, jedoch nur jeweils die unteren 7 Bit)
$iID3HeaderSize = BitShift($iID3HeaderSize, -7) + BitAND(Binary(FileRead($hFile, 1)), 0x7F)
Next
If $iID3HeaderSize > 0 Then
$sID3Header = Binary(FileRead($hFile, $iID3HeaderSize)) ; lese gesamten ID3-Header
For $i = 0 To 7
$iOffset = StringInStr(BinaryToString($sID3Header), $aID3v2Tags[$i]) ; Offset zu dem ID3-Tag
If $iOffset > 0 Then
$iSize = Hex(BinaryMid($sID3Header, $iOffset + 4, 4)) ; Größe des ID3-Frames
$tmp = BinaryMid($sID3Header, $iOffset + 11, Dec($iSize) - 1)
If BinaryMid($tmp, 1, 2) = '0xFFFE' Then
For $x = 3 To BinaryLen($tmp) Step 2
$aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 2), 2)
Next
Else
For $x = 1 To BinaryLen($tmp)
$aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 1))
Next
EndIf
$aID3[$i][1] = StringReplace($aID3[$i][1], Chr(0), '')
EndIf
Next
EndIf
Do
$sData = String(FileRead($hFile, 1))
If @error Then ExitLoop
If BitAND($sData, 0xff) = 0xff Then
FileSetPos($hFile, -1, 1)
$sData = String(FileRead($hFile, 4))
EndIf
Until BitAND($sData, 0xFFE00000) = 0xFFE00000
Else
FileClose($hFile)
Return SetError(3, 0, 0)
EndIf
Else ; ID3 v1.x
$iOffset = FileGetPos($hFile)
FileSetPos($hFile, -128, 2)
$sID3Header = BinaryToString(FileRead($hFile, 3))
If $sID3Header = 'TAG' Then
$aID3[0][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[1][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[2][1] = StringReplace(BinaryToString(FileRead($hFile, 30)), Chr(0), '')
$aID3[3][1] = StringReplace(BinaryToString(FileRead($hFile, 4)), Chr(0), '')
EndIf
FileSetPos($hFile, $iOffset, 0)
EndIf
$sMP3FrameHeader = String($sData)
If BitAND($sMP3FrameHeader, 0xFFE00000) <> 0xFFE00000 Then
FileClose($hFile)
Return SetError(4, 0, 0) ; keine MP3-Datei, dann Return
EndIf
$iMP3Version = BitShift(BitXOR($sMP3FrameHeader, 0xFFE00000), 19) ; welche MP3-Version
$sMP3Version = $aMP3Version[$iMP3Version] ; in Textform
$sMP3Layer = $aMP3Layer[BitShift(BitAND($sMP3FrameHeader, 0x60000), 17)] ; welcher Layer
$aID3[8][1] = $sMP3Version & ' / ' & $sMP3Layer ; ins Ausgabe-Array
$iMP3Bitrate = BitShift(BitAND($sMP3FrameHeader, 0xF000), 12) ; Bitraten-Index auslesen
Switch $sMP3Version ; je nach MPEG-Version Bitrate aus der Tabelle holen
Case 'MPEG1'
$aID3[9][1] = $aMP3Bitrate[$iMP3Version - ($iMP3Version > 1)][$iMP3Bitrate]
Case 'MPEG2', 'MPEG2.5'
If $sMP3Layer = 'Layer I' Then
$aID3[9][1] = $aMP3Bitrate[3][$iMP3Bitrate]
Else
$aID3[9][1] = $aMP3Bitrate[4][$iMP3Bitrate]
EndIf
EndSwitch
$iMP3SampleFreq = BitShift(BitAND($sMP3FrameHeader, 0xC00), 10) ; Sample-Frequenz-Index auslesen
$aID3[10][1] = $aSampleFreq[2 - ($iMP3Version - ($iMP3Version > 1))][$iMP3SampleFreq] ; und Wert aus der Tabelle holen
Do ; evtl. Leerbytes überspringen
$tmp = FileRead($hFile, 1)
If @error Then ExitLoop
Until $tmp <> 0x00 Or @error
If $tmp = 0x58 And BinaryToString(FileRead($hFile, 3)) = 'ing' Then ; MP3 mit VBR (Xing-Header gefunden)?
$iVBRFlags = '0x' & Hex(FileRead($hFile, 4)) ; VBR-Flags auslesen
If BitAND($iVBRFlags, 0x3) Then ; wenn die Einträge vorhanden sind, dann...
$iVBRFrames = Dec(Hex(FileRead($hFile, 4))) ; Anzahl der VBR-Frames auslesen
$iVBRFilesize = Dec(Hex(FileRead($hFile, 4))) ; Dateigröße auslesen
$aID3[4][1] = $iVBRFrames * 1152 / $aID3[10][1] * 1000 ; VBR Laufzeit
$aID3[9][1] = 'VBR ~' & Int($iVBRFilesize * 8 / ($aID3[4][1] / 1000) / 1000) ; VBR durchschnittliche Bitrate
EndIf
Else
If $aID3[4][1] = 0 Then $aID3[4][1] = (FileGetSize($sPath) * / ($aID3[9][1] * 1000) * 1000 ; alternative CBR Laufzeit
$aID3[9][1] = 'CBR ' & $aID3[9][1]
EndIf
$aID3[4][1] = _MyTicksToTime($aID3[4][1]) ; Laufzeit (Ticks to hour:min:sec)
$aID3[9][1] &= ' kBit/s'
$aID3[10][1] &= ' Hz'
FileClose($hFile)
Return $aID3
EndFunc ;==>_ReadID3Tag
Func _MyTicksToTime($iTicks)
Local $iHour, $iMins, $iSecs
$iHour = Int($iTicks / 3600000)
$iTicks -= $iHour * 3600000
$iMins = Int($iTicks / 60000)
$iTicks -= $iMins * 60000
$iSecs = Int($iTicks / 1000)
Return StringFormat('%02i:%02i:%02i', $iHour, $iMins, $iSecs)
EndFunc ;==>_MyTicksToTime
Ok, du benutzt da zwar was anderes wie ich habe, aber das funktioniert wenigstens halbwegs. Wird zwar kaum was ausgegeben, aber wenigstens ein wenig.
Kannst mir bitte mal die komplette UDF geben?
Das ist die komplette UDF!
Wenn dort nichts ausgelesen werden kann, ist auch in der Datei nichts vorhanden bzw. ein anderes (neueres ? ) Format verwendet.
Wird zwar kaum was ausgegeben, aber wenigstens ein wenig.
Wie kommst du darauf, dass in den Dateien mehr Daten enthalten sind?
ZitatDas ist die komplette UDF!
OK, dachte es gibt so was ähnliches wie die ID3_v3.4.au3, also mehr Funktionen.
Sry, habe so adhoc keine Ahnung wie ich das Format raus bekomme.
Zitat
Wie kommst du darauf, dass in den Dateien mehr Daten enthalten sind?
Naja, mit Mediamonkey oder WinExplorer bekomm ich Titel und Interpret angezeigt.
OK, dachte es gibt so was ähnliches wie die ID3_v3.4.au3, also mehr Funktionen.
Habe eben den orginal Thread im am. Forum überflogen, dazu gibts wohl nichts weiter zu sagen...
Naja, mit Mediamonkey oder WinExplorer bekomm ich Titel und Interpret angezeigt.
Original Thread im am. Forum??? Jetzt bist du mir enteilt.
Hab gerade festgestellt, dass wenn ich die mp3 Files manuell neu tagge, danach alles funktioniert. komisch. Naja, lass ich halt mal einen Auto-Tagger drüber laufen und gut ist.
Dank Dir für deine Hilfe
Wer lesen kann, ist klar im Vorteil
UDF Description ..............: Reads/Writes ID3v1.1 ID3v2.3, ID3v2.4 and APEv2 Tags in MP3 files
UDF AutoIt Forum Link.........: http://www.autoitscript.com/forum/index.php?showtopic=43950&st=0
UDF AutoIt Version Required...: 23rd December, 2011 - v3.3.8.0 of AutoIt
FUNCTIONS LIST ...............:
Einfaches copy & paste ist eben nicht immer der Weisheit letzter Schluß!
uiiuiuiuiu, da kann ich dir leider nur recht geben! Werde versuchen mich zu bessern.
Trotzdem komm ich immer noch nicht klar.
ZitatOscars UDF funktioniert einwandfrei....
Das ist doch gar nicht aus der ID3_v3.4.au3 (siehe Post#1) oder bin ich blind??
Vergess alles, läuft. Benutzerfehler wie fast immer!
Vielen Dank nochmals