C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】

第一种方式:[代码已验证]

// http://bbs.csdn.net/topics/390392612
  string file = @"E:\滴答.mp3";

            ShellClass sh = new ShellClass();

            Folder dir = sh.NameSpace(Path.GetDirectoryName(file));

            FolderItem item = dir.ParseName(Path.GetFileName(file));

            string str = dir.GetDetailsOf(item, 27) ; // 获取歌曲时长。

            MessageBox.Show(str);
 

// 如果执行过程中,出现是错误提示,通过Shell32 的 Embed Interop Types 属性设置为 False 即可;
//如果是1.0版本会报错请下载1.2版本 下载地址

https://download.csdn.net/download/u013087481/10952812

调用结果,在Win2003,2008,xp上应使用dir.GetDetailsOf(item, 21) ,而在Vista,win7、win8,win10等系统应使用folder.GetDetailsOf(folderItem, 27) ,主要是因为不同系统下文件属性索引顺序不同造成。只要右键单击文件属性,能看到的媒体属性都能取到,可以换不同的索引值来取。如下所示,取出的时间长度是 00:03:52,目标完成。

shell 获取 文件详细信息

首先引用COM组件

Microsoft Shell Controls And Automation

这里需要注意

DLL的属性Embed Interop Type 设为False

否则会引起互操作类型异常

代码如下

ShellClass sh = new ShellClass();

Folder dir = sh.NameSpace(Path.GetDirectoryName(sFile));

FolderItem item = dir.ParseName(Path.GetFileName(sFile));

string det = dir.GetDetailsOf(item, iCol);

iCol 对应文件详细属性汇总

ID  => DETAIL-NAME

0   => Name

1   => Size     // MP3 文件大小

2   => Type

3   => Date modified

4   => Date created

5   => Date accessed

6   => Attributes

7   => Offline status

8   => Offline availability

9   => Perceived type

10  => Owner

11  => Kinds

12  => Date taken

13  => Artists   // MP3 歌手

14  => Album     // MP3 专辑

15  => Year

16  => Genre

17  => Conductors

18  => Tags

19  => Rating

20  => Authors

21  => Title     // MP3 歌曲名

22  => Subject

23  => Categories

24  => Comments

25  => Copyright

26  => #

27  => Length    // MP3 时长

28  => Bit rate

29  => Protected

30  => Camera model

31  => Dimensions

32  => Camera maker

33  => Company

34  => File description

35  => Program name

36  => Duration

37  => Is online

38  => Is recurring

39  => Location

40  => Optional attendee addresses

41  => Optional attendees

42  => Organizer address

43  => Organizer name

44  => Reminder time

45  => Required attendee addresses

46  => Required attendees

47  => Resources

48  => Free/busy status

49  => Total size

50  => Account name

51  => Computer

52  => Anniversary

53  => Assistant's name

54  => Assistant's phone

55  => Birthday

56  => Business address

57  => Business city

58  => Business country/region

59  => Business P.O. box

60  => Business postal code

61  => Business state or province

62  => Business street

63  => Business fax

64  => Business home page

65  => Business phone

66  => Callback number

67  => Car phone

68  => Children

69  => Company main phone

70  => Department

71  => E-mail Address

72  => E-mail2

73  => E-mail3

74  => E-mail list

75  => E-mail display name

76  => File as

77  => First name

78  => Full name

79  => Gender

80  => Given name

81  => Hobbies

82  => Home address

83  => Home city

84  => Home country/region

85  => Home P.O. box

86  => Home postal code

  


//第二种方式: 读取文件结构获取 MP3文件信息 [代码未验证]

 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;//保留位,一个字节
}
/// <summary>
/// mp3类
/// </summary>
public class clsMP3
{
public void fLogSave(Page _sender, Hashtable _htUser)
{ }
//所以,我们只要把MP3文件的最后128个字节分段读出来并保存到该结构里就可以了。函数定义如下:
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结构中返回:
private Mp3Info getMp3Info(byte[] Info)
{
Mp3Info mp3Info = new Mp3Info();
string str = null;
int i;
int position = 0;//循环的起始值
int currentIndex = 0;//Info的当前索引值
//获取TAG标识(数组前3个)
for (i = currentIndex; i < currentIndex + 3; i++)
{
str = str + (char)Info[i];
position++;
}
currentIndex = position;
mp3Info.identify = str;
//获取歌名(数组3-32)
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);
//获取歌手名(数组33-62)
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);
//获取唱片名(数组63-92)
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);
//获取年 (数组93-96)
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);
//获取注释(数组97-124)
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);
//以下获取保留位(数组125-127)
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;
}
}

C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】的更多相关文章

  1. C# 获取 mp3文件信息

    C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612   string fil ...

  2. 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片

    突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ...

  3. PHP获取Mp3文件信息

    扫描本地MP3文件,获取文件信息

  4. 实现php获取mp3文件元信息如播放时间歌曲作者等

    最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ...

  5. MP3文件信息修改

    MP3文件信息 参考链接:https://www.jianshu.com/p/e368517ec7b9 总结: ID3V1在MP3文件后面;ID3V2在MP3文件前面;现在有些文件是V1的,有些文件是 ...

  6. C#获取MP3,WMA信息

    用于获取MP3内部信息,包括歌曲名,歌手名等…… namespace FileBatchRemaer.domain { /// <summary> /// Mp3信息结构 /// < ...

  7. android播放器如何获取音乐文件信息

    转http://blog.csdn.net/hellofeiya/article/details/8464356, android自带的音乐播放器中,在获取音乐文件信息的时候是通过扫描得到相关信息的. ...

  8. Mp3tag(MP3文件信息修改器) V2.79a 多语绿色版

    软件名称: Mp3tag(MP3文件信息修改器) 软件语言: 多国语言 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 3.0MB 图片预览: 软件简介: Mp3Tag 是一款m ...

  9. MP3文件信息批量更改器

    以前(估计是2003年)编写一个MP3文件信息批量更改器MP3TagChanger,现放上来参考.(VB6编码) 使用方法很简单,会Winamp或者千千静听的就懂使用. http://pan.baid ...

随机推荐

  1. 【转载】Docker 安装后 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 解决办法

    Docker Docker 安装后 报 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docke ...

  2. kotlin语法使用笔记

    kotlin中文文档:http://www.kotlindoc.cn/ClassesAndObjects/Classes-and-Inheritance.html 1. 声明类的构造方法 例如继承Fr ...

  3. 【分享】Asp.net Core相关教程及开源项目

    入门 全新的ASP.NET:  https://www.cnblogs.com/Leo_wl/p/5654828.html 在IIS上部署你的ASP.NET Core项目: https://www.c ...

  4. SFTP工具类

    1.SFTP搭建方法: 地址: http://www.jb51.net/article/101405.htm https://blog.csdn.net/helloloser/article/deta ...

  5. K好数(DP)

    问题描写叙述 假设一个自然数N的K进制表示中随意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数. 求L位K进制数中K好数的数目. 比如K = 4,L = 2的时候.全部K好数为11.13.2 ...

  6. 【AI】基本概念-准确率、精准率、召回率的理解

    样本全集:TP+FP+FN+TN TP:样本为正,预测结果为正 FP:样本为负,预测结果为正 TN:样本为负,预测结果为负 FN:样本为正,预测结果为负 准确率(accuracy):(TP+TN)/ ...

  7. Nestjs OpenAPI(Swagger)

    官方文档 用来描述api

  8. CF3A Shortest path of the king

    The king is left alone on the chessboard. In spite of this loneliness, he doesn't lose heart, becaus ...

  9. smartFloat

    $.fn.smartFloat = function() {     var position = function(element) {         var top = element.posi ...

  10. JavaScript基础知识(DOM)

    获取元素的方法 要操作谁,就要先获取谁: 获取元素 1.document.getElementById:通过ID名来获取元素 兼容性: 在IE8以下,会默认把name属性当做id来获取: docume ...