Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MP3 теги, Как их читать и редактировать? 
:(
    Опции темы
uvsoft
  Дата 26.8.2003, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 4.2.2003

Репутация: нет
Всего: нет



Привет, народ!
Не подскажете ответ вот на такой вопрос: как редактировать MP3-теги, plz?
Спасибо
--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
Dexter
Дата 26.8.2003, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1562
Регистрация: 2.7.2002
Где: Москва, Бирюлево

Репутация: нет
Всего: 4



Тэги находятся в конце мп3 файла, а редактировать их можно через TFileStream.


--------------------
The only thing you really know about me is...
...that's all you'll ever know
PM MAIL ICQ   Вверх
uvsoft
Дата 26.8.2003, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 123
Регистрация: 4.2.2003

Репутация: нет
Всего: нет



Dexter!
Может покажешь пример? Абстрактными фразами все могут бросаться... а вот на деле...
--------------------
Старый глюк лучше новых двух.
PM MAIL ICQ   Вверх
Dexter
Дата 27.8.2003, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1562
Регистрация: 2.7.2002
Где: Москва, Бирюлево

Репутация: нет
Всего: 4



Код


procedure TForm1.Button1Click(Sender: TObject);
var
 fs: TFileStream;
 ch: char;
 TAG, Title, Artist, Album, Year, Comment: String;
 i, track, genre: integer;
begin
 fs:=TFileStream.Create('E:\1.mp3',fmOpenReadWrite);
 fs.Position:=fs.Size-128;

 // Ключевое слово TAG
   for i:=1 to 3 do begin
     fs.ReadBuffer(ch,1);
     TAG:=TAG+ch;
   end;

 // Tag Title
   for i:=1 to 30 do begin
     fs.ReadBuffer(ch,1);
     Title:=Title+ch;
   end;

 // Tag Artist
   for i:=1 to 30 do begin
     fs.ReadBuffer(ch,1);
     Artist:=Artist+ch;
   end;

 // Tag Album
   for i:=1 to 30 do begin
     fs.ReadBuffer(ch,1);
     Album:=Album+ch;
   end;

 // Tag Year
   for i:=1 to 4 do begin
     fs.ReadBuffer(ch,1);
     Year:=Year+ch;
   end;

 // Tag Comment
   for i:=1 to 30 do begin
     fs.ReadBuffer(ch,1);
     Comment:=Comment+ch;
   end;

 fs.ReadBuffer(ch,1);
 // Tag Track
 fs.ReadBuffer(track,1);
 // Tag Genre
 fs.ReadBuffer(genre,1);
 fs.free;

end;


Да и еще забыл: редактирвать таке только через TFileStream.Write
И если нету тэга трек то то Comment расползается на 30 байт а если он есть то 28 (ИМХО)

Это сообщение отредактировал(а) Dexter - 27.8.2003, 12:06


--------------------
The only thing you really know about me is...
...that's all you'll ever know
PM MAIL ICQ   Вверх
Medved
Дата 28.8.2003, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154



FAQ.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Akella
Дата 31.8.2003, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



Предлагаю код
Код
Просмотр и редактирование тэга ID3 (MP3)
Тэг ID3 содержит информацию о композиции: исполнитель, жанр и т.п. Этот кусок информации содержится в последних 128 байтах файла. Начинается тэг словом "TAG". Его может и не быть, если тэг удален или не был заполнен при создании. Однако его всегда можно добавить. Тэг ID3 имеет следующий формат:

type TID3Rec = packed record
 Tag      : array[0..2] of Char;
 Title,
 Artist,
 Comment,
 Album    : array[0..29] of Char;
 Year     : array[0..3] of Char;
 Genre    : Byte;
end;

Как видно, жанр кодируется всего байтом, поэтому нужно следующее описание для декодирования этой информации:

const MaxID3Genre=147;
ID3Genre: array[0..MaxID3Genre] of string = (
'Blues', 'Classic Rock', 'Country', 'Dance',
...
'Synthpop' {возможно, список будет расширен}
);

Для чтения тэга ID3 служит процедура FillID3TagInformation:

procedure FillID3TagInformation (mp3File: string; Title,Artist,
                                       Album,Year,Genre,Comment:TEdit);
var ID3 : TID3Rec;
fmp3: TFileStream;
begin
fmp3:=TFileStream.Create(mp3File, fmOpenRead);
try
fmp3.position:=fmp3.size-128;
fmp3.Read(ID3,SizeOf(ID3));
finally
fmp3.free;
end;
if ID3.Tag <> 'TAG' then begin
Title.Text:='Wrong or no ID3 tag information';
Artist.Text:='Wrong or no ID3 tag information';
Album.Text:='Wrong or no ID3 tag information';
Year.Text:='Wrong or no ID3 tag information';
Genre.Text:='Wrong or no ID3 tag information';
Comment.Text:='Wrong or no ID3 tag information';
end else begin
Title.Text:=ID3.Title;
Artist.Text:=ID3.Artist;
Album.Text:=ID3.Album;
Year.Text:=ID3.Year;
if ID3.Genre in [0..MaxID3Genre] then
Genre.Text:=ID3Genre[ID3.Genre]
else
Genre.Text:=IntToStr(ID3.Genre);
Comment.Text:=ID3.Comment
end;
end;

Этот код использует объект TFileStream для доступа к тэгу ID3. После открытия файла указатель устанавливается на позицию EndOfFile-128. Если в этой позиции найдено слово "TAG", информация копируется в соответствующие поля редактирования, иначе эти поля заполняются сообщениями по умолчанию.

Вот, пожалуй, и все. Запись тэга ID3 предлагается к самостоятельному изучению - пусть хоть что-то напишется вашими руками.

PM MAIL   Вверх
Dexter
Дата 1.9.2003, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1562
Регистрация: 2.7.2002
Где: Москва, Бирюлево

Репутация: нет
Всего: 4



Это ты здесь нашел?


--------------------
The only thing you really know about me is...
...that's all you'll ever know
PM MAIL ICQ   Вверх
Akella
Дата 1.9.2003, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 1
Всего: 329



нет! нашел на www.rtfm
PM MAIL   Вверх
Bifor
Дата 5.9.2003, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 5.9.2003

Репутация: нет
Всего: нет



 Народ. Про  tag  ID3v1 это вы верно говорите что в конце файла (128 байт)
а про ID3v2 вы походу забыли или не захотели разбираться.
Так вот: часто тег находится в начале файла. он неограничен по размеру, ну и полей
больше. Алгоритм там екнутый на словах и не опишеш. 
Тут примерчик он читает тег ID3v1 если его нет то читает ID3v2.

Код

Procedure GetMp3Tag(Filename:string;var tagrec:ttagrec);
 // TTagRec = array [0..11] of string;
label
  exitproc;
const
  MAXBytes = (High(integer) - $F) div sizeof(byte);
type
  TByteArray = array[0..MAXBytes] of byte;
  PByteArray = ^TByteArray;
  Tconstmas = array [0..11,0..6] of byte;
const
  ID3v2: array[0..2]of byte  =(73,68,51);
  EndID3:array[0..1]of byte  =(255,251);

   Constlist:Tconstmas=(
   (84,69,78,67,0,0,0),(87,88,88,88,0,0,0),(84,67,79,80,0,0,0),
   (84,79,80,69,0,0,0),(84,67,79,77,0,0,0),(84,67,79,78,0,0,0),
   (84,82,67,75,0,0,0),(67,79,77,77,0,0,0),(84,89,69,82,0,0,0),
   (84,65,76,66,0,0,0),(84,80,69,49,0,0,0),(84,73,84,50,0,0,0));
   {Encodedby,URL,Copyrigth,Origartist,Composer,Genre,
   Track,Comment,Year,Album:Artist:Title}


var
  Buf : PByteArray;
  FileLength,FileHandle,i,j,k,nseek,lengthtag,SizeBuf,nconstlist: Integer;
  stn:word;
  bool:boolean;
begin
try
  FileHandle := FileOpen(Filename,2);
  // Проверка на ID3v2
  SizeBuf:=2;
  GetMem(Buf, SizeBuf*sizeof(byte));
  FileSeek(FileHandle,0,0);
  FileRead(FileHandle,Buf^,3);
  bool:=true;
  for i:=0 to 2 do
   if Buf^[i]<>ID3v2[i] then bool:=false;

   //Проверка на ID3v1
  if bool=false then begin
  FreeMem(Buf, SizeBuf*sizeof(byte));
    SizeBuf:=128;
    GetMem(Buf, SizeBuf*sizeof(byte));
    FileLength := FileSeek(FileHandle,0,2);
    FileSeek(FileHandle,filelength-128,0);
    FileRead(FileHandle,Buf^,128);
    for i:=0 to 29 do begin
     TagRec[11]:=tagrec[11]+chr(buf^[i+3]);  //title
     TagRec[10]:=tagrec[10]+chr(buf^[i+33]); //artist
     TagRec[9]:=tagrec[9]+chr(buf^[i+63]);   //album
    end;
    for i:=0 to 31 do
     TagRec[8]:=tagrec[8]+chr(buf^[i+93]);   //coment
     TagRec[7]:=tagrec[7]+inttostr(buf^[126]);   //track
     TagRec[6]:=tagrec[6]+inttostr(buf^[127]);   //genre
    goto exitproc;
  end;


  FreeMem(Buf, SizeBuf*sizeof(byte));
//Поиск конца ID3v2
  LengthTag:=0;
  SizeBuf:=1;
  GetMem(Buf, SizeBuf*sizeof(byte));
  nseek:=0;
  repeat
    FileSeek(FileHandle,nseek,0);
    FileRead(FileHandle,Buf^,2);
    bool:=true;
    for i:=0 to 1 do
     if Buf^[i]<>EndID3[i] then bool:=false;
    if bool=true then lengthtag:=nseek;
    inc(nseek);
  until bool=true;
//  edit3.text:=inttostr(lengthtag);
  FreeMem(Buf, SizeBuf*sizeof(byte));

//Считываем Весь Тег
  SizeBuf:=LengthTag;
  GetMem(Buf, SizeBuf*sizeof(byte));
  nseek:=0;
    FileSeek(FileHandle,nseek,0);
    FileRead(FileHandle,Buf^,LengthTag);

//Заносим данные из тега в массив
    nseek:=10;
      stn:=0;
    repeat
      nconstlist:=0;
      repeat
      bool:=true;
      for j:=nseek to nseek+6 do
        if buf^[j]<>constlist[nconstlist,j-nseek] then bool:=false;
      if bool=false then inc(nconstlist);
      until (nconstlist=12) or (bool=true);

      if bool=true then begin
        for k:=nseek+11 to nseek+11+buf^[nseek+7]-2 do
          TagRec[nconstlist]:=tagrec[nconstlist]+chr(buf^[k]);
        end;
        nseek:=nseek+11+buf^[nseek+7]-1;
        inc(stn);
      until stn>=12;

exitproc:
  if tagrec[1]<>'' then Delete(tagrec[1],1,1);

finally
  FreeMem(Buf, SizeBuf*sizeof(byte));
  FileClose(FileHandle);
end;
end;



 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.