Frage

Ich bin auf der Suche nach dem besten oder irgendeine Weise des Album Art von mp3s zu setzen PHP.

Verbesserungsvorschläge?

War es hilfreich?

Lösung

Albumcover ist ein Datenrahmen als „Befestigt Bild“ due ID3v2-Spezifikation identifiziert, und getID3 () jetzt ist nur eine Möglichkeit, alle möglichen Datenrahmen in ID3v2 mit reinem PHP zu schreiben.

Schauen Sie sich diese Quelle: http://getid3.sourceforge.net/source/write.id3v2.phps

Suchen Sie nach diesem Text in der Quelle:

// 4.14  APIC Attached picture

Es ist ein Stück Code verantwortlich Albumcover für das Schreiben.

Ein andere Art und Weise, die nicht so langsam wie reine PHP zu sein scheint, ist eine externe Anwendung zu verwenden, die von PHP-Skript gestartet wird. Wenn Ihr Dienst unter hohen Last zu arbeiten entworfen, binär zusammengestellt Tool eine bessere Lösung sein.

Andere Tipps

Ein besserer (schneller) Weg, dies zu tun durch eine externe Anwendung und der PHP exec () Funktion, um Spaß eines Befehl sein würde. Ich würde empfehlen, eyed3 .

Nicht sicher ist dies immer noch ein Problem, aber:

die erstaunlich komplette getid3 () ( http://getid3.org ) Projekt werden alle Ihre Probleme lösen. Schauen Sie sich diesem Forum Post für weitere Informationen.

Installieren getid3 mit Komponisten composer require james-heinrich/getid3 Dann diesen Code verwenden, um Ihre ID3-Tags zu aktualisieren

// Initialize getID3 engine
$getID3 = new getID3;

// Initialize getID3 tag-writing module
$tagwriter = new getid3_writetags;
$tagwriter->filename = 'path/to/file.mp3';
$tagwriter->tagformats = array('id3v2.4');
$tagwriter->overwrite_tags    = true;
$tagwriter->remove_other_tags = true;
$tagwriter->tag_encoding      = 'UTF-8';

$pictureFile = file_get_contents("path/to/image.jpg");

$TagData = array(
    'title' => array('My Title'),
    'artist' => array('My Artist'),
    'album' => array('This Album'),
    'comment' => array('My comment'),
    'year' => array(2018),
    'attached_picture' => array(
        array (
            'data'=> $pictureFile,
            'picturetypeid'=> 3,
            'mime'=> 'image/jpeg',
            'description' => 'My Picture'
        )
    )
);

$tagwriter->tag_data = $TagData;

// write tags
if ($tagwriter->WriteTags()){
    return true;
}else{
    throw new \Exception(implode(' : ', $tagwriter->errors));
}

Sie können den Blick in getID3 () Projekt . Ich kann nicht versprechen, dass es Bilder verarbeiten kann, aber es nicht behaupten zu können, ID3-Tags für MP3-Dateien schreiben, so denke ich, dass es die beste Wahl sein.

Anstatt nur den Code für die aktuelle Albumcover teilen, ich eine geht meine ganze MP3-Wrapper-Klasse von getID3 hier zu schreiben, so dass Sie verwenden können, wie Sie möchten

Verwendung

$mp3 = new Whisppa\Music\MP3($mp3_filepath);

//Get data
$mp3->title
$mp3->artist
$mp3->album
$mp3->genre

//set properties
$mp3->year = '2014';

//change album art
$mp3->set_art(file_get_contents($pathtoimage), 'image/jpeg', 'New Caption');//sets front album art

//save new details
$mp3->save();

Klasse

<?php

namespace Whisppa\Music;

class MP3
{
    protected static $_id3;

    protected $file;
    protected $id3;
    protected $data     = null;


    protected $info =  ['duration'];
    protected $tags =  ['title', 'artist', 'album', 'year', 'genre', 'comment', 'track', 'attached_picture', 'image'];
    protected $readonly_tags =  ['attached_picture', 'comment', 'image'];
                                //'popularimeter' => ['email'=> 'music@whisppa.com', 'rating'=> 1, 'data'=> 0],//rating: 5 = 255, 4 = 196, 3 = 128, 2 = 64,1 = 1 | data: counter


    public function __construct($file)
    {
        $this->file = $file;
        $this->id3  = self::id3();
    }

    public function update_filepath($file)
    {
        $this->file = $file;
    }

    public function save()
    {
        $tagwriter = new \GetId3\Write\Tags;
        $tagwriter->filename = $this->file;
        $tagwriter->tag_encoding = 'UTF-8';
        $tagwriter->tagformats = ['id3v2.3', 'id3v1'];
        $tagwriter->overwrite_tags = true;
        $tagwriter->remove_other_tags = true;

        $tagwriter->tag_data = $this->data;

        // write tags
        if ($tagwriter->WriteTags())
            return true;
        else
            throw new \Exception(implode(' : ', $tagwriter->errors));
    }


    public static function id3()
    {
        if(!self::$_id3)
            self::$_id3 = new \GetId3\GetId3Core;

        return self::$_id3;
    }

    public function set_art($data, $mime = 'image/jpeg', $caption = 'Whisppa Music')
    {
        $this->data['attached_picture'] = [];

        $this->data['attached_picture'][0]['data']            = $data;
        $this->data['attached_picture'][0]['picturetypeid']   = 0x03;    // 'Cover (front)'    
        $this->data['attached_picture'][0]['description']     = $caption;
        $this->data['attached_picture'][0]['mime']            = $mime;

        return $this;
    }

    public function __get($key)
    {
        if(!in_array($key, $this->tags) && !in_array($key, $this->info) && !isset($this->info[$key]))
            throw new \Exception("Unknown property '$key' for class '" . __class__ . "'");

        if($this->data === null)
            $this->analyze();

        if($key == 'image')
            return isset($this->data['attached_picture']) ? ['data' => $this->data['attached_picture'][0]['data'], 'mime' => $this->data['attached_picture'][0]['mime']] : null;
        else if(isset($this->info[$key]))
            return $this->info[$key];
        else
            return isset($this->data[$key]) ? $this->data[$key][0] : null;
    }

    public function __set($key, $value)
    {
        if(!in_array($key, $this->tags))
            throw new \Exception("Unknown property '$key' for class '" . __class__ . "'");
        if(in_array($key, $this->readonly_tags))
            throw new \Exception("Tying to set readonly property '$key' for class '" . __class__ . "'");

        if($this->data === null)
            $this->analyze();

        $this->data[$key] = [$value];
    }

    protected function analyze()
    {
        $data = $this->id3->analyze($this->file);

        $this->info =  [
                'duration' => isset($data['playtime_seconds']) ? ceil($data['playtime_seconds']) : 0,
            ];

        $this->data = isset($data['tags']) ? array_intersect_key($data['tags']['id3v2'], array_flip($this->tags)) : [];
        $this->data['comment'] = ['http://whisppa.com'];

        if(isset($data['id3v2']['APIC']))
            $this->data['attached_picture'] = [$data['id3v2']['APIC'][0]];
    }


}

Hinweis

Es gibt keinen Fehlercode Handhabung noch. Derzeit ich verlasse mich nur auf Ausnahmen, wenn ich versuche, alle Operationen auszuführen. Fühlen Sie sich frei zu ändern und als Sitz zu benutzen. Benötigt PHP getid3

Hier ist der grundlegende Code für das Hinzufügen eines Bildes und ID3-Daten unter Verwendung von getID3. (@Frostymarvelous' Wrapper enthält entsprechenden Code, aber ich denke, dass es hilfreich ist, die Grundlagen zu zeigen.)

<?php
    // Initialize getID3 engine
    $getID3 = new getID3;

    // Initialize getID3 tag-writing module
    $tagwriter = new getid3_writetags;
    $tagwriter->filename = 'audiofile.mp3';
    $tagwriter->tagformats = array('id3v2.3');
    $tagwriter->overwrite_tags    = true;
    $tagwriter->remove_other_tags = true;
    $tagwriter->tag_encoding      = $TextEncoding;

    $pictureFile=file_get_contents("image.jpg");

    $TagData = array(
        'title' => 'My Title',
        'artist' => 'My Artist',        
        'attached_picture' => array(   
            array (
                'data'=> $pictureFile,
                'picturetypeid'=> 3,
                'mime'=> 'image/jpeg',
                'description' => 'My Picture'
            )
        )
    );
?>

Mit dieser eingebauten Funktion von PHP,

<?php
    $tag = id3_get_tag( "path/to/example.mp3" );
    print_r($tag);
?>

Ich glaube nicht, es mit PHP wirklich möglich ist. Ich meine, ich nehme alles ist möglich, aber es kann nicht eine native PHP-Lösung sein. Aus dem PHP Docs , ich glaube, die nur Artikel dass können aktualisiert werden:

  • Titel
  • Künstler
  • Album
  • Jahr
  • Genre
  • Kommentar
  • Track

Es tut uns Leid Mann. Vielleicht Perl, Python, Ruby oder vielleicht irgendeine Lösung hat.

Ich bin mir nicht sicher, ob Sie mit Perl vertraut sind (ich persönlich mag es nicht, aber es an Dinge wie diese gut ist ...). Hier ist ein Skript, das in der Lage zu sein, scheint zu ziehen und das Albumcover in einem MP3 bearbeiten: http: //www.plunder.com/-download-66279.htm

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top