社区
C#
帖子详情
怎样读取mp3文件和wma文件的信息?像winamp中的文件信息一样?
cfmowh
2005-01-24 09:19:15
如题,给出完整代码立即结贴
...全文
888
2
打赏
收藏
怎样读取mp3文件和wma文件的信息?像winamp中的文件信息一样?
如题,给出完整代码立即结贴
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jyu_730
2005-01-26
打赏
举报
回复
从MP3中提取歌曲信息
lizanhong [原作]
下面我就以C#为工具,把开发过程写出来。
一首MP3的额外信息存放在文件的最后面,共占128个字节,其中包括以下的内容(我们定义一个结构说明):
public struct Mp3Info
{
public string identify;//TAG,三个字节
public string Title;//歌曲名,30个字节
public string Artist;//歌手名,30个字节
public string Album;//所属唱片,30个字节
public string Year;//年,4个字符
public string Comment;//注释,28个字节
public char reserved1;//保留位,一个字节
public char reserved2;//保留位,一个字节
public char reserved3;//保留位,一个字节
}
所以,我们只要把MP3文件的最后128个字节分段读出来并保存到该结构里就可以了。函数定义如下:
/// <summary>
/// 获取MP3文件最后128个字节
/// </summary>
/// <param name="FileName">文件名</param>
/// <returns>返回字节数组</returns>
private byte[] getLast128(string FileName)
{
FileStream fs = new FileStream(FileName,FileMode.Open,FileAccess.Read);
Stream stream = fs;
stream.Seek(-128,SeekOrigin.End);
const int seekPos = 128;
int rl = 0;
byte[] Info = new byte[seekPos];
rl = stream.Read(Info,0,seekPos);
fs.Close();
stream.Close();
return Info;
}
再对上面返回的字节数组分段取出,并保存到Mp3Info结构中返回。
/// <summary>
/// 获取MP3歌曲的相关信息
/// </summary>
/// <param name = "Info">从MP3文件中截取的二进制信息</param>
/// <returns>返回一个Mp3Info结构</returns>
private Mp3Info getMp3Info(byte[] Info)
{
Mp3Info mp3Info = new Mp3Info();
string str = null;
int i;
int position = 0;//循环的起始值
int currentIndex = 0;//Info的当前索引值
//获取TAG标识
for(i = currentIndex;i<currentIndex+3;i++)
{
str = str+(char)Info[i];
position++;
}
currentIndex = position;
mp3Info.identify = str;
//获取歌名
str = null;
byte[] bytTitle = new byte[30];//将歌名部分读到一个单独的数组中
int j = 0;
for(i = currentIndex;i<currentIndex+30;i++)
{
bytTitle[j] = Info[i];
position++;
j++;
}
currentIndex = position;
mp3Info.Title = this.byteToString(bytTitle);
//获取歌手名
str = null;
j = 0;
byte[] bytArtist = new byte[30];//将歌手名部分读到一个单独的数组中
for(i = currentIndex;i<currentIndex+30;i++)
{
bytArtist[j] = Info[i];
position++;
j++;
}
currentIndex = position;
mp3Info.Artist = this.byteToString(bytArtist);
//获取唱片名
str = null;
j = 0;
byte[] bytAlbum = new byte[30];//将唱片名部分读到一个单独的数组中
for(i = currentIndex;i<currentIndex+30;i++)
{
bytAlbum[j] = Info[i];
position++;
j++;
}
currentIndex = position;
mp3Info.Album = this.byteToString(bytAlbum);
//获取年
str = null;
j = 0;
byte[] bytYear = new byte[4];//将年部分读到一个单独的数组中
for(i = currentIndex;i<currentIndex+4;i++)
{
bytYear[j] = Info[i];
position++;
j++;
}
currentIndex = position;
mp3Info.Year = this.byteToString(bytYear);
//获取注释
str = null;
j = 0;
byte[] bytComment = new byte[28];//将注释部分读到一个单独的数组中
for(i = currentIndex;i<currentIndex+25;i++)
{
bytComment[j] = Info[i];
position++;
j++;
}
currentIndex = position;
mp3Info.Comment = this.byteToString(bytComment);
//以下获取保留位
mp3Info.reserved1 = (char)Info[++position];
mp3Info.reserved2 = (char)Info[++position];
mp3Info.reserved3 = (char)Info[++position];
return mp3Info;
}
上面程序用到下面的方法:
/// <summary>
/// 将字节数组转换成字符串
/// </summary>
/// <param name = "b">字节数组</param>
/// <returns>返回转换后的字符串</returns>
private string byteToString(byte[] b)
{
Encoding enc = Encoding.GetEncoding("GB2312");
string str = enc.GetString(b);
str = str.Substring(0,str.IndexOf('\0') >= 0 ? str.IndexOf('\0') : str.Length);//去掉无用字符
return str;
}
改名怎么办呢?我们按(演唱者)歌名 的格式对歌曲进行改名,程序如下:
/// <summary>
/// 更改文件名
/// </summary>
/// <param name="filePath">文件名</param>
/// <returns></returns>
private bool ReName(string filePath)
{
if(File.Exists(filePath))
{
Mp3Info mp3Info = new Mp3Info();
mp3Info = this.getMp3Info(this.getLast128(filePath));//读出文件信息
mp3Info.Artist = this.DeleteNotValue(mp3Info.Artist);
mp3Info.Title = this.DeleteNotValue(mp3Info.Title);
if(mp3Info.Artist.Trim().Length==0)
{
mp3Info.Artist="未命名";
}
if(mp3Info.Title.Trim().Length==0)
{
mp3Info.Title="未知名歌曲";
}
try
{
//更名
File.Move(filePath,filePath.Substring(0,filePath.ToLower().LastIndexOf("\\")).Trim() + "\\" + "(" + mp3Info.Artist.Trim() + ")" +mp3Info.Title.Trim() + ".mp3");
return true;
}
catch(Exception)
{
return false;
}
}
else
{
return false;
}
}
whuang826
2005-01-26
打赏
举报
回复
http://blog.csdn.net/airhand/articles/60005.aspx
MP3
信息
修改工具
Mp3
tag 3.06
中
文多语免费版.zip
所谓ID3-Tag
信息
,就是在
MP3
文件
中
加入曲名,演唱者,专辑,年月,流派,注释等
信息
,便于您收集歌曲。其实
win
amp
中
带有编辑器,只是把它做的方便一点。
Mp3
tag
中
文版可以以
文件
名批量添加媒体元
信息
,根据媒体元...
mp3
tag.exe
Mp3
tag
中
文绿色版是一款功能强大而完全免费的
MP3
文件
ID3-Tag
信息
修改器和更名工具。所谓ID3-Tag
信息
,就是在
MP3
文件
中
加入曲名、演唱者、专集、年月、流派、注释等
信息
,便于您收集歌曲。其实
win
amp
中
带有编辑器,...
经典高保真音乐播放器
Win
amp
PRO 5.70 Build 3437
中
文多语免费版.zip
Win
amp
内置媒体监视功能,方便用户浏览和标签音乐博客,并自动提供从彼处流和下载
MP3
文件
的功能。 远程控制
Win
amp
内置远程控制功能,方便用户对互联网上其它电脑内不受保护的音乐
文件
进行远程回放,可根据带宽调整...
各种
文件
后缀含义
声音
文件
wav(媒体播放器可打开)、aif(常用声音处理软件可打开)、au(常用声音处理软件可打开)、
mp3
(由
win
amp
播放)、ram(由realplayer播放)、
wma
、mmf、amr、aac、flac 动画
文件
avi(常用动画处理软件可...
DFX for
Win
amp
8.350音频插件---绿色汉化版
酷狗、千千静听等各种播放器的音频插件... 只要设定好便可让
Win
amp
播放
MP3
或
WMA
时的声音具有 3D 环绕音场效果。 本软件已经汉化-- 使用方法: 直接解压到支持插件的播放软件的目录里面,再从软件设置启动该插件
C#
110,533
社区成员
642,574
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章