PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Möglichkeiten, ID3 Informationen aus MP3s auszulesen

with 5 comments

Informationen aus MP3-Dateien auszulesen ist keine Hexerei, seit vielen Jahren gibt es dafür eine Unmenge an Möglichkeiten, aber im Detail trennt sich dann doch die Spreu vom Weizen. Manche beherrschen nur das ID3v1 Format, und manche sind einfach langsam oder die Informationen sind unvollständig.

Ich möchte hier auch nur die Möglichkeit betrachten, Informationen auszulesen, Änderungen schreiben ist nicht nötig. Das ID3 Format ist in verschiedenen Versionen vorhanden, 1.0, 1.1, 2.0, 2.1, 2.2, die aktuell verbreitetste Version ist 2.3.

ID3 beschreibt eine Möglichkeit, in eine Audio-Datei verschiedene Tags zu schreiben, beispielsweise den Artisten, den Titel, das Erscheinungsjahr, das Genre und so weiter. Bei ID3v1 wurden die Informationen in die letzten 128 Bytes einer Datei geschrieben. Dies ist natürlich für Streaming ungeeignet, und auch ist die Länge nicht flexibel genug. Mit Version 2 wurden die Informationen an den Anfang geschrieben, und sind variabel lang, man kann Bilder mit unterbringen, URLs, Texte und vieles mehr. Komischerweise wurden sie mit v2.4 wieder an das Ende gepackt, 2.4 ist zwar die aktuellste Version (aus dem Jahr 2000), wird aber nicht oft verwendet.

Die erste Möglichkeit, auf die man stößt, ist die PECL-Extension id3. Damit sollte es leicht und schnell möglich sein, an die entsprechenden Informationen ranzukommen. Ich habe es hier nicht untersucht da Extensions auf Shared Hosting nicht installiert werden können, und damit für viele Einsatzzwecke nicht in Frage kommen.

Das PEAR Paket MP3_Id beherrscht nur ID3v1, fällt also durch unser Raster.

Die nächste Klasse, die ich mir angeschaut habe, beherrscht nur ID3v2, was natürlich bei einigen älteren Dateien keine Informationen liefert. Wir benötigen v1 und v2.

Das Projekt php-reader-1.8, worin es einige Zend-Klassen gibt, um mit Media-Dateien zu arbeiten und Informationen auszulesen, ist brauchbar und beherrscht ID3v1 und ID3v2, allerdings muss man beide (v1 und v2) nacheinander ausprobieren.

Mein Favorit ist getID3. Es sind 13 Demo-Scripte dabei, unter anderem Beispiele zum rekursiven Auslesen eines Verzeichnisses und anschließendem Speichern in einer Datenbank, ein kleines Browse-Script, mit dem man seine Festplatte durchbrowsen kann und in einer Tabelle Dateiinformationen angezeigt bekommt, aber auch Beispiele wie man den ID3Tag verändern kann oder MP3s aus einer Zip-Datei liest. Es zeigt nicht nur ID3 Tags aus MP3 Dateien an, sondern auch Informationen aus .avi, .vob, .ogg, aac, .wav, .midi, .wma, .wmv, .mov Dateien und viele mehr, unglaublich auch die Details, die über eine .zip Datei ausgegeben werden, oder EXIF Informationen aus Digitalkamera-Bildern. Die Liste mit den unterstützten Formaten, die unterstützt werden, ist beeindruckend lang, ein tolles Projekt.

Ich habe die angesprochenen Klassen in ein kleines Script auf Github gepackt. Eigentlich wollte ich es zu einem Benchmark-Script ausbauen, das habe ich aber bisher noch nicht geschafft. Einige der Klassen bieten wie gesagt nur beschränkte oder keine Informationen (ID3v1), und andere bieten so viele Informationen sodass ich es auf wenige beschränken musste.

<?php

$allFilenames = array('mp3s/Jonay Ft Jasmine Kara - Skydiving.mp3', 'mp3s/Meditative.mp3', 'mp3s/The Vision.mp3', 'mp3s/Heroines.mp3', 'mp3s/5-jahre-cre.mp3', 'mp3s/Security Now 195_ SSL.mp3');

// http://de77.com/php/php-class-how-to-read-id3v2-tags-from-mp3-files
require 'implementations/de77.com/Id3v2.php';
$i = new Id3v2();

echo "####### de77.com #######\n";
foreach ($allFilenames as $filename) {
    echo "Working on file ".$filename."\n";
    $res = $i->read($filename);
    print_r($res);
}


// http://code.google.com/p/php-reader/wiki/ID3v2
set_include_path('implementations/php-reader-1.8/library/');

require 'Zend/Media/Id3v1.php'; // or using autoload

echo "####### Zend/Media/Id3v1 #######\n";
foreach ($allFilenames as $filename) {
    echo "Working on file ".$filename."\n";
    try {
        $id3 = new Zend_Media_Id3v1($filename);
        echo "Title: " . $id3->getTitle() . "\n";
        echo "Album: " . $id3->getAlbum() . "\n";
        echo "Year: " . $id3->getYear() . "\n";
    } catch (Zend_Media_Id3_Exception $e) {
        echo "No ID3v1 Tag found.\n";
    }
}


require 'Zend/Media/Id3v2.php'; // or using autoload

echo "####### Zend/Media/Id3v2 #######\n";
foreach ($allFilenames as $filename) {
    echo "Working on file ".$filename."\n";
    try {
        $id3 = new Zend_Media_Id3v2($filename);
        $frame = $id3->getFramesByIdentifier("TIT2");
        echo "Title: " . $frame[0]->getText() . "\n";

        $frame = $id3->getFramesByIdentifier("TALB");
        echo "Album: " . $frame[0]->getText() . "\n";

        $frame = $id3->getFramesByIdentifier("APIC"); // for attached picture
        echo "ImageType: " . $frame[0]->getImageType() . "\n";
    } catch (Zend_Media_Id3_Exception $e) {
        echo "No ID3v2 Tag found.\n";
    }
}




// http://www.barattalo.it/2010/02/22/reading-mp3-informations-with-php-id3-tags/
require 'implementations/GetID3/getid3/getid3.php';
$getID3 = new getID3();

echo "####### getID3 #######\n";
foreach ($allFilenames as $filename) {
    echo "Working on file ".$filename."\n";

    $ThisFileInfo = $getID3->analyze($filename);

    echo $ThisFileInfo['tags']['id3v2']['title'][0] . "\n";
    echo $ThisFileInfo['audio']['bitrate'] . "\n";
    echo $ThisFileInfo['playtime_string'] . "\n";

    //print_r($ThisFileInfo);
}

Die Ausgabe sieht so aus:

####### de77.com #######
Working on file mp3s/Jonay Ft Jasmine Kara - Skydiving.mp3
Array
(
)
Working on file mp3s/Meditative.mp3
Array
(
)
Working on file mp3s/The Vision.mp3
Array
(
)
Working on file mp3s/Heroines.mp3
Array
(
)
Working on file mp3s/5-jahre-cre.mp3
Array
(
)
Working on file mp3s/Security Now 195_ SSL.mp3
Array
(
    [Artist] => Steve Gibson with Leo Laporte
    [Genre] => Podcast
    [Title] => Security Now 195: SSL
)
####### Zend/Media/Id3v1 #######
Working on file mp3s/Jonay Ft Jasmine Kara - Skydiving.mp3
Title: Jonay Ft Jasmine Kara - Skydiv
Album: Skydiving
Year: 2009
Working on file mp3s/Meditative.mp3
Title: Meditative
Album: Epoch Symbol
Year: 2009
Working on file mp3s/The Vision.mp3
Title: The Vision
Album: Epoch Symbol
Year: 2009
Working on file mp3s/Heroines.mp3
Title: Heroines
Album: The Butcher's Ballroom
Year: 2009
Working on file mp3s/5-jahre-cre.mp3
No ID3v1 Tag found.
Working on file mp3s/Security Now 195_ SSL.mp3
Title: Security Now 195: SSL
Album: Security Now May2009
Year: 2009
####### Zend/Media/Id3v2 #######
Working on file mp3s/Jonay Ft Jasmine Kara - Skydiving.mp3
No ID3v2 Tag found.
Working on file mp3s/Meditative.mp3
No ID3v2 Tag found.
Working on file mp3s/The Vision.mp3
No ID3v2 Tag found.
Working on file mp3s/Heroines.mp3
No ID3v2 Tag found.
Working on file mp3s/5-jahre-cre.mp3
No ID3v2 Tag found.
Working on file mp3s/Security Now 195_ SSL.mp3
Title: Security Now 195: SSL
Album: Security Now!
ImageType: 3
####### getID3 #######
Working on file mp3s/Jonay Ft Jasmine Kara - Skydiving.mp3
Jonay Ft Jasmine Kara - Skydiving
204791.51884701
4:07
Working on file mp3s/Meditative.mp3
Meditative
154655.14609039
12:34
Working on file mp3s/The Vision.mp3
The Vision
187549.73006338
2:57
Working on file mp3s/Heroines.mp3
Heroines
198948.92712551
5:23
Working on file mp3s/5-jahre-cre.mp3
5 Jahre CRE
128000
11:06
Working on file mp3s/Security Now 195_ SSL.mp3
Security Now 195: SSL
64000
85:26

Hier noch 2 Screenshots von GetID3, einmal der Demo-Browser und einmal das Änderungsformular.

Written by Michael Kliewe

März 17th, 2011 at 9:07 am

Posted in PHP

Tagged with , , ,

5 Responses to 'Möglichkeiten, ID3 Informationen aus MP3s auszulesen'

Subscribe to comments with RSS or TrackBack to 'Möglichkeiten, ID3 Informationen aus MP3s auszulesen'.

  1. Ich stand bei meiner Projektarbeit (Interaktive Playlist für ein Webradio) vor dem selben Problem.
    getID3 habe ich dann letztendlich auch benutzt.

    Max

    17 Mrz 11 at 11:01

  2. Ich setze das getID3 Script auch schon seit geraumer Zeit ein um Playlists zu erstellen, sehr komfortabel und schnell 🙂

    Oliver

    18 Mrz 11 at 08:23

  3. […] eine Alternative dazu. Habs probiert, funzt tadellos http://www.phpgangsta.de/moglichkeit…p3s-auszulesen […]

  4. Vor kurzem habe ich zu dem Thema einen Artikel entdeckt, welcher die ID3 Tags von der Struktur her ganz gut erklärt.
    We sich also für die Struktur selber interessiert oder die ID3 Tags selber parsen möchte, könnte das ganz interessant finden 🙂
    http://www.stagetwo.eu/article/19-MP3-ID3-Tags-Wie-kann-man-die-teile-lesen

    Thomas Schlage

    13 Jan 14 at 12:09

  5. Sehr geehrte Damen und Herren,

    ich habe mit dem Betreiber von http://www.coverinfo.de
    Kontakt aufgenommen, da ich meine MP3-Datenbank seit mehr als 10 Jahren pflege.
    Diesem Betreiber möchte ich nun meine Informationen zukommen lassen, damit er seine Datenbank über Covertitel ergänzen kann.

    Statt meinen Bildschirm zu scannen und die Infos als Bilddateien zu senden (Daten wären bei absgeschnittenen Spalten unvollständig)
    kam mir die Idee, die betreffenden MP3-Titel
    in einen Ordner zu exportieren, um alle darin befindlichen Dateien gemeinsam zu verarbeiten.

    Ich bräuchte dazu ein Programm, welches alle MP3-Titel in diesem Ordner nacheinander ausliest, die ID3-Tag-Daten Version 2 in eine Liste schreibt
    (pro Musikdatei eine Zeile mit Trennzeichen)
    und diese Liste als .txt-Datei oder ähnliche Text-Datei in den gleichen Ordner schreibt.
    (Quell-Ordner = Ziel-Ordner)

    Ich arbeite normalerweise mit WIN-XP + SP3.
    (Möglich wäre ersatzweise auch ein Skript für WIN-8.1)

    Wer kann mir helfen ?

    Herzlichen Dank

    S. Frauenlob
    Frauen-Frauen@web.de

    Frauenlob

    10 Jul 15 at 14:33

Leave a Reply

You can add images to your comment by clicking here.