从MP3中提取歌曲信息(C#)

从MP3中提取歌曲信息

一首MP3歌曲除了音乐信息外,还包含了如歌名、演唱者等信息,当我们用winamp软件听音乐时,播放清单就自动将这些信息读出来。大部分人都喜欢从网上下载音乐,但下载下来的MP3文件名都是文件上传系统自动取名的,和歌曲本身根本不相符,所以,给用户带来了很大的麻烦。但是,懒人有懒人的做法,我们何不自己写一个程序,将歌曲信息自动读出来并为MP3文件自动更名呢?

下面我就以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;

}

}

呵,思路就是这样了,如果有问题或者需要源码请发邮件至:lifenote@21cn.com索取。

时间: 2024-10-27 05:29:48

从MP3中提取歌曲信息(C#)的相关文章

从MP3中提取歌曲信息

从MP3中提取歌曲信息 一首MP3歌曲除了音乐信息外,还包含了如歌名.演唱者等信息,当我们用winamp软件听音乐时,播放清单就自动将这些信息读出来.大部分人都喜欢从网上下载音乐,但下载下来的MP3文件名都是文件上传系统自动取名的,和歌曲本身根本不相符,所以,给用户带来了很大的麻烦.但是,懒人有懒人的做法,我们何不自己写一个程序,将歌曲信息自动读出来并为MP3文件自动更名呢? 下面我就以C#为工具,把开发过程写出来. 一首MP3的额外信息存放在文件的最后面,共占128个字节,其中包括以下的内容(

从ntds.dit中提取hash和域信息

本文讲的是从ntds.dit中提取hash和域信息,在渗透测试进入内网之后,首要目标就是得到域控权限,将域中所有用户的hash值全部跑出来,下载到本地.很多工具比如meterpreter中的smart_hashdump和Impacket中的secretsdump.py都可以做到. 但是有些情况下我只能拷贝出来NTDS.dit文件,然后离线将这些密码提取出来.今天正好碰到了这一情况,接下来我将详细的介绍一下如何将密码导出,当然假设我已经成功将这两个文件下载到本地: 1. ntds.dit:Exte

利用身份证号码提取个人信息

办公室的小秦向我求教,说最近需要上报一份材料,这份材料是用http://www.aliyun.com/zixun/aggregation/16544.html">Excel做的汇总表,其中必须输入每位员工的姓名.性别.身份证号码.出生年月.籍贯.毕业学校.职称等相关信息,她的要求是有无简单的办法对身份证号码.性别.出生年月的资料进行核对.下面我们就 来看一下具体的核 对方法. 一.分析身份证号码 其实,身份证号码与一个人的性别.出生年月.籍贯等信息是紧密相连的,无论是15位还是18位的身份

mysql中从字段中URL提取域名信息

如果你有一字段dm记录了一个url,为了更好的优化模糊查询速度或统计速度,在数据表原有的结构上增加3个字段,分别为  `sdm` varchar(64) NOT NULL,   #subdomain记录子域名,如:123456.user.qzone.qq.com   `tdm` varchar(32) NOT NULL,    #topdomain记录一级域名,如:qq.com   `rdm` varchar(8) NOT NULL,      #rootdomain记录根域,如:com 操作顺

如何在网络视频中提取MP3

  工具/原料 1.先下载土豆视频下载工具:iTudou; 2.或者用FLVXZ网址提取.下载FLV和某flv转mp3 3.北京爱情故事主题曲 步骤/方法 1.打开视频网站,搜索"北京爱情故事",设法将视频以FLV形式储存到本地. 方法一:用视频网站提供的下载工具,比如土豆网提供的某版本itudou(版本可能更新). 方法二:用flvxz提取flv文件地址,然后用另存的办法储存到本地. 2.将保存到本地的flv格式文件通过转换工具提取MP3文件. 主要简单介绍用"月亮flv转

格式-如何提取txt中的url信息?

问题描述 如何提取txt中的url信息? T<=>103[=]P<=>iexplore.exe[=]I<=>2808[=]U<=>http://t.iloveyouxi.com/game/krtc5822.php[=]A<=>1045e[=]B<=>1048a[=]V<=>8.00.6001.18702 各位大神,这种格式的txt文档如何提取url,并得到网页文本数据呢? 解决方案 看你这个格式,可以搜索http开头,这比

Python读取mp3中ID3信息的方法_python

本文实例讲述了Python读取mp3中ID3信息的方法.分享给大家供大家参考.具体分析如下: pyid3不好用,常常有不认识的. mutagen不错,不过默认带的easyid3不会读取注释,需要手工hack一下 Python代码如下: from mutagen.mp3 import MP3 import mutagen.id3 from mutagen.easyid3 import EasyID3 EasyID3.valid_keys["comment"]="COMM::'X

使用NPOI从Excel中提取图片及图片位置信息

原文:使用NPOI从Excel中提取图片及图片位置信息 问题背景: 话说,在ExcelReport的开发过程中,有一个比较棘手的问题:怎么复制图片呢? 当然,解决这个问题的第一步是:能使用NPOI提取到图片及图片的位置信息.到这里,一切想法都很顺利.但NPOI到底怎么提取图片及图片的位置信息呢?NPOI能不能提取到图片的位置信息呢? 这是两个问题.是两个让BaiGoogleDu几近沉默的问题.但官方教程的评论中还是流露出了答案的蛛丝马迹. 哇咔咔,这是我去看源码寻答案的的动力. 此处省去(N多字

Linux系统下使用Flacon导入CD音频文件中的歌曲

Linux系统下使用Flacon导入CD音频文件中的歌曲  Flacon 是一款 Qt 工具,用于从音频 CD 中提取个人曲目,基于在CUE文件中提供的信息提取如 WavPack. APE. FLAC. WAV 或 True Audio. 该应用程序提供了输出格式具体设置:你可以设置除 ReplayGain 以外的输出质量,压缩等,无论是每个专辑或音轨. Flacon 另外一个有用的功能就是标记导出的音轨文件,基于在CUE文件或手动提供的信息. 最新版本 Flacon 1.2.0 最近已经发布,