запись APIC в mp3-файл с помощью getid3 (id3v2)

Я пытаюсь записать изображение APIC в mp3-файл с помощью 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'=>$cover // Image data ); 

но он не работает. размер изображения составляет около 1,5 МБ. должен ли я изменить его размер или?

где я ошибаюсь?

благодаря

    Глядя на демонстрацию, которую они имеют на своем веб-сайте: 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 <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 (eg 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, включая Album Art, выше код работает отлично. Вам нужно иметь библиотеку getID3 для работы. Этот ответ основан на ответе Жакопэна, так что кредит ему