谁知道如何读取音频文件信息?比如:歌曲名称(不是文件名)、演唱者等。

maren 2001-04-10 04:17:00
这些信息如:歌曲名称、演唱者等信息都藏在音频文件内部,如何将它读出来?
现在系统只让给50分,不够以后可以加的。
...全文
497 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
maren 2001-04-12
  • 打赏
  • 举报
回复
哦,看见了,刚才没看清楚!!给你加分喽!!
maren 2001-04-12
  • 打赏
  • 举报
回复
您上边的例子,我看不出读取的信息(名称、演唱者等)在哪里,比如函数ReadID3v1返回的参数是哪几个?我没看出来呀!
严黎斌 2001-04-12
  • 打赏
  • 举报
回复
没问题。
csdn还是比较慢,你可以发邮件。
我的邮件地址: yanlb@163.net
maren 2001-04-12
  • 打赏
  • 举报
回复
我试试,先把分给你加了,有问题再问你,你看行吗?
严黎斌 2001-04-11
  • 打赏
  • 举报
回复
源文件来了。这相当于一个读写id3v1信息的核心程序,外围界面是要你自己写的。

另外,这也是一种思路。你只要知道了其他格式文件存放信息的结构和位置,就可以同样写出类似的程序。


unit ID3Kernel;

interface

type
Tid3v1= record
Tag: array[0..2] of char; //00..02 , ='TAG'
Title:array[0..$1d] of char; //03..20
Artist:array[0..$1d] of char; //21..3e
Album:array[0..$1d] of char; //3f..5c
Year:array[0..3] of char; //5d..60
Comment:array[0..$1c] of char; //61..7d
Track:byte; //7e
Genre:byte; //7f
end;

function ReadID3v1(strFile:string;var pid3v1:Tid3v1):integer;
function WriteID3v1(strFile:string;var pid3v1:Tid3v1):integer;
function DeleteID3v1(strFile:string):integer;

implementation

function ReadID3v1(strFile:string;var pid3v1:Tid3v1):integer;
var
f1:file of byte;
bytAll: array [0..$7f] of byte;
i: integer;
begin
result:=1;
if strFile='' then exit;
AssignFile(f1,strFile);
FileMode:=0;
Reset(f1);
if FileSize(f1)<=$80 then exit;
Seek(f1, FileSize(f1)-$80);
for i:=0 to $7f do Read(f1,bytAll[i]);
if (bytAll[0]<>ord('T')) and (bytAll[1]<>ord('A'))
and (bytAll[2]<>ord('G')) then exit; // no 'TAG' found
Move(bytAll,pid3v1,$80);
CloseFile(f1);
result:=0;
end;

function WriteID3v1(strFile:string;var pid3v1:Tid3v1):integer;
var
f1:file of byte;
bytAll: array [0..$7f] of byte;
i: integer;
begin
result:=1;
AssignFile(f1,strFile);
FileMode:=2;
Reset(f1);
if FileSize(f1)<=$80 then exit;
Seek(f1, FileSize(f1)-$80);
for i:=0 to $2 do Read(f1,bytAll[i]); // test if 'TAG' exists
if (bytAll[0]=ord('T')) and (bytAll[1]=ord('A'))
and (bytAll[2]=ord('G'))
then Seek(f1,FileSize(f1)-$80)
else Seek(f1,FileSize(f1));
Move(pid3v1,bytAll,$80);
for i:=0 to $7f do Write(f1,bytAll[i]);
CloseFile(f1);
result:=0;
end;

function DeleteID3v1(strFile:string):integer;
var
f1:file of byte;
bytAll: array [0..$7f] of byte;
i: integer;
begin
Result:=1;
AssignFile(f1,strFile);
FileMode:=2;
Reset(f1);
if FileSize(f1)<=$80 then exit;
Seek(f1, FileSize(f1)-$80);
for i:=0 to $2 do Read(f1,bytAll[i]); // test if 'TAG' exists
if (bytAll[0]=ord('T')) and (bytAll[1]=ord('A'))
and (bytAll[2]=ord('G'))
then begin
Seek(f1,FileSize(f1)-$80);
Truncate(f1)
end;
CloseFile(f1);
Result:=0;
end;

end.
maren 2001-04-10
  • 打赏
  • 举报
回复
好的,太感谢了,我有mail:lovelinf@china.com
妹给我也行,谢谢!
严黎斌 2001-04-10
  • 打赏
  • 举报
回复
to maren:
放心,代码就是我写的。但不在手头,明天给你。
maren 2001-04-10
  • 打赏
  • 举报
回复
to 严黎斌():你能具体讲一下如何读取吗?您上面讲的我不知道应该怎样读取,您可以写出读取的原代码吗?谢谢!!
binghuodao 2001-04-10
  • 打赏
  • 举报
回复
各种文件有各种文件的格式,只要搞清格式就能读出来。
maren 2001-04-10
  • 打赏
  • 举报
回复
to 严黎斌():谢谢你。MP3文件是非常普遍的,你告诉我我非常高兴,用处很大,能举个例子具体说一下如何读取吗?谢谢!
wav、mpg等文件能行吗?
严黎斌 2001-04-10
  • 打赏
  • 举报
回复
你要指明,你要处理的是什么格式的文件。各种文件的内部结构很不一样的。
如果你指的是mp3文件,那么好办,他的id3v1结构我知道。
一个mp3文件,如果有id3v1信息的话(也可以没有),那么就是附加在文件最后的$80个字节,其定义如下:

type
Tid3v1= record
Tag: array[0..2] of char; //00..02 , ='TAG'
Title:array[0..$1d] of char; //03..20
Artist:array[0..$1d] of char; //21..3e
Album:array[0..$1d] of char; //3f..5c
Year:array[0..3] of char; //5d..60
Comment:array[0..$1c] of char; //61..7d
Track:byte; //7e
Genre:byte; //7f
end;

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧