10

我正在寻找使用 PHP 设置 mp3 专辑封面的最佳方式或任何方式。

建议?

4

10 回答 10

5

专辑封面是由于 ID3v2 规范而被标识为“附加图片”的数据帧,而 getID3() 现在只是使用纯 PHP 在 ID3v2 中写入所有可能的数据帧的一种方法。

看看这个来源: http: //getid3.sourceforge.net/source/write.id3v2.phps

在源代码中搜索此文本:

// 4.14  APIC Attached picture

有一段代码负责编写专辑封面。

另一种似乎不像纯PHP那么慢的方法是使用一些外部应用程序,该应用程序将由PHP脚本启动。如果您的服务设计为在高负载下工作,二进制编译工具将是一个更好的解决方案。

于 2009-07-11T23:12:07.867 回答
3

更好(更快)的方法是通过外部应用程序和 PHP exec() 函数来执行命令。我会推荐eyeD3

于 2010-11-07T16:43:55.397 回答
1

不确定这仍然是一个问题,但是:

令人惊讶的完整 getid3() ( http://getid3.org ) 项目将解决您的所有问题。查看论坛帖子以获取更多信息。

于 2010-01-13T01:09:50.013 回答
1

使用 composer 安装 getId3composer require james-heinrich/getid3 然后使用此代码更新您的 id3 标签

// 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));
}
于 2018-10-04T10:40:56.887 回答
0

您可以查看getID3() 项目。我不能保证它可以处理图像,但它确实声称能够为 MP3 编写 ID3 标签,所以我认为这将是你最好的选择。

于 2009-07-11T20:36:29.303 回答
0

我不只是分享专辑封面更新的代码,而是将我的整个 MP3 包装类 getID3 发布在这里,以便您可以随意使用

用法

$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();

班级

<?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]];
    }


}

笔记

还没有任何错误处理代码。目前,当我尝试运行任何操作时,我只是依赖异常。随意修改和使用。需要 PHP GETID3

于 2014-04-28T08:57:10.653 回答
0

这是使用 getID3 添加图像和 ID3 数据的基本代码。(@frostymarvelous 的包装器包含等效代码,但我认为展示基础知识很有帮助。)

<?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'
            )
        )
    );
?>
于 2017-11-01T21:48:39.717 回答
0

@carrp $Tagdata 代码将不起作用,除非每个值属性都是一个数组,例如

$TagData = array(
    'title' => ['My Title'],
    'artist' => ['My Artist'],        
    'attached_picture' => array(   
        array (
            'data'=> $pictureFile,
            'picturetypeid'=> 3,
            'mime'=> 'image/jpeg',
            'description' => 'My Picture'
        )
    )
);
于 2021-08-04T18:45:19.763 回答
-1

使用 PHP 的这个内置函数,

<?php
    $tag = id3_get_tag( "path/to/example.mp3" );
    print_r($tag);
?>
于 2018-02-06T07:23:23.130 回答
-3

我认为 PHP 真的不可能。我的意思是,我想一切皆有可能,但它可能不是原生 PHP 解决方案。从PHP Docs,我认为唯一可以更新的项目是:

  • 标题
  • 艺术家
  • 专辑
  • 类型
  • 评论
  • 追踪

对不起。也许 Perl、Python 或 Ruby 可能有一些解决方案。

我不确定你是否熟悉 Perl(我个人不喜欢它,但是,它擅长这样的事情......)。这是一个似乎能够在 MP3 中提取和编辑专辑封面的脚本:http ://www.plunder.com/-download-66279.htm

于 2009-07-11T19:38:45.067 回答