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. android sdk manager更新地址

    参考:http://www.oschina.net/question/1399261_195245 android sdk 用久了,想更新到最新的SDK包: 大连东软信息学院镜像服务器地址:- htt ...

  2. 01Spark的TopN问题

    和hadoop的目的一样,给你数据,然后取TopN.数据如下: 取出数据在排名前十的数据. 代码如下: package com.test.book; import java.util.ArrayLis ...

  3. Google Protobuf 使用 Java 版

    一 . Protobuf 的入门 Protobuf 是一个灵活,高效,结构化的数据序列化框架, 相比于 XML 等传统的序列化工具,它更小,更快,更灵活,更简单. Protobuf 支持数据结构化一次 ...

  4. js 暂时存储 sessionStorge

    H5的storage有sessionstorage&localStorage,其中他们的共同特点是API相同 下面直接上代码,storage中的存储与删除: <!DOCTYPE html ...

  5. javascript实现限定高度下文字随不同设备自适应改变字体大小至字数完全展示

    function fontAutoMoreLine() { let textBox = document.getElementById("iconTxt"); let maxHei ...

  6. 定时 清理 elasticsearch 6.5.4 的 索引 文件

    #!/bin/sh ip='127.0.0.1' port=' day=`date -d "2 days ago" +%Y%m%d` #day=`date -d "5 h ...

  7. java.lang.ClassCastException:weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parsers.DocumentBuilderFactory

    java.lang.ClassCastException:weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to java ...

  8. Windows Server2012R2 FTP服务器配置

    转载博客:http://blog.csdn.net/smalllu161226/article/details/53887751 1.打开windows server2012R2 服务器管理器界面 添 ...

  9. js中 函数参数的 传值/传引用 问题

    如果  传入function的参数是  (数值.字符串.布尔值) 此时是以 传值 的方式 进行. 如果  传入function的参数是  (数组.对象.其他函数) 此时是以 传引用 的方式 进行. 1

  10. 查看集成环境 phpstudy 中 mysql 版本号

    1. 打开面板 2.其他选项菜单 3. Mysql工具 4. mysql命令行 5.输入密码,回车.phpstudy  mysql默认 root 6.运行 select    version();