Работа с mp3 на PHP

Категория:

Спецификация mp3 определяет способ хранения музыкальных данных, однако не предусматривает никакой возможности для сохранения метаданных композиции, таких как название и исполнитель. Чтобы обойти это ограничение был разработан стандарт ID3. Согласно этой спецификации, метаданные должны быть помещены в так называемые ID3-теги, которые независимо от используемого стандарта ID3, помещаются в конец или начало файла. ID3-теги версии 1 (ID3v1-Tags) представляют собой простейшую конструкцию, которая дописывается в конец файла. Ее объем не должен превышать 128 байт. Структура тега такова: после строкового значения “TAG» следует информация о названии (30 символов), исполнителе (30 символов), альбоме (30 символов), годе записи (четырехзначное число), комментарий (30 символов), жанр (1 байт). Тег с подобной структурой обозначается как ID3v1.0-Tag. В дополнение к этому существует еще стандарт ID3v1.1-Tag, который встречается значительно чаще, поскольку позволяет сохранять информацию о порядковом номере композиции в альбоме. Вследствие этого был урезан до 28 символов размер комментария. Сразу после комментария следует нуль-байт, а последующий байт содержит информации о номере трэка. На иллюстрации один и два видна структура обоих стандартов.

PEAR придет на помощь!

Для считывания информации из ID3v1 тегов, в библиотеку PEAR уже был включен пакет MP3_Id[3], который поможет Вам без проблем извлекать информацию из тега, или наоборот записывать. Если в файл отсутствует ID3-тег, вы можете его создать. Листинг 1 показывает как можно считывать информацию из тегов. Создается объект класса MP3_ID, считывается файл, а затем метод getTag() извлекает данные, которые помещаются для дальнейшей обработки в отдельные поля объект. Листинг 2 показывает результат действия программы листинга 1. Общий обзор доступных полей вы найдете в документации по пакету на домашней странице PEAR.

Листинг 1

<?php 
require_once 'MP3/Id.php'

// Создаем объект, читаем файл 
$id3 = &new MP3_Id(); 
$result $id3->read('../data/Little-Big-Man.mp3'); 
if (
PEAR::isError($result)) { 
die(
$result->getMessage() . "\n"); 

// Читаем поля и выводим информацию 
echo 'Название: ' $id3->getTag('name') . "\n"
echo 
'Исполнитель: ' $id3->getTag('artists') . "\n"
echo 
'Альбом: ' $id3->getTag('album') . "\n"
echo 
'Год: ' $id3->getTag('year') . "\n"
echo 
'Комментарий: ' $id3->getTag('comment') . "\n"
echo 
'Жанр: ' $id3->getTag('genre') . "\n"
echo 
'Жанр (число): ' $id3->getTag('genreno') . "\n"
echo 
'Трэк: ' $id3->getTag('track') . "\n"
?>

Листинг 2:

Название: Little Big Man 
Исполнитель: Dirty Mac 
Альбом: Demo-Tape 
Год: 2001 
Комментарий: Песня из альбома Demo-Tape 
Жанр: Rock 
Жанр (число): 17 
Трэк: 5 

Листинг 3 показывает как просто можно изменять содержимое ID3-тегов и создавать их. Сначала, как это было показано в Листинге 1, создаем объект класса MP3_ID, считываем файл, а с помощью метода setTag($fieldname, $value) помещаем в тег нужную информацию. Хотите удалить все теги? Тогда посмотрите на листинг 4, где показано как можно сделать это. Для удаления тегов используется метод remove(), а остальное вы уже знаете. Необходимо дополнить, что MP3_Id обладает другими полезными функциями, которые вам позволят перенести содержимое тега из одного файла в другой или сформировать массив, содержащий все музыкальные направления. Для получения дополнительной информации смотрите документацию.

Листинг 3:

<?php 
require_once 'MP3/Id.php'

// создаем объект, читаем данные 
$id3 = &new MP3_Id(); 
$result $id3->read('../data/Little-Big-Man.mp3'); 
// Ошибка "Tag not found" игнорируется 
if (PEAR::isError($result) && $result->getCode() !== PEAR_MP3_ID_TNF) { 
die(
$result->getMessage() . "\n"); 

// Определяем информацию 
$id3->setTag('name''Neuer Titel'); 
$id3->setTag('artists''Andere Band'); 
$id3->setTag('album''Schlagertraum #3'); 
$id3->setTag('year'1984); 
$id3->setTag('comment''Volksmusikal. Hochgenuss'); 
$id3->setTag('genre''Folk'); 
$id3->setTag('track'5); 

// Записываем информацию в тег 
$result $id3->write(); 
if (
PEAR::isError($result)) { 
die(
$result->getMessage() . "\n"); 

echo "Тег успешно записан.! \n"
?>

Листинг 4:

<?php 
require_once 'MP3/Id.php'

// Создаем объект, читаем файл 
$id3 = &new MP3_Id(); 
$err $id3->read('../data/Little-Big-Man.mp3'); 
if (
PEAR::isError($err)) { 
die(
$err->getMessage() . "\n"); 

// Удаляем тег 
$result $id3->remove(); 
if (
PEAR::isError($result)) { 
die(
$result->getMessage() . "\n"); 

echo "Тег успешно стерт! \n"
?>