簡體   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