我正在寻找使用PHP设置mp3专辑艺术的最佳或任何方式。
建议?
答案 0 :(得分:4)
专辑封面是由于ID3v2规范而被标识为“附加图片”的数据帧 getID3()现在只是使用纯PHP在ID3v2中编写所有可能数据帧的一种方法。
看看这个来源: http://getid3.sourceforge.net/source/write.id3v2.phps
在来源中搜索此文字:
// 4.14 APIC Attached picture
有一段代码负责撰写专辑封面。
另一种方式,似乎没有纯PHP那么慢,是使用一些外部应用程序,它将由PHP脚本启动。如果您的服务设计为在高负载下工作,那么二进制编译工具将是更好的解决方案。
答案 1 :(得分:3)
更好(更快)的方法是通过外部应用程序和PHP exec()函数来使命令变得有趣。我建议eyeD3。
答案 2 :(得分:1)
不确定这仍然是一个问题,但是:
令人惊讶的完整getid3()(http://getid3.org)项目将解决您的所有问题。查看this论坛帖子了解更多信息。
答案 3 :(得分:1)
使用作曲者composer require james-heinrich/getid3
安装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));
}
答案 4 :(得分:0)
您可以查看getID3() project。我不能保证它可以处理图像,但它声称能够为MP3写入ID3标签,所以我认为这将是你最好的选择。
答案 5 :(得分: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
答案 6 :(得分: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'
)
)
);
?>
答案 7 :(得分: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'
)
)
);
答案 8 :(得分:-1)
使用PHP内置函数
<?php
$tag = id3_get_tag( "path/to/example.mp3" );
print_r($tag);
?>
答案 9 :(得分:-2)
我认为用PHP确实不可能。我的意思是,我认为一切皆有可能,但它可能不是本机PHP解决方案。从PHP Docs开始,我认为唯一可以更新的项目是:
对不起男士。也许Perl,Python或Ruby可能有一些解决方案。
我不确定你是否熟悉Perl(我个人不喜欢它,但是,它很擅长这样......)。这是一个似乎能够在MP3中引入和编辑专辑封面的脚本:http://www.plunder.com/-download-66279.htm