首页 > 编程语言 >JAVA 读取 ASF(WMA 和 WMV)文件信息

JAVA 读取 ASF(WMA 和 WMV)文件信息

时间:2023-04-17 20:33:19浏览次数:33  
标签:JAVA String WMV char ASF br new buf public


 

/* 读取ASF(WMA、WMV)标签 */
public static MusicTagEntity ReadASFTag(String path)
{
	try
	{
		char[] WMAHead = { 0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }; // WMA头部标识
		char[] StandardHead = { 0x33, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C }; // 标准TAG头部标识
		char[] ExtendHead = { 0x40, 0xA4, 0xD0, 0xD2, 0x07, 0xE3, 0xD2, 0x11, 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50 }; // 扩展TAG头部标识
		String[] StandardHeadString = { "33", "26", "B2", "75", "8E", "66", "CF", "11", "A6", "D9", "00", "AA", "00", "62", "CE", "6C" }; // 标准TAG头部标识
		String[] ExtendHeadString = { "40", "A4", "D0", "D2", "07", "E3", "D2", "11", "97", "F0", "00", "A0", "C9", "5E", "A8", "50" }; // 扩展TAG头部标识
		MusicTagEntity mt = new MusicTagEntity();

		File f = new File(path);
		InputStream is = new BufferedInputStream(new FileInputStream(f));
		BufferedReader br = new BufferedReader(new InputStreamReader(is, "ISO-8859-1")); // 头部需要用ASCII编码

		// 读取头部判断是否为WMA文件
		char[] buf = new char[16];
		br.read(buf);

		if (Arrays.equals(buf, WMAHead))
		{// 是WMA
			br.read(buf = new char[14]); // 跳过无用的8+6字节
			br.read(buf = new char[16]); // 确定标签类型的头

			// 需要判断这里是先扩展再标准还是先标准再扩展
			if (Arrays.equals(buf, ExtendHead))
			{// 扩展
				br.read(buf = new char[8]); // 再次放过8字节(此处无用的8字节标志位)
				br.read(buf = new char[2]); // 扩展标签的总个数
				int ExtendCount = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值
				for (int i = 0; i < ExtendCount; i++)
				{
					br.read(buf = new char[2]); // 扩展名称长度
					int FiledNameLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值
					br.read(buf = new char[FiledNameLength]); // 读取扩展名称
					String strFieldName = Common.UnicodeCharToString(buf);

					br.read(buf = new char[2]); // Flag,暂时不用

					br.read(buf = new char[2]); // 扩展字段长度
					int FiledLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值
					br.read(buf = new char[FiledLength]); // 读取扩展字段

					if (strFieldName.equals("WM/TrackNumber"))
						mt.setTrack(Common.UnicodeCharToString(buf));
					if (strFieldName.equals("WM/Track"))
						mt.setTrack(Common.UnicodeCharToString(buf));
					else if (strFieldName.equals("WM/AlbumArtist"))
						mt.setArtist(Common.UnicodeCharToString(buf));
					else if (strFieldName.equals("WM/AlbumTitle"))
						mt.setAlbum(Common.UnicodeCharToString(buf));
					else if (strFieldName.equals("WM/Year"))
						mt.setYear(Common.UnicodeCharToString(buf));
					else if (strFieldName.equals("WM/Genre"))
						mt.setGener(Common.UnicodeCharToString(buf));
					else if (strFieldName.equals("WM/WM/GenreID"))
						mt.setGener(Common.UnicodeCharToString(buf));
				}

				// 开始读取标准头
				do
				{// 跳过空白字符
					br.read(buf = new char[1]);
				}
				while ((int) buf[0] == 0);

				boolean IsStandartHeader = true; // 是否包含标准头部信息

				if (Integer.toHexString((int) buf[0]).equals(StandardHeadString[0]))
				{
					for (int i = 1; i <= 15; i++)
					{
						br.read(buf = new char[1]);

						String strHex = Integer.toHexString((int) buf[0]).toUpperCase();
						if (strHex.length() == 1)
							strHex = "0" + strHex;

						if (!strHex.equals(StandardHeadString[i]))
						{
							IsStandartHeader = false;
							break;
						}
					}

					if (IsStandartHeader)
					{// 找到标准头
						br.read(buf = new char[8]); // 8字节无效内容

						br.read(buf = new char[2]); // 标题长度
						int TitleLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值

						br.read(buf = new char[2]); // 艺术家长度
						int ArtistLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值

						br.read(buf = new char[2]); // 版权长度
						int CopyrightLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值

						br.read(buf = new char[2]); // 备注长度
						int CommentLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值

						br.read(buf = new char[2]); // 2字节无效内容

						// 读取标题
						br.read(buf = new char[TitleLength]);
						mt.setTitle(Common.UnicodeCharToString(buf));

						// 读取艺术家
						br.read(buf = new char[ArtistLength]);
						if (mt.getArtist().equals("")) // 如果扩展属性中没有此信息,则采用
							mt.setArtist(Common.UnicodeCharToString(buf));

						br.read(buf = new char[CopyrightLength]); // 跳过版权说明

						// 读取备注
						br.read(buf = new char[CommentLength]);
						mt.setComment(Common.UnicodeCharToString(buf));
					}
				}
			}
			else if (Arrays.equals(buf, StandardHead))
			{// 标准
				br.read(buf = new char[8]); // 8字节无效内容

				br.read(buf = new char[2]); // 标题长度
				int TitleLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值

				br.read(buf = new char[2]); // 艺术家长度
				int ArtistLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值

				br.read(buf = new char[2]); // 版权长度
				int CopyrightLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值

				br.read(buf = new char[2]); // 备注长度
				int CommentLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值

				br.read(buf = new char[2]); // 2字节无效内容

				// 读取标题
				br.read(buf = new char[TitleLength]);
				mt.setTitle(Common.UnicodeCharToString(buf));

				// 读取艺术家
				br.read(buf = new char[ArtistLength]);
				mt.setArtist(Common.UnicodeCharToString(buf));

				br.read(buf = new char[CopyrightLength]); // 跳过版权说明

				// 读取备注
				br.read(buf = new char[CommentLength]);
				mt.setComment(Common.UnicodeCharToString(buf));

				// 开始读取扩展头
				do
				{// 跳过空白字符
					br.read(buf = new char[1]);
				}
				while ((int) buf[0] == 0);

				boolean IsExtendHeader = true; // 是否包含标准头部信息

				if (Integer.toHexString((int) buf[0]).equals(ExtendHeadString[0]))
				{
					for (int i = 1; i <= 15; i++)
					{
						br.read(buf = new char[1]);

						String strHex = Integer.toHexString((int) buf[0]).toUpperCase();
						if (strHex.length() == 1)
							strHex = "0" + strHex;

						if (!strHex.equals(ExtendHeadString[i]))
						{
							IsExtendHeader = false;
							break;
						}
					}

					if (IsExtendHeader)
					{// 找到扩展头
						br.read(buf = new char[8]); // 再次放过8字节(此处无用的8字节标志位)
						br.read(buf = new char[2]); // 扩展标签的总个数
						int ExtendCount = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值
						for (int i = 0; i < ExtendCount; i++)
						{
							br.read(buf = new char[2]); // 扩展名称长度
							int FiledNameLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值
							br.read(buf = new char[FiledNameLength]); // 读取扩展名称
							String strFieldName = Common.UnicodeCharToString(buf);

							br.read(buf = new char[2]); // Flag,暂时不用

							br.read(buf = new char[2]); // 扩展字段长度
							int FiledLength = Integer.valueOf(Common.DecodeUnicodeHex(buf), 16); // 转换成数值
							br.read(buf = new char[FiledLength]); // 读取扩展字段

							if (strFieldName.equals("WM/TrackNumber"))
								mt.setTrack(Common.UnicodeCharToString(buf));
							if (strFieldName.equals("WM/Track"))
								mt.setTrack(Common.UnicodeCharToString(buf));
							else if (strFieldName.equals("WM/AlbumArtist"))
								mt.setArtist(Common.UnicodeCharToString(buf));
							else if (strFieldName.equals("WM/AlbumTitle"))
								mt.setAlbum(Common.UnicodeCharToString(buf));
							else if (strFieldName.equals("WM/Year"))
								mt.setYear(Common.UnicodeCharToString(buf));
							else if (strFieldName.equals("WM/Genre"))
								mt.setGener(Common.UnicodeCharToString(buf));
							else if (strFieldName.equals("WM/WM/GenreID"))
								mt.setGener(Common.UnicodeCharToString(buf));
						}
					}
				}
			}

			br.close();
			is.close();
			return mt;
		}
		else
		{// 不是ASF格式
			br.close();
			is.close();
			return null;
		}
	}
	catch (Exception e)
	{
		e.printStackTrace();
		return null;
	}
}

 

字符编码转换:

 

 

 

/* 十六进制UnicodeChar转String */
public static String UnicodeCharToString(char[] Char)
{
	String strTemp = "";

	for (int i = 1; i < Char.length; i += 2)
	{
		String s1 = Integer.toHexString((int) Char[i]);
		String s2 = Integer.toHexString((int) Char[i - 1]);

		// 长度不足补全
		if (s1.length() == 1)
			s1 = "0" + s1;

		if (s2.length() == 1)
			s2 = "0" + s2;

		strTemp += s1 + s2;
	}

	return UnicodeToString(strTemp).trim();
}

 

/* 倒序排列十六进制Unicode(用以计算该字节标识的数值) */
public static String DecodeUnicodeHex(char[] Char)
{
	String strTemp = "";
	boolean CouldContinue = true;

	for (int i = Char.length - 1; i >= 0; i--)
	{
		String strHex = Integer.toHexString((int) Char[i]);

		if (strHex.length() == 1)
			strHex = "0" + strHex;

		if (strHex.equals("00") && CouldContinue)
			continue;
		else
		{
			strTemp += strHex;
			CouldContinue = false;
		}
	}

	return strTemp;
}

 

接收信息的类

package *;  //请自行填写

public class MusicTagEntity
{
	private String Album = ""; // 专辑名称
	private String Title = ""; // 歌曲标题
	private String Gener = ""; // 流派
	private String Artist = ""; // 艺术家
	private String Year = ""; // 年份
	private String Track = ""; // 音轨号
	private String Lyric = ""; // 歌词
	private String Comment = ""; // 备注

	public String getAlbum()
	{
		return Album;
	}

	public void setAlbum(String album)
	{
		Album = album;
	}

	public String getTitle()
	{
		return Title;
	}

	public void setTitle(String title)
	{
		Title = title;
	}

	public String getGener()
	{
		return Gener;
	}

	public void setGener(String gener)
	{
		Gener = gener;
	}

	public String getArtist()
	{
		return Artist;
	}

	public void setArtist(String artist)
	{
		Artist = artist;
	}

	public String getYear()
	{
		return Year;
	}

	public void setYear(String year)
	{
		Year = year;
	}

	public String getTrack()
	{
		return Track;
	}

	public void setTrack(String track)
	{
		Track = track;
	}

	public String getLyric()
	{
		return Lyric;
	}

	public void setLyric(String lyric)
	{
		Lyric = lyric;
	}

	public String getComment()
	{
		return Comment;
	}

	public void setComment(String comment)
	{
		Comment = comment;
	}
}

 

 

 

 

 

 

 

 

 

 

 

标签:JAVA,String,WMV,char,ASF,br,new,buf,public
From: https://blog.51cto.com/u_2198048/6196315

相关文章

  • Java判断文件编码格式
    一般情况下我们遇到的文件编码格式为GBK或者UTF-8。由于中文Windows默认的编码是GBK,所以一般只要判定UTF-8编码格式。 对于UTF-8编码格式的文本文件,其前3个字节的值就是-17、-69、-65,所以,判定是否是UTF-8编码格式的代码片段如下:  java.io.Filef=newjava.io.File("待判定的......
  • Java字符串
    Java字符串String的特点程序当中所有用双引号括起来的东西都说字符串不管有没有生成String类1.字符串的内容永不可变(重点)2.字符串永不可变,所以可以共享使用3.字符串效果相当于char[]数组,但是底层原理是byte[]字节数组创建字符串创建字符串的3+1种方法构造方法:1.创......
  • 查找消耗cpu最高的Java进程
    #!/bin/bashif[-z"$1"];then###1.先找到消耗cpu最高的Java进程###pid=`ps-eopid,%cpu,cmd--sort=-%cpu|grepjava|grep-vgrep|head-1|awk'END{print$1}'`if["$pid"=""];then......
  • 坦克大战项目实践(Java)
     一、设计简介该项目是设计一个坦克大战小游戏,该游戏算不上精美,但是有始有终。有明确的游戏开始、单人模式、双人模式、游戏暂停和游戏失败等事件。设计内容包含图片双缓存技术,解决游戏屏幕闪动问题;还包含了击毁坦克的爆炸特效与子弹消失;还包含了碰撞检测,包括墙体和边界的。二......
  • java查看对象占用内存的大小
    1.首先引入jar包lucene-core-4.7.2.jar<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>4.0.0</version></dependency><depende......
  • 通过JAVA语言如何获取淘宝/天猫搜索词推荐
    Java是一种跨平台的、面向对象的高级编程语言,主要用来进行网站后台开发和AndroidAPP开发,同时它是全球最受欢迎的编程语言之一,在世界编程语言排行榜TIOBE中,Java一直霸占着前三名,有好多年甚至都是获得了第一名。那么为什么Java会如此受欢迎呢?Java是一种半编译型语言,开发比......
  • Java与Mysql锁相关知识总结
    锁的定义在计算机程序中锁用于独占资源,获取到锁才可以操作对应的资源。锁的实现锁在计算机底层的实现,依赖于CPU提供的CAS指令(compareandswsp),对于一个内存地址,会比较原值以及尝试去修改的值,通过值是否修改成功,来表示是否强占到了这个锁。JVM中的锁jvm中,有2个常用的锁synchr......
  • javascript
    1970.1.1互联网开始时间**JavaScript(开发Web页面的脚本语言)**是面向Web的编程语言,获得了所有网页浏览器的支持,是目前使用最广泛的脚本编程语言之一,也是网页设计和Web应用必须掌握的基本工具。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最......
  • 关于Java中值传递和址传递
    参数传递在Java中有两种类型值和址其实本质都是一份拷贝在调用函数的时候进行压栈传进来的参数会被开辟一份新的空间传基本类型是把值传过去传引用数据类型是实例指向实参voidm(intv){//基本数据类型传值是一份拷贝不会影响实参v++}voidm(int[]arr){//底层i......
  • Java集合框架
    Java集合框架概述Java集合框架是一个抽象数据类型的框架,它提供了一组接口和类,可用于处理各种类型的数据结构,如列表、队列、集、映射等。Java集合框架的主要特点是:1、可扩展性:Java集合框架提供了一组可扩展的接口和类,可让开发人员根据自己的需要实现新的数据结构和算法。2、高性能:Ja......