我正在使用旧的好 MPGTools
和自己的在 MP3 文件中设置 ID3 标签的简单方法。但这两种方法都太旧了,无法支持 ID3Tag 版本 2。我正在寻找任何解决方案,允许我用 Delphi 7 编写的应用程序从它处理的每个文件中删除 ID3Tag 或将其设置为与 ID3Tag 完全相同的值版本 1 已设置。
目前我正在使用 Winamp 中的快速键盘组合手动删除 ID3Tagv2。
我不使用 v2 或专辑封面或所有这些"new"添加,因此摆脱 ID3Tagv2(如果它存在于特定文件中)的最快方法将是我所需要的。
当然,我尝试使用 Google 搜索互联网,但要么我今天心情不好,要么我问了错误的问题,因为我在上述问题上得到的所有结果都是来自搜索引擎的虚假结果像 Software Informer 等窃取者。
最佳答案
碰巧的是,我的一个项目坐在这里等待完成(大约 80%,当谈到 Delphi 时,我更像是一个爱好者,并且出现了更紧迫的事情,然后我找到了一个我能够完成的程序下载它正好符合我的要求)是 MP3 文件的完整 ID3 标签编辑器。虽然 v1 非常简单,但 v2 却困难得多。您可以引用standard document for v2.3 here 。 但我将仅限于此处讨论的要点。
您可能需要 ID3v2 标签,具体取决于应用程序。我的可移植 MP3 播放器仅接受 v2 标签,这就是促使我首先完成该项目的原因。
ID3v2 标签以可变长度方式写入文件的开头,标签数量可变,可能存在也可能不存在。幸运的是,如果它是 ID3v2 标记文件,则数据的完整长度应该位于第一个记录中。因此,读取文件找到ID3v2数据的长度,然后重写没有ID3v2数据的文件并删除标签。一开始就拥有数据使得这是必要的,而且确实令人沮丧。我将来对代码所做的任何事情都将涉及尝试就地更改数据。接下来是一些非常脏的代码,AFAIR 可以工作,但是如果使用的话,您将需要清理(我确信这里的一些人会满足于准确地指出我应该如何做)。但要好好测试一下才能确定。另外,请务必询问我是否遗漏了我复制的单元(这是一个 19.3KB 的 pas 文件)中您需要的任何内容:
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;
适用于大多数情况的完整编辑功能显然比这更难攀登,但所有详细信息都在我链接的文档中。希望这对您有所帮助。
关于delphi - 使用 Delphi 7 从 MP3 文件中删除或编辑 ID3Tag 版本 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147402/