【问题标题】:writing APIC to mp3 file with getid3 (id3v2)使用 getid3 (id3v2) 将 APIC 写入 mp3 文件
【发布时间】:2011-06-18 04:13:45
【问题描述】:

我正在尝试使用 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。我应该调整它的大小还是……?

我哪里错了?

谢谢

【问题讨论】:

  • 您使用的是什么库,如何将数据保存到 MP3 文件中?
  • 我使用getid3库getid3.org
  • 我可以毫无问题地保存标题、艺术家、专辑等信息,但是当涉及 APIC 时,它无法正常工作
  • 我们需要更多代码,直到 WriteID3v2 调用。
  • 还有:它会抛出错误还是静默失败?

标签: php id3-tag apic getid3


【解决方案1】:

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

sn-p 代码:

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

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

【讨论】:

    【解决方案2】:

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

    测试和工作:)

    【讨论】:

    • 不起作用是有原因的 :( 我把这些行放在 $tagwriter->tag_data = $TagData; $tagwriter->WriteTags();
    • 你遇到了什么错误?还是它不会被插入到文件中?
    • 如果是它造成的问题,那么它可能是文件的大小,尝试调整它的大小。
    【解决方案3】:

    我在源代码中找到了这个:

    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

    【讨论】:

      【解决方案4】:

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

          $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 
      

      【讨论】:

        【解决方案5】:
            <?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 的答案,因此归功于他

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多