我从来不承认我是一个完美主义者,不过昨天不得不承认了。我花了3个小时的时间重新整理了我的F:/mp3/*.mp3所有近600个文件的ID3标签。
在我的播放列表里添加一个文件非常的麻烦。首先下载歌曲,然后重新压成96Kbps或128Kbps的mp3文件,然后把文件名改成“歌手+空格+歌名”的样子。然后用Mp3 Gain把音量统一为89dB。然后,下载.lrc歌词文件,去掉歌词文件里的广告和制作人信息,可能还要重新编辑一下时间轴。最后把mp3文件放在F:/mp3目录下面,把歌词文件放在F:/mp3/lrc目录下面。添加进Winamp的播放列表后,有时会看见歌曲名带有网址的,那是ID3标签里的。如果把这个ID3标签留着的话,MSN上的正在收听就不好看了。为此,我干脆去掉所有mp3文件的ID3标签。这样,不管是什么地方,只要文件没有ID3,歌曲显示的就是我的文件名,而我的文件名肯定都是正确的。
昨天去买了iPod nano,二代,2G。iPod的价格都是打算吃人的,尤其是配件。不说Hi-Fi和inMotion了,就连漫步者的某个iPod音响就是600多银子。买个套套都要花很多钱,幸好它那里送了一个。
同步到iPod后我才发现ID3标签有多重要。iPod(当然也包括一些其它的mp3)用ID3的标签对音乐进行分类。你可以按音乐人和专辑来搜索歌曲。其它很多功能也需要完备的ID3标签。这下好了,我的ID3标签全部空白。早知道的话,不删除那些ID3标签该多好啊,至少现在我想重新完善ID3标签也有一些参考信息嘛。不然的话,难道重新添加ID3标签只能上网一个个搜索每首歌对应的专辑和曲目号?我600首歌呢,整死你。
后来我想到好办法了。我不是有歌词文件吗?歌词文件里不是有[ti:]、[ar:]和[al:]吗?我的歌词文件名和mp3一一对应,方便文件操作。但网上从来没找到过类似的程序可以提取.lrc文件的信息加入ID3标签。于是我打算自己编一个。这个程序很简单,我也就直接用的FP了,没用Delphi。
我花了一些时间研究了一下ID3的格式。用WinHex看几个试试,ID3 v1比v2的格式更简单,直接添加在Mp3的最末尾,你用Winamp改几个标签然后用WinHex一看就明白了。.lrc的格式更不说了,白痴都看得懂。
以下程序代码可以自动搜索程序所在目录下的mp3文件,使用lrc子目录下的相应歌词文件中的歌曲名、音乐人和专辑信息实现自动添加ID3信息。该程序在FPC 2.0下测试。通篇代码没有一个注释,结构比较乱。毕竟是给我自己看的,当时没想过要发布上来。program id3rename;
uses dos;
type
info=record
title,artist,album:string[26];
end;
var
Mp3:array[1..20000000]of char;
function GetInfo(FileName:string):info;
var
ch:char;
LrcInfo:info;
Lines:integer;
Content:boolean;
begin
Lines:=1;
LrcInfo.title:='';
LrcInfo.artist:='';
LrcInfo.album:='';
{$I-}
assign(input,FileName);
reset(input);
{$I+}
if ioresult<>0 then exit(LrcInfo);
repeat
read(ch);
if ord(ch)=13 then inc(Lines)
else if ch=']' then Content:=false
else if ch='[' then Content:=true;
if Content then
if Lines=1 then LrcInfo.title:=LrcInfo.title+ch
else if Lines=2 then LrcInfo.artist:=LrcInfo.artist+ch
else if Lines=3 then LrcInfo.album:=LrcInfo.album+ch;
until Lines=4;
delete(LrcInfo.title,1,4);
delete(LrcInfo.artist,1,4);
delete(LrcInfo.album,1,4);
close(input);
exit(LrcInfo);
end;
procedure SaveTag(LrcInfo:info;FileName:string;Total:longint);
var
FileSize:longint;
procedure InsertText(a:string;l:longint);
var
i:longint;
begin
for i:=1 to l do
if i<=length(a) then Mp3[FileSize+i]:=a[i]
else Mp3[FileSize+i]:=chr(0);
FileSize:=FileSize+l;
end;
var
i:longint;
begin
assign(input,FileName);
reset(input);
FileSize:=0;
for FileSize:=1 to total do
read(Mp3[FileSize]);
close(input);
InsertText('TAG',3);
InsertText(LrcInfo.title,30);
InsertText(LrcInfo.artist,30);
InsertText(LrcInfo.album,65);
Mp3[FileSize]:=chr(255);
assign(output,FileName);
rewrite(output);
for i:=1 to FileSize do write(Mp3[i]);
close(output);
end;
procedure main;
var
dir:SearchRec;
LrcInfo:info;
begin
FindFirst('*.mp3',archive,Dir);
while (DosError=0) do
begin
FindNext(Dir);
delete(Dir.name,length(Dir.name)-2,3);
LrcInfo:=GetInfo('lrc/'+Dir.name+'lrc');
SaveTag(LrcInfo,Dir.name+'mp3',Dir.size);
assign(input,'');
reset(input);
assign(output,'');
rewrite(output);
writeln(Dir.name,' Finished!');
//readln;
end;
FindClose(Dir);
end;
begin
main;
end.
郑重声明:如果你读不懂这个代码,千万别去玩火。而且这是批量的玩火。搞坏了你的mp3文件的话我概不负责,到时候看你找谁哭去。如果你真的需要这个程序的话,在下面留言,我会考虑搞个发布版。我还有一些想法,要是这个程序能自动上网找曲目号、发行年份和专辑封面之类的就好了。国外有类似的软件,因为美国佬的网上有这一类的开放的数据库。国内呢?如果大家有好的数据库的话也欢迎在下面留言提供一下。
接下来,使用个人认为最好的标签编辑软件ID3-TagIT 3。批量把ID3 v1转换为v2,然后手工改一些不完美的信息。比如,调整同样的东西不同的名称,例如把she、SHE、S.H.E、S.H.E(女朋友)、S.H.E(女朋友)之类的全部改成S.H.E,这样才能在按音乐人分类时准确地把同一个人的歌搞在一块。这个软件十分强大,允许你选择多个文件统一编辑某项信息。当然,它也允许按指定的格式从文件名中提取信息。有人会问,那我为什么不从文件名提取信息呢?笨蛋,前面我说过我是用空格来分隔歌手和歌名的。鬼知道“Avirl Lavigne Complicated.mp3”是不是指Avirl唱的Lavigne Complicated。
一切搞完了,还要Save一次,软件才会真正的改动文件。哈哈,这下就爽了。当然,这样的ID3还不完善,我就等着大家推荐一些在线歌曲数据了。这下Perfect了,同步到iPod,爽。
做人要厚道
转贴请注明出处
关于ID3标签:一个完美主义者的经历
最新推荐文章于 2024-05-25 09:46:05 发布