1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • MP3-Sortierer (nur für den Privaten gebrauch! Teil 2)

    • Oscar
    • 23. April 2010 um 09:45

    Ich habe mal schnell so ein Skript geschrieben. :)
    Es wird zuerst versucht, den Interpreten aus den ID3-Tags auszulesen und wenn das nicht klappt, dann aus dem Dateinamen (wichtig ist dabei diese Struktur: "Interpret - Titel").

    Spoiler anzeigen
    [autoit]


    #include <File.au3>

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

    $sMP3Folder = FileSelectFolder('MP3-Verzeichnis (Quelle) auswählen', '', 3)
    If Not FileExists($sMP3Folder) Then Exit MsgBox(0, 'Fehler!', 'Kein Quellverzeichnis ausgewählt!')

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

    $sDestFolder = FileSelectFolder('Ziel-Verzeichnis auswählen (Unterverzeichnisse werden erstellt)', '', 3)
    If Not FileExists($sDestFolder) Then Exit MsgBox(0, 'Fehler!', 'Kein Zielverzeichnis ausgewählt!')

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

    $aMP3Files = _FileListToArray($sMP3Folder, '*.mp3', 1) ; alle MP3s einlesen (nicht rekursiv)
    If @error Then Exit MsgBox(0, 'Fehler!', 'Keine MP3-Dateien gefunden!')

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

    If StringRight($sMP3Folder, 1) <> '\' Then $sMP3Folder &= '\'
    If StringRight($sDestFolder, 1) <> '\' Then $sDestFolder &= '\'
    Dim $aID3
    For $i = 1 To $aMP3Files[0]
    $aID3 = _ReadID3Tag($sMP3Folder & $aMP3Files[$i]) ; ID3-Tags auslesen
    If @error Then
    ConsoleWrite('Die Datei "' & $sMP3Folder & $aMP3Files[$i] & '" verursachte Fehler-Nr. ' & @error & @CR)
    Else
    ; wenn im ID3-Tag der Interpret nicht eingetragen ist, dann aus dem Dateinamen auslesen (" - " als Trenner zwischen Interpret und Titel)
    If $aID3[1][1] = '' Then $aID3[1][1] = StringRegExpReplace($aMP3Files[$i], '(.+) - .+', '$1')
    ToolTip('Kopiere "' & $aMP3Files[$i] & '" nach: "' & $sDestFolder & $aID3[1][1] & '\')
    $iRet = FileMove($sMP3Folder & $aMP3Files[$i], $sDestFolder & $aID3[1][1] & '\', 8)
    If Not $iRet Then ConsoleWrite('Die Datei "' & $sMP3Folder & $aMP3Files[$i] & '" konnte nicht verschoben werden!' & @CR)
    EndIf
    Next
    ToolTip('')

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

    ;===============================================================================
    ; Function Name: _ReadID3Tag($sPath)
    ; Description:: gibt ein Array mit den Daten aus den ID3-Tags zurück
    ; unterstützt werden die ID3-Tag-Versionen 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 = 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) + ('0x' & Hex(FileRead($hFile, 1), 2))
    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)
    For $x = 1 To BinaryLen($tmp)
    If BinaryMid($tmp, $x, 1) <> 0x00 Then $aID3[$i][1] &= BinaryToString(BinaryMid($tmp, $x, 1))
    Next
    EndIf
    Next
    EndIf
    $sData = Binary(FileRead($hFile, 4)) ; 1. MP3-Frameheader auslesen
    EndIf
    EndIf
    $sMP3FrameHeader = '0x' & Hex($sData)
    If Hex(BitAND($sMP3FrameHeader, 0xFFE00000), 8) <> 'FFE00000' Then Return SetError(3, 0, 0) ; keine MP3-Datei, dann Return
    $iMP3Version = BitShift(BitAND($sMP3FrameHeader, 0x180000), 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) * 8) / ($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

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

    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

    [/autoit]
  • Error Logging mit AutoIT

    • Oscar
    • 22. April 2010 um 15:17

    Wenn die zu testenden Programme (Fehler-) Ausgaben in die Console vornehmen, könntest Du diese auch mit StdoutRead bzw. StderrRead (siehe Beispiele in der Hilfedatei) auslesen.

  • video codec für avi auslesen

    • Oscar
    • 21. April 2010 um 22:22

    So, hier jetzt eine Funktion, die brauchbarere Informationen ausgibt. Unter anderem auch den Codec sowie Informationen über den Codec.
    Dafür wird außer dem Script noch die Datei "AVI-Codecs.txt" im Scriptverzeichnis benötigt. Das Script sowie die Textdatei befinden sich im ZIP-Archiv (Anhang).

    Dateien

    _AVIGetInfo.zip 13,95 kB – 376 Downloads
  • Editfeld mit Zahlen am rand

    • Oscar
    • 21. April 2010 um 18:57

    Ich würde mal behaupten, dass es sich dabei um ein Listview handelt. :)

  • Text aus einer text datei auslesen und als popup ausgeben

    • Oscar
    • 21. April 2010 um 18:13

    Möchtest Du uns das andere Script mal zeigen?
    Irgendwie hört sich das so an, als hättest Du dafür ein Riesen-Script!? :rolleyes:

  • InputBox Error

    • Oscar
    • 21. April 2010 um 18:09

    So:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Einloggen", 311, 108, 192, 124)
    $Label1 = GUICtrlCreateLabel("Moderator/en:", 8, 16, 72, 17)
    $Label2 = GUICtrlCreateLabel("Passwort:", 8, 40, 50, 17)
    $Input1 = GUICtrlCreateInput("", 88, 16, 217, 21)
    $Input2 = GUICtrlCreateInput("", 88, 40, 217, 21)
    $Button1 = GUICtrlCreateButton("Einloggen", 224, 64, 81, 25, $WS_GROUP)
    $Progress1 = GUICtrlCreateProgress(0, 88, 310, 17)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    _logon()
    EndSwitch
    WEnd

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

    Func _logon()
    If GUICtrlRead($Input1) = "JoNi" Then
    GUICtrlSetData($Progress1, 50)
    Else
    MsgBox(16,"Fehler!","Benutzername falsch!")
    EndIf
    If GUICtrlRead($Input2) = "12345678" Then
    GUICtrlSetData($Progress1, 100)
    MsgBox(0,"","Eingeloggt!")
    Else
    MsgBox(16,"","Passwort falsch!")
    EndIf
    EndFunc

    [/autoit]
  • InputBox Error

    • Oscar
    • 21. April 2010 um 18:05

    Du musst den Input mit GUICtrlRead auslesen.

  • Text aus einer text datei auslesen und als popup ausgeben

    • Oscar
    • 21. April 2010 um 17:37
    Zitat von nitoben

    Ich hab ein Script geschrieben, dass in einer textdatei schreibt ob eine USB festplatte angeschlossen ist oder nicht. ( Festplatte ist aktiv, Festplatte ist inaktiv)
    Jetzt möchte ich dass der Text ausgelesen wird und am besten auf einem anderen pc bildschirm als popup ausgegeben wird wenn der text: Festplatte ist inaktiv in der Textdatei steht.

    Also mich wundert etwas, wie Du das Ganze angehst. Du hast ein Script, das prüft, ob eine USB-Festplatte angeschlossen ist oder nicht und das schreibt diesen Status in eine Logdatei.
    Wozu brauchst Du jetzt noch ein zweites Script, was diese Logdatei ständig wieder auslesen muss, um zu prüfen, ob die Platte angeschlossen ist oder nicht?
    Warum erledigt das nicht ein einziges Script?

  • Variablennamen

    • Oscar
    • 20. April 2010 um 20:07

    Für AutoIt wären die UDF-Standards wohl am wichtigsten.

  • Mehrere checkboxen auslesen und inhal auflisten

    • Oscar
    • 20. April 2010 um 19:07

    Wenn Du WinClose verwendest, musst Du den WindowTitel angeben (der ist "Form1", nicht "Form2").

    GuiDelete ohne Parameter schließt die zuletzt benutze Gui. Bei Dir geht das aber nicht, weil Du die Funktion vorher mit Return verläßt (GuiDelete wird nie ausgeführt).

  • Hilfe Windows 7

    • Oscar
    • 20. April 2010 um 18:41

    Windows hat oftmals nur so Standardtreiber, die nicht alle Auflösungen/Bildwiederholfrequenzen der Monitore unterstützen.
    Ist das ein Markengerät?
    Wenn ja, schau mal auf der Herstellerseite nach einem passenden Treiber für den Monitor.
    Ansonsten einfach mal mit der Typenbezeichnung googeln. Meist findet man da schon was passendes.

  • Hilfe Windows 7

    • Oscar
    • 20. April 2010 um 18:35
    Zitat von DeepRed92

    Liegt das daran, dass mein Monitor (Röhre) nur 1024x768 Pixel unterstützt?

    Äh, ein Röhrenmonitor, der nur 1024x768 unterstützt? Ist das ein 14 Zöller?
    Wo gibt's denn noch solch antiken Kram? :D

  • Mehrere checkboxen auslesen und inhal auflisten

    • Oscar
    • 20. April 2010 um 18:17

    ControlGetText ist das Zauberwort. :)

    Ich hab's mal schnell geschrieben:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $Form2 = GUICreate("Form1", 419, 453, 342, 178)
    Dim $ahCheckbox[15]
    For $i = 0 To UBound($ahCheckbox) - 1
    $ahCheckbox[$i] = GUICtrlCreateCheckbox(Chr(65 + $i), 16, 20 + $i * 24, 385, 17)
    Next
    $Button2 = GUICtrlCreateButton("OK", 32, 392, 65, 33, $WS_GROUP)
    GUISetState(@SW_SHOW)
    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button2
    $sOutput = ''
    For $i = 0 To UBound($ahCheckbox) - 1
    If BitAND(GUICtrlRead($ahCheckbox[$i]), $GUI_CHECKED) Then $sOutput &= ControlGetText($Form2, '', $ahCheckbox[$i]) & ','
    Next
    MsgBox(0, 'Ausgabe', $sOutput)
    EndSwitch
    WEnd

    [/autoit]
  • video codec für avi auslesen

    • Oscar
    • 20. April 2010 um 15:29

    Es hatte mich gerade mal interessiert, deshalb habe ich eine kleine Funktion geschrieben:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <FileConstants.au3>
    #include <WinAPI.au3>

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

    $aHeader = _GetAviHeaderInfo('f:\test.avi')
    If @error Then
    ConsoleWrite('Error= ' & @error & @CR)
    Else
    _ArrayDisplay($aHeader)
    EndIf

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

    Func _GetAviHeaderInfo($sFilename)
    Local $hFile, $tBuffer
    Local $aHeader[14][2] = [['time delay between frames in microseconds', ''], _
    ['data rate of AVI data', ''],['padding multiple size, typically 2048', ''], _
    ['parameter flags', ''],['number of video frames', ''], _
    ['number of preview frames', ''],['number of data streams (1 or 2)', ''], _
    ['suggested playback buffer size in bytes', ''],['width of video image in pixels', ''], _
    ['height of video image in pixels', ''],['time scale, typically 30', ''], _
    ['data rate (frame rate = data rate / time scale)', ''], _
    ['starting time, typically 0', ''],['size of AVI data chunk in time scale units', '']]
    If Not FileExists($sFilename) Then Return SetError(1, 0, 0)
    $hFile = FileOpen($sFilename, 16)
    If $hFile = -1 Then Return SetError(2, 0, 0)
    FileSetPos($hFile, 32, $FILE_BEGIN)
    For $i = 0 To 13
    $tBuffer = FileRead($hFile, 4)
    $aHeader[$i][1] = Dec(Hex(_WinAPI_HiWord($tBuffer), 4) & Hex(_WinAPI_LoWord($tBuffer), 4))
    Next
    FileClose($hFile)
    Return $aHeader
    EndFunc ;==>_GetAviHeaderInfo

    [/autoit]


    Ab Offset 32 stehen aber vor allem statistische Werte (Anzahl der Frames, Zeit zwischen zwei Frames, horizontale und vertikale Auflösung, usw.)
    Bei vielen meiner AVIs sind manche Werte auch mit Null belegt?! ?(

  • Figur Mit Pfeiltasten steuern

    • Oscar
    • 20. April 2010 um 15:05

    Die Pfeiltasten kannst Du mit _IsPressed abfragen. Das GDI+ Objekt musst Du dann entsprechend der geänderten Position neuzeichnen.

  • Bitte auf verschiedenen Systemen testen und anpassen -->_GuiCtrlListView_MarkItem

    • Oscar
    • 20. April 2010 um 14:39

    Die Ecken sind jetzt richtig abgerundet. Aber die Markierung geht jetzt etwas über den Rand hinaus.
    Und wenn man den Slider bewegt wird die Markierung nicht mit refresht (siehe Screenshot):
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
    Die Funktion an sich finde ich aber schon sehr praktisch und könnte sie gut gebrauchen. :thumbup:

    Bilder

    • screenshot.png
      • 15,19 kB
      • 257 × 310
  • Bitte auf verschiedenen Systemen testen und anpassen -->_GuiCtrlListView_MarkItem

    • Oscar
    • 19. April 2010 um 22:05

    Windows 7 Home Premium (64 Bit).

    In der linken, oberen Ecke fehlt etwas:
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Bilder

    • screenshot.png
      • 13,73 kB
      • 266 × 313
  • Obscufator

    • Oscar
    • 19. April 2010 um 14:51

    Ok, so sind wir wieder einer Meinung. :)

  • Obscufator

    • Oscar
    • 19. April 2010 um 11:37
    Zitat von SEuBo

    Mal ganz abgesehen davon, dass der Source für deinen Obfuscator offen zugänglich ist, und es damit jedem, der den Thread hier gelesen hat, möglich ist, die einzelnen Schritte des Verschleierns nachzuvollziehen und ein entsprechendes Programm zu schreiben, um diese Maßnahmen rückgängig zu machen.

    Wie gesagt, beim Rest stimme ich Dir zu, aber das hier stimmt nicht, denn meine Random-Massnahmen kann man nicht rückgängig machen.
    Du kannst den Variablen und Funktionen vielleicht andere Namen geben, aber die ursprünglichen Namen sind futsch. Die lassen sich aus den Zufallswerten nicht wiederherstellen.

  • Aufnahme mit _BASS_Record

    • Oscar
    • 19. April 2010 um 08:50

    Du musst doch nicht alle 500ms die MonitorInfos auslesen. Es reicht, wenn Du das einmal bei Skriptstart machst und die Infos in ein globales Array speicherst.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™