mp3-Dateien mit "Zufall" neu sortieren

  • Hallo liebe AutoIt-Gemeinde,

    ich wende mich heute an euch, da ich mit meinem Latein am Ende bin und ich hoffe Ihr könnt mir helfen.

    Vo ca. 4 Wochen hab ich mir einen Vibrationslautsprecher von ADIN zugelegt. Das ist für den Preis ein ganz tolles Teil mit einem guten Funktionsumfang. Spielt Musik von einer Femdquelle, von Radio und von micrSD. Und hier fängt mein Problem an. Das Gerät kann Karten bis 4GB lesen. Das sind also so ca. 1000 bis 1200 Titel. Eine Funktion, die das Gerät nicht hat ist die zufällige Reihenfolge der Titel. Alles kein Problem - sortiere ich die Dateien ebend selber mit Autoit. Da der Datenbestand auf der Karte nur temporär ist kann ich den beliebig veränder. D.h. der Dateiname, wie der ID3TAG ist nicht relevat - Hauptsache gemischt. Im momentan Zustand kommt dann irgendwann 10x ACAC und dann 8x ABBA und irgendwann 9c die BeeGees am Stück. Das ist natürlich doof...

    Ich habe nun in den letzten 4 Wochen folgende Varianten in mein Script gehämmert:

    1. einfaches Umbenennen der Dateien in das Muster "001 bis 897". -> Erfolg = 0, alle Dateien werden im Muster A bis Z abgespielt !

    2. Mittels der hier verfügbaren ID3_v3.4.au3 den ID3TAG-V1 gändert und meine ZufallsDaten da eingetragen (vor den Namen des Interpreten eine Zufallszahl eingefügt). Der Dateiname blieb unverändert. Erfolg = 0, alle Dateien werden.....

    3. ID3TAG's in der Version 2.4 (letzte Version) ist mit der UDF noch nicht möglich, da der Programierer seine Arbeit eingestellt hat. Kann ich nachvollziehen ... das ist sehr aufwendig, da sich der ID3TAG ständig ändert. Also Zurückrudern und Dateien nach dem Muster "001 bis XXX" umbenenen und ID3TAG V1 mit neuen Daten füllen. Scriptechnisch ist das alles kein Problem... nur der Erfolg im Gerät =0, alle Dateien....

    4. Eine DOS-Software gesucht, die die Version 2 des ID3TAG schreiben kann. Script umgestellt; Dateinamen belassen, alle TAGs gelöscht und nur V2 mit TrackNr neu geschrieben -> Erfolg=0! Später dann Dateinanen und TAG geändert ... was glaubt Ihr -> Erfolg =0 !!!

    Die hier beschriebenen Varianten sind nur ein Bruchteil dessen, was ich versucht habe. Das Gerät ließ sich nicht von der Variante "ich spiele von A bis Z ab" abbringen.

    Ich habe alle Veränderunden an den Dateien mit WinAmp und dem MS Mediaplayer geprüft -> die Veränderungen an der Datei war wirksam.

    Nun meine eigentlich Frage!
    Weiß Einer von Euch wie in so einem micrSD-Modul die Sortierung der Dateien erfolgt bzw. auf welche Daten da zugegriffen wird? Am Endstand meiner Versuche hab ich alle Kopfdaten gelöscht und diese dann neu geschrieben und dennoch spielt das Gerät alle Titel von A nach Z ab. Ich bin am Ende .... ;(

    HILFE !!!

    Wenn Du's eilig hast - geh langsam...

    Einmal editiert, zuletzt von De Rand Ere (11. Januar 2014 um 12:31)

  • Wie? Auf deiner SD Karte befinden sich MP3 Dateien, die keine Rückschlüsse auf den Titel/Interpreten/Album in sich tragen (weder im Dateinamen, weil der z.B. aus einer Nummer besteht, noch in den ID3 Tags) und trotzdem spielt das Gerät die Musikstücke alphabetisch nach dem Interpreten geordnet ab?

    • Offizieller Beitrag

    Hast Du die Änderungen jeweils auf der SD-Karte vorgenommen?
    Wenn ja, hat das evtl. mit dem vorherigen kopieren zu tun. Ich hatte mal ein Autoradio (mit SD-Schacht), das hat die Dateien immer in der Reihenfolge abgespielt, wie sie auf die Karte kopiert wurden (egal welcher Dateiname oder ID3-Tag).
    Auch wenn man später die Dateien umbenannt hat, wurden sie trotzdem in der Kopier-Reihenfolge abgespielt. Das einzige was geholfen hat: Die Dateien am Rechner vorsortieren (Dateinamen entsprechend benennen), die Karte formatieren und dann die Dateien so auf die Karte kopieren.
    Vielleicht hilft das... :S

  • @Cheater Dieter

    Ja, in meiner "Radikalkur" hab ich alle Daten gelöscht, die ich konnte und dann neu geschrieben. Den Erfolg hab ich schon beschrieben....


    Oscar

    Ich hab mir extra noch zwei neue Karten gekauft. Kein Erfolg ! Vorher hab ich es mit Formatieren der Karte versucht. Was soll ich sagen.... kein Erfolg.
    Am Zeitpunkt der Dateierstellung kann es auch nicht liegen, da ich zwei Datenfelder aufbaue. Das eine mit dem Dateinamen und das andere mit 1 bis X. Das Zweite lasse ich dann "Schütteln" (mehrfach) und dann ordne ich dem Eintrag im 1. Feld die Nummer aus dem 2. zu .... und ich merke grade, daß ich das erste Feld (Dateinamen) von A nach Z durcharbeite !!! Das muß ich noch mal durchdenken ... das ist ein Ansatz.... Mein Script kopiert übrigends vom Originalbestand über das TEMP (zur Dateimanipulation) direkt auf die Karte.

    erst mal Danke für die Anregung... werd das Pferd mal von hinten aufzäumen.... ^^

    Wenn Du's eilig hast - geh langsam...

  • Oscar

    Danke Oscar, das war die richtige Anregung. Der Zeitstempel der Datei ist das Kriterium zum Sortieren. Ich war der Meinung, daß der Zeitstempel beim Kopieren neu gesetzt wird. Scheinbar nicht bzw. war das Script so aufgebaut, daß von A nach Z abgearbeitet wurde. Beim händischen Kopieren einiger Dateien hab ich dann gesehen, daß der Zeitstempel der Originaldatei übernommen wurde.

    Also hab ich jetzt mit Hilfe des Zufalls eine Datei ausgewählt und hab ihr den Zeitstempel von JETZT verpasst. Und siehe da .... ES GEHT -> ERFOLG 100%
    Ich kann alle anderen Dateimanipulationen weglassen. Das spart Unmengen an Zeilen :thumbup:

    Erstaunlich: Sobald man es richtig mach, funktioniert es auch.... :rolleyes:

    Die Funktion FileSetTime() scheint aber sehr zeitaufwendig zu sein. Ablauf z.Z: OrgDatei ins Temp - hier erfolg das Setzten des Zeitstempels - dann Move auf microSd-Karte. Das Ganze dauert aber länger als die gesamte ID3TAG-Manipulation (mit Lesen und Schreiben).

    Geschickt wäre hier die Nutzung einer RAMDisk. Ich hatte schon mal drüber gelesen im Forum oder im Handbuch. Hab es aber leider nicht wiedergefunden. Vielleicht hab ich auch nach dem falschen Begriff gesucht. Für eine Anregung in dieser Richtung wäre ich nun dankbar.

    Vielen Dank Denen, die sich meiner Sache angenommen haben. :D

    Wenn Du's eilig hast - geh langsam...

  • Die Funktion FileSetTime() scheint aber sehr zeitaufwendig zu sein. Ablauf z.Z: OrgDatei ins Temp - hier erfolg das Setzten des Zeitstempels - dann Move auf microSd-Karte. Das Ganze dauert aber länger als die gesamte ID3TAG-Manipulation (mit Lesen und Schreiben).

    Du brauchst doch kein 'TEMP'. Du kannst doch FileSetTime() auf die SDCard-Datei anwenden.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Das ist richtig. Aber die Schreibgeschwindigkeit auf HDD bzw RAM (RAMDisk) ist wesentlisch höher als die Datei auf einer micoSD/SD zu verändern. Deshalb will ich die Datei erst mal verändern und dan erst auf die SD-Karte verschieben/kopien.

    Wenn Du's eilig hast - geh langsam...

  • Dann verzichte doch komplett darauf !

    Filelist --> Array
    Array --> per 'Zufall' durchlaufen
    Datei --> Binär einlesen
    im Ziel --> neue Datei (gleicher Name) anlegen und Daten aus Puffer schreiben
    fertig....

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hmm, diese Variante simuliert eine RAMDISK. Ich muß diese nicht erst installieren. Mein Problem hier - ich hab mich mit dem binären Einlesen von Daten noch nicht beschäftigt. Aufgrund Deiner Anregung hab ich im Help gestöbert aber keine Funktion gefunden, die das macht. Ich fand nur FileOpen (oder so... ist aber für TXTs gedacht). Für eine kurz "Einführung" währ ich dankbar. ;)

    Wenn Du's eilig hast - geh langsam...

  • Ich hatte ein ähnliches Anliegen. Ich wollte auf eine SD Karte MP3s kopieren, aber habe keine Lust gehabt, mir Titel auszusuchen, und deshalb habe ich mir ein Tool gebastelt, das zufällig Lieder auf die SD Karte kopiert.

    Wer Interesse hat, kann ja mir bescheid geben.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • So, nu hab ich es geschaft. Hat zwar ein paar Stunden (mit Unterbrechnungen) gedauert, bis ich verstand wie der Ablauf ist und es dann auch noch gefunzt hat. Sind auch nur ein paar Zeilen. Und die Zeitersparnis ist gigantisch!!! :rofl: Bei 4GB über USB auf microSD mit Adapter geschrieben spare ich ganze 2:30 min. Es dauert jetzt also nur 26 statt 28:30 Minuten. Aber - wieder was gelert. :thumbup:

    Spoiler anzeigen

    Func DateiKopieren($vDateiQuelle, $vDateiZiel)
    Local $hDatei=FileOpen($vDateiQuelle,16)
    Local $hDateiZ=FileOpen($vDateiZiel,2)
    Local $vI=FileWrite($hDateiZ,Fileread($vDateiQuelle))
    ;FileFlush($hDateiZ)
    FileClose($hDateiZ)
    ;FileFlush($hDatei)
    FileClose($hDatei)
    Return $vI
    EndFunc

    Was mir noch nicht klar ist: Muß ich den Befehl FileFlush() nun ausführen??? ?( Erste Tests zeigten ein 300MB geringeren RAM-Verbrauch. Die Geschwindigkeit ändert sich dabei nicht.

    Danke Euch

    Wenn Du's eilig hast - geh langsam...

  • Mit FileCopy() muß ich die Datei 2x "anfassen". Das erste Mal beim Kopieren, das zweite Mal beim Ändern des Zeitstempels. FileCopy hat keine Option um der Kopie die Zeit von "Jetzt" zuzuweisen. Deshalb suchte ich ja nach einer RAM-Disk-Lösung. FileOpen simuliert diese nun. Funktioniert auch prima. Nur die Frage zur FileFlush-Funktion ist noch ungeklärt....

    Wenn Du's eilig hast - geh langsam...

    • Offizieller Beitrag

    Mit FileCopy() muß ich die Datei 2x "anfassen". Das erste Mal beim Kopieren, das zweite Mal beim Ändern des Zeitstempels. FileCopy hat keine Option um der Kopie die Zeit von "Jetzt" zuzuweisen. Deshalb suchte ich ja nach einer RAM-Disk-Lösung. FileOpen simuliert diese nun. Funktioniert auch prima. Nur die Frage zur FileFlush-Funktion ist noch ungeklärt....


    Bei FileClose wird die Datei automatisch schon auf die Festplatte geflusht! Brauchst du also nicht. ;)