MP3 Header Probleme

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MP3 Header Probleme

    Hallo @ all & danke für das Lesen dieses Topics.

    Ich habe ein Problem bei dem mich selbst google nicht weiterzuführen scheint (registed for this post).

    Seit einiger Zeit versuche ich eine Art "Einlesescript" für mp3 Files zu schreiben. Ausgelesen werden sollen die Tags der Datei + Informationen aus dem Header der Datei. Nun komme aber mit der Bitrate und den BPM nicht weiter.
    Ich weiß, spuckt ne ganze Menge Scripts für sowas aus, jedoch:

    Sämtliche Scripts/Klassen/Funktionen/sonstiges die ich bisher ausprobiert (und mehr oder weniger nachher durch editieren kaputt gemacht) hab, funktionieren perfekt für CBR...und/oder steigen bei der "Erkennung" von VBR aus oder geben einfach nur Käse aus...
    (Eben "ABR" gelesen...gibts das auch noch?)

    Die einzige Möglichkeit die funktionierte war getID3..aber..will ich nicht/mag ich nicht/neeee...

    Aus Verzweiflung versuche ich mir gerade den Header einer MP3 Datei näher zu bringen um ein eigenes Script zu kreieren..

    Was mich aber zu meinem nächsten Problem führt, die BPM.
    Gibt es eine Möglichkeit diese aus einer vorliegenden MP3 zu berechnen (PHP) oder ist hierzu schlichtweg der ID3 Tag von Nöten?!

    Jemand Ideen/Denkanstöße/Google-Stichworte oder Erfahrung?
    Ich komm echt nicht weiter

    Danke schonmal im vorraus..
    Zuletzt geändert von JonasBauer; 07.01.2012, 19:07.

  • #2
    Zitat von JonasBauer Beitrag anzeigen
    ...
    Sämtliche Scripts/Klassen/Funktionen/sonstiges die ich bisher ausprobiert (und mehr oder weniger nachher durch editieren kaputt gemacht) hab, funktionieren perfekt für CBR...und/oder steigen bei der "Erkennung" von VBR aus oder geben einfach nur Käse aus...
    (Eben "ABR" gelesen...gibts das auch noch?)
    Ohne jetzt den exakten Aufbau des MP3-Datenformats zu kennen: VBR bedeutet "variable Bitrate" und damit kann sich diese während des Abspielens ständig ändern. Das heißt, du musst nicht nur im Header nachschauen, sondern das ganze File nach entsprechenden Datenstrukturen scannen.

    Die einzige Möglichkeit die funktionierte war getID3..aber..will ich nicht/mag ich nicht/neeee...
    Was ist daran so eklig, dass du eine Abneigung dagegen entwickelt hast?

    Aus Verzweiflung versuche ich mir gerade den Header einer MP3 Datei näher zu bringen um ein eigenes Script zu kreieren..

    Was mich aber zu meinem nächsten Problem führt, die BPM.
    Gibt es eine Möglichkeit diese aus einer vorliegenden MP3 zu berechnen (PHP) oder ist hierzu schlichtweg der ID3 Tag von Nöten?!
    Der ID3-Eintrag könnte lügen, schließlich könnte man da jeden beliebigen Wert eintragen.

    BPM heißt, wenn ich mich recht erinnere, "beats per minute". Die kannst du im Bestfall durch Tiefpassfilterung der abgespielten Musikdaten und anschließende Analyse des Filtrats zählen. Ich könnte dir eine elektronische (Analog-)Schaltung bauen, die das leistet. Aber in Software, noch dazu in einer lahmen Scriptsprache, die sich mit Binärdaten schwer tut, wird das kompliziert (wenn auch nicht unmöglich). Zumindest das Filtern könnte man eventuell den Blurring-Filtern oder der Resampling-Funktion der LibGD aufhalsen (solcherart Hacks gefallen mir ). Aber die Peak-Detektion hat was mit Frequenz-Analyse und höherer Mathematik zu tun, damit tue ich mich etwas schwer.

    Beispiel-Sources, die das richtig machen, dürftest du in quelloffener Audiosoftware finden. Vielleicht hat Audacity oder eines seiner Plugins einen solchen Zähler?

    *nachträglich_einschieb*

    Zuerst muss man das MP3 natürlich dekodieren|entkomprimieren. Das würde mit PHP allein sicher ziemlich lange dauern. Man kann aber externe Tools, wie LAME damit beauftragen.

    Was Google so ausspuckt:

    BeatDetector

    (Der Link dort auf gamedev.net ist kaputt. Die richtige URL dürfte die hier sein:
    Beat Detection Algorithms

    http://www.flipcode.com/misc/BeatDet...Algorithms.pdf (PDF)

    Mixxx | Download

    BpmDj, a Free Linux DJ Tool

    BPM Detection Library - Documentation
    Scheint eine DLL zu sein, die man von verschiedenen Sprachen aus nutzen kann. Leider zeigt die Download-Page einen Parse-Fehler.

    alle via: BPM Detection information
    Zuletzt geändert von fireweasel; 09.01.2012, 22:54. Grund: links ergänzt
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar


    • #3
      Verspäteten Dank und an dich fireweasel.

      Die kannst du im Bestfall durch Tiefpassfilterung der abgespielten Musikdaten und anschließende Analyse des Filtrats zählen. Ich könnte dir eine elektronische (Analog-)Schaltung bauen, die das leistet. Aber in Software, noch dazu in einer lahmen Scriptsprache, die sich mit Binärdaten schwer tut, wird das kompliziert (wenn auch nicht unmöglich). Zumindest das Filtern könnte man eventuell den Blurring-Filtern oder der Resampling-Funktion der LibGD aufhalsen (solcherart Hacks gefallen mir ). Aber die Peak-Detektion hat was mit Frequenz-Analyse und höherer Mathematik zu tun, damit tue ich mich etwas schwer.
      Alles Wörter die ich nicht verstehe

      Ich weiß nicht ob dass falsch verstanden wurde, aber mit der Einschränkung "PHP" hätte auch ein Aufrufen einee CLI-Software gemeint sein können (siehe BPM).
      So weit wie du dich da auszukennen scheinst, mag ich garnicht gehen

      Das BPM "Problem" ist in der Zwischenzeit gelöst worden.
      (Externes Programm speichert (im Vorfeld) einen Tag der dann ausgelesen wird)

      Mit dem MP3 Header bin ich noch nicht wirklich weiter, bin aber auch noch nicht dazu gekommen weiterzusuchen.
      Hast du da vllt Erfahrung drin? Ich verstehe nicht ganz wie man aus einer variablen, sich stetig ändernden Bitrate nachher einen "festen" Wert bekommt (Durchschnitt?, bcdiv(Größe,Länge,0)? oder wie?).
      Aber wie gesagt, bin bisher nicht mehr zum googlen diesbezüglich gekommen.


      Wollte mich nur nochmal kurz melden & bedanken, ich hasse Posts die vom Threadersteller nach "Lösung" des Problems unbeantwortet bleiben^^

      Bis dahin (in der Hoffnung auf jemand der vllt noch einen Tipp für mich hat)
      Grüße

      Jonas
      Zuletzt geändert von JonasBauer; 14.01.2012, 02:52. Grund: Schlechtschreibung

      Kommentar


      • #4
        Hallo,

        VBR bedeutet lediglich, dass jeder Frame eine andere Bitrate haben kann. Da aber jeder Frame aus einem Frame-Header und einem Datenblock besteht und der Header die Bitrate für den Frame angibt, kannst du die Datei Frame für Frame einlesen und die einzelnen Bitraten erfassen. Wie du die dann verrechnest (z. B. Durchschnittswert bilden), bleibt dir überlassen.

        ABR ist im Prinzip das gleiche wie VBR: Die Bitrate für jeden Frame ist unterschiedlich. Bei VBR komprimiert der Encoder die Datei wie es ihm gerade passt oder innerhalb eines festlegbaren Min-Max-Intervalls. Bei ABR kann man die durchschnittliche Bitrate (average bit rate) angeben und der Encoder macht einen Analysedurchlauf (first pass), um dann im zweiten Durchlauf exakt diesen Durchschnittswert zu erreichen. Der Gegensatz zu VBR besteht also grob gesagt lediglich darin, dass bei VBR die Durchschnitts-Bitrate nur von der fertigen Datei ermittelt werden kann, während sie bei ABR schon vor dem Komprimieren festgelegt ist. Auslesen musst du sie trotzdem genauso wie bei VBR.

        Gruß,

        Amica
        Zuletzt geändert von AmicaNoctis; 14.01.2012, 04:03.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Zitat von JonasBauer Beitrag anzeigen
          Verspäteten Dank und an dich fireweasel.

          Alles Wörter die ich nicht verstehe
          Ja, ich hätte auch verständliche Wörter benutzen können. Blurring bspw. heißt auf Deutsch Weich-Zeichner, Peaks sind Spitzenwerte usw. Mir fällt nicht immer sofort die passende Vokabel ein. Oft findet man aber mit einer Wikipedia|Wiktionary-Suche eine Erläuterung.

          Das BPM "Problem" ist in der Zwischenzeit gelöst worden.
          (Externes Programm speichert (im Vorfeld) einen Tag der dann ausgelesen wird)
          Klar, das ist die einfachste Lösung.

          Wenn die Musikstücke einem größerem Publikum bekannt sind, könnte man auch einen Tagger drüberlaufen lassen und mit dem ermittelten Hashwert eine Online-Datenbank befragen, die BPM-Werte in ihrer Meta-Daten-Sammlung hat.

          ... Ich verstehe nicht ganz wie man aus einer variablen, sich stetig ändernden Bitrate nachher einen "festen" Wert bekommt (Durchschnitt?, bcdiv(Größe,Länge,0)? oder wie?).
          Ich würde Frame für Frame durchgehen und den Minimal-Wert und den Maximalwert speichern. Sind beide gleich groß, handelt es um eine konstante Bitrate. Was ein Durchschnitt ist, darüber streiten sich die Mathematiker. Falls der gewünscht ist, würde ich den Median-Wert nehmen. Der dürfte dem allgemeinüblichen Verständnis der durchschnittlichen Datenrate am nächsten kommen.

          ..., ich hasse Posts die vom Threadersteller nach "Lösung" des Problems unbeantwortet bleiben^^ ...
          Sehr löbliche Einstellung. Keiner ist erfreut, nach vermeintlich erfolgreichem "Ergooglen" einer Problemlösung so etwas wie "Problem wurde gelöst. Lösung behält der Threadersteller für sich" zu lesen ...
          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

          Kommentar

          Lädt...
          X