PHP статьи и уроки
Приветствую Вас, Гость!

Меню
Интересное:
Реклама:
Смотрю "Записки о MacBook и Mac OS", в блоге gamedev программиста.
Главная » Статьи » Статьи » Работа с графикой и мультимедиа

Расширения PHP для работы с mp3

Откуда знает MP3-Player, например Winamp информацию об исполнителе или названии композиции, которую он проигрывает? Может быть, он сам каким-то чудным образом узнает название песни и альбома? Нет, здесь нет никакого волшебства! Подобная информация содержится в самих файлах. Музыкальные файлы других форматов таких как WMA или Ogg Vorbis также содержат подобную информацию, но здесь речь пойдет о файлах в формате mp3.





Спецификация 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 обладает другими полезными функциями, которые вам позволят перенести содержимое тега из одного файла в другой или сформировать массив, содержащий все музыкальные направления. Для получения дополнительной информации смотрите документацию.

Listing 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";
?>

Listing 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";
?>

Используем PECL

В конце лета 2004 года появилось расширение PHP ext/id3[7]. Разрабатывается в рамках PECL[6]. В отличие от MP3_ID эта библиотека написана не на PHP, а на C, поэтому она должно работать несколько быстрее. Однако библиотека не входит в стандартный комплект PHP-исходников, к тому же на сегодняшний день отсутствует стабильная версия, хотя функции отвечающие за чтение и запись ID3-тегов считаются стабильными.

Если вы хотите использовать именно это расширение, для установки необходимо воспользоваться либо PEAR-installer, либо откомпилировать php, включив поддержку данного расширения. Если вы используете WINDOWS, существует возможность скачать уже откомпилированную DLL для версии php 5.0 или 5.01 с сайта PHP-Snapshot[9], поместить ее в каталог с расширениями php (например c:phpext), подключить через php.ini. Чтобы воспользоваться расширением, вы должны иметь PHP 4.3 или более позднюю версию, поскольку библиотека использует Streams-API.

Само собой разумеется, библиотека позволяет изменять содержимое ID3-тегов. Для этого вам не нужно ничего, кроме массива, представленного в листинге 6, и функции id3_set_tag(). В качестве первого параметра функция принимает имя изменяемого mp-3 файла, а в качестве второго - массив с необходимыми данными. Третий параметр необязателен и представляет собой константу, указывающую версию ID3-тега. В существующей версии библиотеки функция id3_set_tag() может работать только с тегами версии 1.0 или 1.1. Листинг 7 содержит необходимый php-код. В дополнение к этому, листинг 8 показывает как с помощью функции id3_remove_tag можно удалить существующий ID3-тег.

Ext/id3 содержит еще несколько полезных функций, которые позволяют определить версию ID3-тега (id3_get_version) или манипулируют со списком музыкальных направлений и их id, представленных в виде целого числа типа integer. Надо сказать, что данное число мало подходит для указания музыкального направления.

Listing 5:

<?php
// имя файла на локальном диске
$tag1 id3_get_tag('../data/Little-Big-Man.mp3'ID3_V1_1);
print_r($tag1);

// имя файла в виде URL
// Внимание! Или вы подключаетесь к DSL, или ждете  ;-)
$tag2 id3_get_tag('http://dirty-mac.com/sounds/little_big_man.mp3'ID3_V1_1);
print_r($tag2);

// идентификатор ресурса вместо имени файла
$fd fopen('../data/Little-Big-Man.mp3''r');
$tag3 id3_get_tag($fdID3_V1_1);
print_r($tag3);
?>

Listing 6:

Array
(
[title] => Little Big Man
[artist] => Dirty Mac
[album] => Demo-Tape
[year] => 2001
[comment] => Song vom Demo-Tape
[track] => 5
[genre] => 17
)

Listing 7:

<?php
$tag 
= array(
'title' => 'Новое название',
'artist' => 'Другая группа',
'album' => 'Schlagertraum #3',
'year' => 1984,
'genre' => id3_get_genre_id('Rock'),
'comment' => 'Отличная популярная мелодия',
'track' => 5
);

// Записываем тег
$result id3_set_tag('../data/Little-Big-Man.mp3'$tagID3_V1_1 );
if (
$result === false) {
echo 
"Тег не был успешно записан! \n";
}

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

Следующее поколение

Несмотря на то, что с помощь ID3v1-тегов уже можно сохранять важнейшую информацию о содержимом mp3-файла, уже проявляются ограничения версий 1.0 и 1.1:

  • из-за фиксированного размера тега ограничен объем сохраняемой информации
  • ограничено количество сохраняемых атрибутов

Как мы видим, расширить объем пространства, отведенный под ID3v1 теги нельзя, Существую трудности с сохранением информации о названии композиции, исполнителе, альбоме, комментарии, если размер данных превышает 30 символов. Допустим, вам нужно указать название The Hitchhiker's Guide to the Galaxy, используя стандарт ID3v1, вы можете сохранить лишь The Hitchhiker's Guide to. Та же ситуации наблюдается с указанием музыкального направления. Для этого выделяется только один байт, вследствие этого количество музыкальных направлений не может превышать 256. Наверное, сегодня этого достаточно, но кто знает, сколько в будущем появится еще музыкальных направлений.

Чтобы преодолеть указанные ограничения был введены ID3-теги версии 2[2], или короче ID3v2. ID3v2-теги записываются в начало файла, собственно перед самими аудио данными. Информация организована в отдельные единицы, которые обозначаются как фреймы. ID3v2 - это формат-контейнер, то есть, существует возможность при изменении тега вводить новые фреймы. Из этого следует, что ID3v2 может содержать значительно больше информации, чем ID3v1. Это может быть информация об авторских правах, битрейте, (BMP) или, наконец, полный текст песни или изображения. В дополнение к этому можно по желанию добавлять новые фреймы. Вот важнейшие достоинства данного формата:

  • Никаких ограничений на объем сохраняемой информации
  • Гибкость и расширяемость
  • Возможность сжатия содержимого тегов
  • Поддержка Unicode
  • Возможность хранить бинарные данные, например изображения и файлы.

Из-за расширенных возможностей ID3v2-теги, несколько труднее поддаются считыванию, чем ID3v1-теги. Хорошая новость состоит в том, что ext/id3 уже позволяет извлекать важнейшую информацию. Если вы исполните код, помещенный в листинг 9, вы получите тот же результат, что и в листинге 10. Проделав это, вы сможете убедиться, что объем выводимых данных значительно шире, чем тот, что показан в листингах 5 и 6.

Каждый фрейм ID3v2-тега обладает уникальным ID. Ext/id3 содержит две функции, которые позволяют узнать содержимое фрейма. Это id3_get_frame_short() и id3_get_frame_long_name(). В качестве параметра они принимают id фрейма и возвращают его описание.

В будущих версиях ext/id3 будет содержать другие полезные функции, которые позволят считывать или записывать фреймы, соответствующие спецификации ID3.

Листинг 8:

<?php
// удаляет тег
$result id3_remove_tag('../data/Little-Big-Man.mp3');

if (
$result === false) {
echo 
"Тег не удален.! \n";
}

echo 
"Тег успешно удален! \n";
?>

Listing 9:

<?php
//Читаем тег ID3v2 
$tag id3_get_tag('../data/Little-Big-Man.mp3'ID3_V2_3);
print_r($tag);
?>

Дополнительная информация

Прежде чем вы организуете бизнес, связанный с продажей музыкальных композиций online, мы вам расскажем еще о нескольких полезных возможностях библиотеки MP3_Id. С помощью нее можно не только считывать информацию ID3- тегов, она позволяет получить некоторую интересную информацию о самом mp3-файле. Речь идет о битрейте, длительности звучания и других полезных свойствах. Подобные сведения можно получить при помощи метода study(), а дальше посредством метода getTag(), можно выбирать необходимые данные. Листинг 12 показывает как это работает. Результат работы программы показан в листинге 13. К сожалению, эти возможности недостаточно документированы, т.е. трудно разобраться какой атрибут можно считать при помощи getTag() или изменить посредство setTag(). В этом случае необходимо изучить код модуля MP3/Id.php.

Listing 10:

Array
(
[copyright] => Dirty Mac
[originalArtist] => Dirty Mac
[composer] => Marcus Goetze
[artist] => Dirty Mac
[title] => Little Big Man
[album] => Demo-Tape
[track] => 5/12
[genre] => (17)Rock
[year] => 2001
)

Listing 11:

<?php
// Id ID3v2-Frames
$frame 'TOLY';
$short id3_get_frame_short_name($frame);
$descr id3_get_frame_long_name($frame);
echo 
"Frame: $frame \n";
echo 
"Kurzform: $short \n";
echo 
"Beschreibung: $descr \n";
?>

Listing 12:

<?php
require_once 'MP3/Id.php';

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

$result $id3->study();
if (
PEAR::isError($result)) {
die(
$result->getMessage() . "\n");
}

echo 
'MPEG ' $id3->getTag('mpeg_ver') . ' Layer ' $id3->getTag('layer') . "\n";
echo 
$id3->getTag('mode') . "\n";
echo 
'Размер файла: ' $id3->getTag('filesize') . " Bytes \n";
echo 
'Bitrate: ' $id3->getTag('bitrate') . "kB/s \n";
echo 
'Длительность: ' $id3->getTag('length') . " min \n";
echo 
'Samplerate: ' $id3->getTag('frequency') . "Hz \n";
?>

Listing 13:

MPEG 1 Layer 3
Joint Stereo
Размерe: 4089856 Bytes
Bitrate: 128kB/s
Длительность: 04:15 min
Samplerate: 44100Hz

Выводы

В этой статье мы рассмотрели существующие возможности извлечения информации из mp-3 файлов средствами PHP. Обе библиотеки (MP3_Id и id3) легки в использовании и содержать необходимые функции. Одна библиотека написана на PHP, другая на C. Выбор того или иного варианта определяется вашими предпочтениями и возможностями хостинга.



Источник: www.softtime.ru/info/articlephp.php?id_article=64
Категория: Работа с графикой и мультимедиа | Добавил: PHP (30.01.2009)
Просмотров: 7673 | Комментарии: 3 | Теги: php, Скрипт, работа со звуком, пример, расширение
Всего комментариев: 3
3  
Здравствуйте!
Очень нужна ваша помощь!
1)MP3_ID выдает ошибку "Unable to open", но не для всех файлов ,какие-то открывает.
2)Если в файле теги отсутствуют MP3_ID автоматически подставляет 0 т.к $default =0,(Название: 0 ) почему он не во все файлы подставляет 0 ,если теги отсутствуют
(Название: )?

ОООчень надеюсь на вашу помощь. Если вам удобно,пишите в личку.

2  
Нужна помощь! Вопрос связан с MP3_Id плагином.
Можно ли сделать,чтобы при загрузке mp3 файла во временную папку на одной странице,открыть этот же файл при переходе на другую страницу?
С помощью сессии сохраняются данные о загружаемом файле ,но вывести теги из временной папки не получается.
Как можно решить этот вопрос?

1  
http://www.fargate.ru/supernatural/cache/imge.148.9c8102597855be51dd821a2361cac29a.jpg землетрясение в кемерово 24 мая 2013 г землетрясение в кемеровской области 19 июня кандидаты на пост мэра москвы результаты егэ по математике 2013 татарстан екатерина приезжева взрыв в чапаевске 18 июня 2013 видео иностранная музыка запрет князь игорь в постановке любимова отзывы новости сирия взрыв газа под волгоградом росреестр http://parisw7711.livejournal.com/14653.html - виталий милонов запрет музыки http://niveaulos-gilde.de/viewtopic.php?f=2&t=629449 - женщинам в 23 года в армию запрет на курение в общественных местах закон о службе девушек в армии 2013 цискаридзе путин развелся с женой минингит в ростове разрушения в белово после землетрясения владимир якунин биография путины разводятся женщинам в 23 года в армию результаты егэ по математике 2013 когда будут известны http://nvflyap.livejournal.com/14867.html - взрывы на приволжском полигоне пожар в нижегородской области 17 06 2013 ле-бурже ситуация в турции 17 06 2013 отставка якунина в 2013 году кацыв петр дмитриевич менингит в ростове-на-дону зрк витязь карибский кризис 1962 года результаты егэ по физике 2013 самарская область микаил кадиев инфляция в россии 2012 игровые автоматы пожар в архангельске на мосту http://www.americansnipers.org/member.php?199814-geryWesemes - взрывы чапаевск http://anatosyaa9.livejournal.com/15067.html - весенний призыв 2013 http://i1.imageban.ru/thumbs/2010.12.25/ecead841f89ad5c7a9235bb9946db088.png якунин владимир иванович отставка витязь андрей калмыков аэрофлот биография новости дагестана сегодня черновик саид амиров су 35 с впервые поднялся в небо над ле бурже и выполнил штопор новости землетрясение в новосибирске менингит в ростове последние новости симптомы наталья федотова жена олега видова фото школьная форма 2013 су35с пво витязь запрет на курение в общественных местах 2013 полунин цирк на фонтанке facebook землетресение в кемеровской области результаты егэ по русскому языку 2013 конфликт в удомле толчки в кемерово гибель гагарина концерт на дворцовой площади 20 июня 2013 http://www.ukrat.ru/index.php?/besplatnaya-yuridicheskaya-konsultacziya-onlajn-v-g-moskve-trudovoj-kodeks-zhilis hhnye-voprosy-semejnoe-pravo-razvod-razdel.html - бесплатная юридическая консультация по трудовому праву онлайн http://asuncionqom.livejournal.com/28991.html - полигон в чапаевске закон о запрете курения в общественных местах с 1 июня 2013 в россии концерт на дворцовой площади 20 июня 2013 погода в томске салон ля бурже 2013 протесты в бразилии запрет на курение в общественных местах 2013 новости про амирова последние новости из сирии результаты егэ 2013 грузинское вино в россии план развития московского метро до 2020 года менингит в ростове на дону последние новости амиров последние новости результаты егэ по физике 2013 нижегородская область вспышка менингита в ростове на дону виталий милонов инфляция в россии сирия последние новости

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Copyright Viktor L.P. © 2017 Бесплатный конструктор сайтов - uCoz
down
Расширения PHP для работы с mp3 - Работа с графикой и мультимедиа - Статьи - Статьи, уроки - Уроки и статьи по PHP
Главная » Статьи » Статьи » Работа с графикой и мультимедиа

Расширения PHP для работы с mp3

Откуда знает MP3-Player, например Winamp информацию об исполнителе или названии композиции, которую он проигрывает? Может быть, он сам каким-то чудным образом узнает название песни и альбома? Нет, здесь нет никакого волшебства! Подобная информация содержится в самих файлах. Музыкальные файлы других форматов таких как WMA или Ogg Vorbis также содержат подобную информацию, но здесь речь пойдет о файлах в формате mp3.





Спецификация 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 обладает другими полезными функциями, которые вам позволят перенести содержимое тега из одного файла в другой или сформировать массив, содержащий все музыкальные направления. Для получения дополнительной информации смотрите документацию.

Listing 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";
?>

Listing 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";
?>

Используем PECL

В конце лета 2004 года появилось расширение PHP ext/id3[7]. Разрабатывается в рамках PECL[6]. В отличие от MP3_ID эта библиотека написана не на PHP, а на C, поэтому она должно работать несколько быстрее. Однако библиотека не входит в стандартный комплект PHP-исходников, к тому же на сегодняшний день отсутствует стабильная версия, хотя функции отвечающие за чтение и запись ID3-тегов считаются стабильными.

Если вы хотите использовать именно это расширение, для установки необходимо воспользоваться либо PEAR-installer, либо откомпилировать php, включив поддержку данного расширения. Если вы используете WINDOWS, существует возможность скачать уже откомпилированную DLL для версии php 5.0 или 5.01 с сайта PHP-Snapshot[9], поместить ее в каталог с расширениями php (например c:phpext), подключить через php.ini. Чтобы воспользоваться расширением, вы должны иметь PHP 4.3 или более позднюю версию, поскольку библиотека использует Streams-API.

Само собой разумеется, библиотека позволяет изменять содержимое ID3-тегов. Для этого вам не нужно ничего, кроме массива, представленного в листинге 6, и функции id3_set_tag(). В качестве первого параметра функция принимает имя изменяемого mp-3 файла, а в качестве второго - массив с необходимыми данными. Третий параметр необязателен и представляет собой константу, указывающую версию ID3-тега. В существующей версии библиотеки функция id3_set_tag() может работать только с тегами версии 1.0 или 1.1. Листинг 7 содержит необходимый php-код. В дополнение к этому, листинг 8 показывает как с помощью функции id3_remove_tag можно удалить существующий ID3-тег.

Ext/id3 содержит еще несколько полезных функций, которые позволяют определить версию ID3-тега (id3_get_version) или манипулируют со списком музыкальных направлений и их id, представленных в виде целого числа типа integer. Надо сказать, что данное число мало подходит для указания музыкального направления.

Listing 5:

<?php
// имя файла на локальном диске
$tag1 id3_get_tag('../data/Little-Big-Man.mp3'ID3_V1_1);
print_r($tag1);

// имя файла в виде URL
// Внимание! Или вы подключаетесь к DSL, или ждете  ;-)
$tag2 id3_get_tag('http://dirty-mac.com/sounds/little_big_man.mp3'ID3_V1_1);
print_r($tag2);

// идентификатор ресурса вместо имени файла
$fd fopen('../data/Little-Big-Man.mp3''r');
$tag3 id3_get_tag($fdID3_V1_1);
print_r($tag3);
?>

Listing 6:

Array
(
[title] => Little Big Man
[artist] => Dirty Mac
[album] => Demo-Tape
[year] => 2001
[comment] => Song vom Demo-Tape
[track] => 5
[genre] => 17
)

Listing 7:

<?php
$tag 
= array(
'title' => 'Новое название',
'artist' => 'Другая группа',
'album' => 'Schlagertraum #3',
'year' => 1984,
'genre' => id3_get_genre_id('Rock'),
'comment' => 'Отличная популярная мелодия',
'track' => 5
);

// Записываем тег
$result id3_set_tag('../data/Little-Big-Man.mp3'$tagID3_V1_1 );
if (
$result === false) {
echo 
"Тег не был успешно записан! \n";
}

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

Следующее поколение

Несмотря на то, что с помощь ID3v1-тегов уже можно сохранять важнейшую информацию о содержимом mp3-файла, уже проявляются ограничения версий 1.0 и 1.1:

  • из-за фиксированного размера тега ограничен объем сохраняемой информации
  • ограничено количество сохраняемых атрибутов

Как мы видим, расширить объем пространства, отведенный под ID3v1 теги нельзя, Существую трудности с сохранением информации о названии композиции, исполнителе, альбоме, комментарии, если размер данных превышает 30 символов. Допустим, вам нужно указать название The Hitchhiker's Guide to the Galaxy, используя стандарт ID3v1, вы можете сохранить лишь The Hitchhiker's Guide to. Та же ситуации наблюдается с указанием музыкального направления. Для этого выделяется только один байт, вследствие этого количество музыкальных направлений не может превышать 256. Наверное, сегодня этого достаточно, но кто знает, сколько в будущем появится еще музыкальных направлений.

Чтобы преодолеть указанные ограничения был введены ID3-теги версии 2[2], или короче ID3v2. ID3v2-теги записываются в начало файла, собственно перед самими аудио данными. Информация организована в отдельные единицы, которые обозначаются как фреймы. ID3v2 - это формат-контейнер, то есть, существует возможность при изменении тега вводить новые фреймы. Из этого следует, что ID3v2 может содержать значительно больше информации, чем ID3v1. Это может быть информация об авторских правах, битрейте, (BMP) или, наконец, полный текст песни или изображения. В дополнение к этому можно по желанию добавлять новые фреймы. Вот важнейшие достоинства данного формата:

  • Никаких ограничений на объем сохраняемой информации
  • Гибкость и расширяемость
  • Возможность сжатия содержимого тегов
  • Поддержка Unicode
  • Возможность хранить бинарные данные, например изображения и файлы.

Из-за расширенных возможностей ID3v2-теги, несколько труднее поддаются считыванию, чем ID3v1-теги. Хорошая новость состоит в том, что ext/id3 уже позволяет извлекать важнейшую информацию. Если вы исполните код, помещенный в листинг 9, вы получите тот же результат, что и в листинге 10. Проделав это, вы сможете убедиться, что объем выводимых данных значительно шире, чем тот, что показан в листингах 5 и 6.

Каждый фрейм ID3v2-тега обладает уникальным ID. Ext/id3 содержит две функции, которые позволяют узнать содержимое фрейма. Это id3_get_frame_short() и id3_get_frame_long_name(). В качестве параметра они принимают id фрейма и возвращают его описание.

В будущих версиях ext/id3 будет содержать другие полезные функции, которые позволят считывать или записывать фреймы, соответствующие спецификации ID3.

Листинг 8:

<?php
// удаляет тег
$result id3_remove_tag('../data/Little-Big-Man.mp3');

if (
$result === false) {
echo 
"Тег не удален.! \n";
}

echo 
"Тег успешно удален! \n";
?>

Listing 9:

<?php
//Читаем тег ID3v2 
$tag id3_get_tag('../data/Little-Big-Man.mp3'ID3_V2_3);
print_r($tag);
?>

Дополнительная информация

Прежде чем вы организуете бизнес, связанный с продажей музыкальных композиций online, мы вам расскажем еще о нескольких полезных возможностях библиотеки MP3_Id. С помощью нее можно не только считывать информацию ID3- тегов, она позволяет получить некоторую интересную информацию о самом mp3-файле. Речь идет о битрейте, длительности звучания и других полезных свойствах. Подобные сведения можно получить при помощи метода study(), а дальше посредством метода getTag(), можно выбирать необходимые данные. Листинг 12 показывает как это работает. Результат работы программы показан в листинге 13. К сожалению, эти возможности недостаточно документированы, т.е. трудно разобраться какой атрибут можно считать при помощи getTag() или изменить посредство setTag(). В этом случае необходимо изучить код модуля MP3/Id.php.

Listing 10:

Array
(
[copyright] => Dirty Mac
[originalArtist] => Dirty Mac
[composer] => Marcus Goetze
[artist] => Dirty Mac
[title] => Little Big Man
[album] => Demo-Tape
[track] => 5/12
[genre] => (17)Rock
[year] => 2001
)

Listing 11:

<?php
// Id ID3v2-Frames
$frame 'TOLY';
$short id3_get_frame_short_name($frame);
$descr id3_get_frame_long_name($frame);
echo 
"Frame: $frame \n";
echo 
"Kurzform: $short \n";
echo 
"Beschreibung: $descr \n";
?>

Listing 12:

<?php
require_once 'MP3/Id.php';

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

$result $id3->study();
if (
PEAR::isError($result)) {
die(
$result->getMessage() . "\n");
}

echo 
'MPEG ' $id3->getTag('mpeg_ver') . ' Layer ' $id3->getTag('layer') . "\n";
echo 
$id3->getTag('mode') . "\n";
echo 
'Размер файла: ' $id3->getTag('filesize') . " Bytes \n";
echo 
'Bitrate: ' $id3->getTag('bitrate') . "kB/s \n";
echo 
'Длительность: ' $id3->getTag('length') . " min \n";
echo 
'Samplerate: ' $id3->getTag('frequency') . "Hz \n";
?>

Listing 13:

MPEG 1 Layer 3
Joint Stereo
Размерe: 4089856 Bytes
Bitrate: 128kB/s
Длительность: 04:15 min
Samplerate: 44100Hz

Выводы

В этой статье мы рассмотрели существующие возможности извлечения информации из mp-3 файлов средствами PHP. Обе библиотеки (MP3_Id и id3) легки в использовании и содержать необходимые функции. Одна библиотека написана на PHP, другая на C. Выбор того или иного варианта определяется вашими предпочтениями и возможностями хостинга.



Источник: www.softtime.ru/info/articlephp.php?id_article=64
Категория: Работа с графикой и мультимедиа | Добавил: PHP (30.01.2009)
Просмотров: 7673 | Комментарии: 3 | Теги: php, Скрипт, работа со звуком, пример, расширение
Всего комментариев: 3
3  
Здравствуйте!
Очень нужна ваша помощь!
1)MP3_ID выдает ошибку "Unable to open", но не для всех файлов ,какие-то открывает.
2)Если в файле теги отсутствуют MP3_ID автоматически подставляет 0 т.к $default =0,(Название: 0 ) почему он не во все файлы подставляет 0 ,если теги отсутствуют
(Название: )?

ОООчень надеюсь на вашу помощь. Если вам удобно,пишите в личку.

2  
Нужна помощь! Вопрос связан с MP3_Id плагином.
Можно ли сделать,чтобы при загрузке mp3 файла во временную папку на одной странице,открыть этот же файл при переходе на другую страницу?
С помощью сессии сохраняются данные о загружаемом файле ,но вывести теги из временной папки не получается.
Как можно решить этот вопрос?

1  
http://www.fargate.ru/supernatural/cache/imge.148.9c8102597855be51dd821a2361cac29a.jpg землетрясение в кемерово 24 мая 2013 г землетрясение в кемеровской области 19 июня кандидаты на пост мэра москвы результаты егэ по математике 2013 татарстан екатерина приезжева взрыв в чапаевске 18 июня 2013 видео иностранная музыка запрет князь игорь в постановке любимова отзывы новости сирия взрыв газа под волгоградом росреестр http://parisw7711.livejournal.com/14653.html - виталий милонов запрет музыки http://niveaulos-gilde.de/viewtopic.php?f=2&t=629449 - женщинам в 23 года в армию запрет на курение в общественных местах закон о службе девушек в армии 2013 цискаридзе путин развелся с женой минингит в ростове разрушения в белово после землетрясения владимир якунин биография путины разводятся женщинам в 23 года в армию результаты егэ по математике 2013 когда будут известны http://nvflyap.livejournal.com/14867.html - взрывы на приволжском полигоне пожар в нижегородской области 17 06 2013 ле-бурже ситуация в турции 17 06 2013 отставка якунина в 2013 году кацыв петр дмитриевич менингит в ростове-на-дону зрк витязь карибский кризис 1962 года результаты егэ по физике 2013 самарская область микаил кадиев инфляция в россии 2012 игровые автоматы пожар в архангельске на мосту http://www.americansnipers.org/member.php?199814-geryWesemes - взрывы чапаевск http://anatosyaa9.livejournal.com/15067.html - весенний призыв 2013 http://i1.imageban.ru/thumbs/2010.12.25/ecead841f89ad5c7a9235bb9946db088.png якунин владимир иванович отставка витязь андрей калмыков аэрофлот биография новости дагестана сегодня черновик саид амиров су 35 с впервые поднялся в небо над ле бурже и выполнил штопор новости землетрясение в новосибирске менингит в ростове последние новости симптомы наталья федотова жена олега видова фото школьная форма 2013 су35с пво витязь запрет на курение в общественных местах 2013 полунин цирк на фонтанке facebook землетресение в кемеровской области результаты егэ по русскому языку 2013 конфликт в удомле толчки в кемерово гибель гагарина концерт на дворцовой площади 20 июня 2013 http://www.ukrat.ru/index.php?/besplatnaya-yuridicheskaya-konsultacziya-onlajn-v-g-moskve-trudovoj-kodeks-zhilis hhnye-voprosy-semejnoe-pravo-razvod-razdel.html - бесплатная юридическая консультация по трудовому праву онлайн http://asuncionqom.livejournal.com/28991.html - полигон в чапаевске закон о запрете курения в общественных местах с 1 июня 2013 в россии концерт на дворцовой площади 20 июня 2013 погода в томске салон ля бурже 2013 протесты в бразилии запрет на курение в общественных местах 2013 новости про амирова последние новости из сирии результаты егэ 2013 грузинское вино в россии план развития московского метро до 2020 года менингит в ростове на дону последние новости амиров последние новости результаты егэ по физике 2013 нижегородская область вспышка менингита в ростове на дону виталий милонов инфляция в россии сирия последние новости

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]