将APIC写入带有getid3的mp3文件(id3v2)

问题描述:

我正在尝试将APIC图片写入带有getid3的mp3文件。这里是代码;将APIC写入带有getid3的mp3文件(id3v2)

$cover = "/home/user/public_html/artwork/cover.jpg"; 
$TagData['attached_picture'][]=array(
'picturetypeid'=>2, // Cover. More: module.tag.id3v2.php -> function APICPictureTypeLookup 
'description'=>'cover', // text field 
'mime'=>'image/jpeg', // Mime type image 
'data'=>$cover // Image data 
); 

但它不工作。图像大小约为1.5 MB。我应该调整它还是......?

我在哪里错了?

感谢

+0

你在使用什么库,以及如何将数据保存到MP3文件? – 2011-01-30 17:26:04

+0

我使用getid3库http://www.getid3.org/ – 2011-01-30 17:30:02

看着他们在其网站上的演示:http://www.getid3.org/source/demo.write.phps

的代码片段:

$fd = fopen($_FILES['userfile']['tmp_name'], 'rb') 
$APICdata = fread($fd, filesize($_FILES['userfile']['tmp_name'])); 
fclose ($fd); 

$imagetypes = array(1=>'gif', 2=>'jpeg', 3=>'png'); 
if (isset($imagetypes[$APIC_imageTypeID])) { 
    $TagData['attached_picture'][0]['data']   = $APICdata; 
    $TagData['attached_picture'][0]['picturetypeid'] = $_POST['APICpictureType']; 
    $TagData['attached_picture'][0]['description'] = $_FILES['userfile']['name']; 
    $TagData['attached_picture'][0]['mime']   = 'image/'.$imagetypes[$APIC_imageTypeID]; 
} 

好像数据的关键必须是图像内容,而不仅仅是图像文件的路径。 所以你的情况,应该是这样的:

$cover = "/home/user/public_html/artwork/cover.jpg"; 
$fd = fopen($cover, 'rb') 
$APICdata = fread($fd, filesize($coverFile)); 
fclose ($fd); 

$TagData['attached_picture'][]=array(
'picturetypeid'=>2, // Cover. More: module.tag.id3v2.php -> function APICPictureTypeLookup 
'description'=>'cover', // text field 
'mime'=>'image/jpeg', // Mime type image 
'data'=>$APICdata // Image data 
); 

注意:这仅仅是在之后的演示代码看一眼,我没有用过这个库或测试此代码。

GetID3需要为数据发送文件的内容,而不是文件路径。那么只有它可以将它们嵌入到文件中。尝试

$cover = "/home/user/public_html/artwork/cover.jpg"; 
$TagData['attached_picture'][]=array(
    'picturetypeid'=>2, // Cover. More: module.tag.id3v2.php -> function APICPictureTypeLookup 
    'description'=>'cover', // text field 
    'mime'=>'image/jpeg', // Mime type image 
    'data'=> file_get_contents($cover) // Image data; not the file name 
); 

测试工作:)

我发现这个源代码:

case 'APIC': 
    // 4.14 APIC Attached picture 
    // Text encoding  $xx 
    // MIME type   <text string> $00 
    // Picture type  $xx 
    // Description  <text string according to encoding> $00 (00) 
    // Picture data  <binary data> 

所以图像数据必须是二进制。

的解决方案是在这里:getid3 demo

这一个是为我工作了很长一段时间:

$TagData = array(); //your other tags 
    $fd = fopen($albumPath, 'rb'); 
    $APICdata = fread($fd, filesize($albumPath)); 
    fclose($fd); 

    if($APICdata) { 
     $TagData += array(
      'attached_picture' => array(0 => array(
       'data'   => $APICdata, 
       'picturetypeid' => '0x03', 
       'description' => 'cover', 
       'mime'   => image_type_to_mime_type($albumExifType) 
      )) 
     ); 
    } 
    //and write the tags to file 

<?php 
///////////////////////////////////////////////////////////////// 
/// getID3() by James Heinrich <[email protected]>    // 
// available at http://getid3.sourceforge.net     // 
//   or http://www.getid3.org       // 
//   also https://github.com/JamesHeinrich/getID3  // 
///////////////////////////////////////////////////////////////// 
//                // 
// /demo/demo.simple.write.php - part of getID3()    // 
// Sample script showing basic syntax for writing tags   // 
// See readme.txt for more details        // 
//               /// 
///////////////////////////////////////////////////////////////// 

//die('Due to a security issue, this demo has been disabled. It can be enabled by removing line '.__LINE__.' in '.$_SERVER['PHP_SELF']); 

$TextEncoding = 'UTF-8'; 
$albumPath = "img/img.jpg"; // path to your image 


require_once('../getid3/getid3.php'); 
// Initialize getID3 engine 
$getID3 = new getID3; 
$getID3->setOption(array('encoding'=>$TextEncoding)); 

require_once('../getid3/write.php'); 
// Initialize getID3 tag-writing module 
$tagwriter = new getid3_writetags; 
//$tagwriter->filename = '/path/to/file.mp3'; 
$tagwriter->filename = 'uploads/problem.mp3'; 

//$tagwriter->tagformats = array('id3v1', 'id3v2.3'); 
$tagwriter->tagformats = array('id3v2.3'); 

// set various options (optional) 
$tagwriter->overwrite_tags = true; // if true will erase existing tag data and write only passed data; if false will merge passed data with existing tag data (experimental) 
$tagwriter->remove_other_tags = false; // if true removes other tag formats (e.g. ID3v1, ID3v2, APE, Lyrics3, etc) that may be present in the file and only write the specified tag format(s). If false leaves any unspecified tag formats as-is. 
$tagwriter->tag_encoding  = $TextEncoding; 
$tagwriter->remove_other_tags = true; 

// populate data array 
$TagData = array(
    'title'   => array('My Song'), 
    'artist'  => array('My Song'), 
    'album'   => array('My Song'), 
    'year'   => array('20015'), 
    'genre'   => array('My Song'), 
    'comment'  => array('My Song'), 
    'track'   => array('01'), 
); 

$fd = fopen($albumPath, 'rb'); 
$APICdata = fread($fd, filesize($albumPath)); 
fclose($fd); 

if($APICdata) { 
    $TagData += array(
     'attached_picture' => array(0 => array(
      'data'   => $APICdata, 
      'picturetypeid' => '0x03', 
      'description' => 'cover', 
      'mime'   => image_type_to_mime_type(@$albumExifType) 
     )) 
    ); 
} 



$tagwriter->tag_data = $TagData; 

// write tags 
if ($tagwriter->WriteTags()) { 
    echo 'Successfully wrote tags<br>'; 
    if (!empty($tagwriter->warnings)) { 
     echo 'There were some warnings:<br>'.implode('<br><br>', $tagwriter->warnings); 
    } 
} else { 
    echo 'Failed to write tags!<br>'.implode('<br><br>', $tagwriter->errors); 
} 

对于任何人谁只是needd更新他们的ID3标签,包括专辑封面,上面代码工作得很好你需要让get3库去工作。 这个答案是基于JacopKane的答案,所以他的功劳