Так случилось, что один из моих проектов, находящихся здесь, ожидает завершения (около 80%, я больше любитель, когда дело доходит до Delphi, и у меня были более неотложные дела, затем я нашел программу, которую я смог загрузить, которая подходит мои требования точно) является полноценным редактором тегов ID3 для файлов MP3. В то время как v1 было очень легко, v2 намного сложнее. Вы можете обратиться к стандартному документу для версии 2.3 здесь. Но я ограничусь рассмотренными здесь моментами.
В зависимости от приложения вам могут понадобиться теги ID3v2. Мой портативный MP3-плеер принимает только теги v2, что в первую очередь и подтолкнуло меня к этому проекту.
Теги ID3v2 записываются в начале файлов переменной длины с переменным количеством тегов, которые могут присутствовать или отсутствовать. К счастью, полная длина данных должна быть в первой записи, если это файл с тегами ID3v2. Следовательно, прочитайте файл, найдите длину данных ID3v2, затем перепишите файл без данных ID3v2, и теги будут удалены. Наличие данных в начале делает это необходимым и действительно вызывает разочарование. Все, что я буду делать с кодом в будущем, будет связано с попыткой изменить данные на месте. Далее следует некоторый очень грязный код, который работал с AFAIR, но вам нужно будет очистить его, если вы его используете (я уверен, что некоторые из присутствующих сочтут нужным указать, как я должен). Но проверьте это хорошо, чтобы быть уверенным. Также не забудьте спросить, не пропустил ли я что-нибудь из модуля, из которого я скопировал это (это pas-файл размером 19,3 КБ), что вам может понадобиться:
type
sarray = array[0..3] of byte;
psarray = ^sarray;
ID3v2Header = packed record
identifier: array[0..2] of char;
major_version: byte;
minor_version: byte;
flags: byte;
size: DWord;
end;
function size_decodeh(insize: DWord): DWord;
{ decodes the size headers only, which does not use bit 7 in each byte,
requires MSB conversion as well }
var
outdval: DWord;
outd, ind: psarray;
tnext2, pnext2: byte;
begin
outdval := 0;
outd := @outdval;
ind := @insize;
tnext2 := ind^[2] shr 1;
pnext2 := ind^[1] shr 2;
outd^[0] := ind^[3] or ((ind^[2] and $01) shl 7);
outd^[1] := tnext2 or ((ind^[1] and $03) shl 6);
outd^[2] := pnext2 or ((ind^[0] and $07) shl 5);
outd^[3] := ind^[0] shr 3;
Result := outdval;
end;
procedure ID3v2_LoadData(filename: string; var memrec: pointer;
var outsize: integer);
{ procedure loads ID3v2 data from "filename". Returns outsize = 0 if
there is no ID3v2 data }
var
infile: file;
v1h: ID3V2Header;
begin
assign(infile, filename);
reset(infile, 1);
// read main header to get id3v2 size
blockread(infile, v1h, sizeof(v1h));
// detect if there is id3v2 data
if v1h.identifier = 'ID3' then
begin
outsize := size_decodeh(v1h.size);
// read ID3v2 header data
getmem(memrec, outsize);
blockread(infile, memrec^, outsize);
Close(infile);
end
else
outsize := 0;
end;
function id3v2_erase(infilestr: string): boolean;
{ erase all ID3v2 data. Data are stored at the beginning of file, so file
must be rewritten }
const
tempfilename = 'TMp@!0X.MP3';
var
memrec: pointer;
outsize, dataread: integer;
IsID3v2: boolean;
databuffer: array[1..32768] of byte;
newfile, origfile: file;
begin
// reuse service routine to get information
Id3v2_loaddata(infilestr, memrec, outsize);
// is there ID3v2 data?
if outsize > 0 then
begin
// need to clean up after the service routine
freemem(memrec);
// get amount of data to erase
outsize := outsize + sizeof(Id3v2Header);
writeln('Data to delete is: ', outsize, ' bytes.');
// now rewrite the file
AssignFile(origfile, infilestr);
reset(origfile, 1);
AssignFile(newfile, tempfilename);
rewrite(newfile, 1);
Seek(origfile, outsize);
repeat
blockread(origfile, databuffer, sizeof(databuffer), dataread);
blockwrite(newfile, databuffer, dataread);
until dataread = 0;
CloseFile(origfile);
CloseFile(newfile);
// rename temp file and delete original
DeleteFile(infilestr);
RenameFile(tempfilename, infilestr);
IsID3v2 := true;
end
else
IsID3v2 := false;
Result := IsID3v2;
end;
Полная возможность редактирования, которая работает практически во всех ситуациях, очевидно, является более сложной задачей, чем это, но все подробности есть в том документе, на который я дал ссылку. Надеюсь, это поможет вам.
person
Glenn1234
schedule
05.01.2013