繁体   English   中英

使用getid3(id3v2)将APIC写入mp3文件

[英]writing APIC to mp3 file with getid3 (id3v2)

我正在尝试使用getid3将APIC图片写入mp3文件。 这是代码;

$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。 我应该调整大小还是……?

我在哪里错?

谢谢

查看他们在其网站上的演示: 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
);

注意:这只是在快速浏览了演示代码之后,我还没有使用此库或测试过此代码。

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

    $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 <info@getid3.org>               //
//  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);
}

对于只需要更新其ID3标签(包括专辑封面)的任何人,上述代码都可以正常工作。您需要getID3库才能工作。 该答案基于JacopKane的答案,因此功劳归于他

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演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM