登陆

关于ID3标签:一个完美主义者的经历

    我从来不承认我是一个完美主义者,不过昨天不得不承认了。我花了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,爽。

« 上一篇 | 下一篇 »