`

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

 
阅读更多

只提供对基本属性的读取(请参阅 MP3 的 ID3v1)。

/* 读取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 UnicodeToString(String Hex)
{
    String enUnicode = null;
    String deUnicode = null;
 
    for (int i = 0; i < Hex.length(); i++)
    {
        if (enUnicode == null)
            enUnicode = String.valueOf(Hex.charAt(i));
        else
            enUnicode = enUnicode + Hex.charAt(i);
 
        if (i % 4 == 3)
        {
            if (enUnicode != null)
            {
                if (deUnicode == null)
                    deUnicode = String.valueOf((char) Integer.valueOf(enUnicode, 16).intValue());
                else
                    deUnicode = deUnicode + String.valueOf((char) Integer.valueOf(enUnicode, 16).intValue());
            }
 
            enUnicode = null;
        }
    }
 
    return deUnicode;
}
 
/* 倒序排列十六进制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;
}
 
此外还需要一个用于接收信息的类(MusicTagEntity.java):

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;
    }
}
分享到:
评论
1 楼 qq123zhz 2012-01-12  
有wma和mp3的吗?

相关推荐

    获取WMV和ASF视频文件信息

    本文将深入探讨如何获取WMV和ASF视频文件的信息,以及如何结合微软的ASF文档进行更复杂的操作。 WMV是一种由微软开发的流媒体视频格式,它基于ASF容器格式。ASF不仅包含视频数据,还可能包含音频、字幕等多轨道信息...

    ASF文件格式说明

    - **压缩和编码**: ASF文件支持多种编码标准,如Windows Media Audio和Video (WMA, WMV),以及MPEG-4音频/视频等。 - **分段传输**: ASF文件可被分割成多个数据块,适应网络环境的变化,保证流式传输的顺畅。 - **...

    mmwrite:从 mmread 读取的电影中写入 AVI/ASF/WMV/WMA 文件-matlab开发

    mmwrite 能够写入 AVI、WMV、WMA、ASF 文件。 对于 AVI 文件,您可以从可用的编解码器中进行选择以压缩音频和视频流。 对于 WMV、WMA 和 ASF,编码默认为 Windows Media 9 44100Hz 16 位立体声 98% 质量的音频和 ...

    asf 文件格式文档

    ASF(Advanced Systems Format)文件格式是微软在1997年推出的多媒体容器格式,用于存储数字音频、视频和图像数据。它旨在提供一个高效、灵活且可扩展的方式来存储和传输多媒体内容,尤其是在网络上。ASF文件格式的...

    mms协议下录制asf程序源代码

    ASF文件可以使用WMV(Windows Media Video)和WMA(Windows Media Audio)编码。 3. **录制程序**:在MMS协议下录制ASF文件,意味着我们需要编写或使用能捕获并保存MMS流的程序。这通常涉及到网络编程,理解TCP/IP...

    asf.rar_asf

    ASF文件可能包含Windows Media Audio (WMA) 或 Windows Media Video (WMV) 编码的数据。处理ASF文件可能涉及到多媒体编码解码、网络流媒体技术,以及相关的编程接口,例如DirectShow或GStreamer。 在源码文件列表中...

    libasf 文件分析代码库

    ASF是由微软公司开发的一种数字媒体容器格式,常用于流式传输音频和视频数据,例如Windows Media Audio (WMA) 和 Windows Media Video (WMV) 文件。这个代码库是用C语言编写的,这意味着它具有高度的可移植性,可以...

    delphi获取音视频媒体文件信息(支持D7,XE7)

    福利来了,delphi获取音视频媒体文件信息,亲测支持D7和XE7。支持音频文件(*.ACC;*.AC3;*.APE;*.DTS;*.FLAC;*.M4A;*.MKA;*.MP2;*.MP3;*.MPA;*.PMC;*.OFR;*.OGG;*.RA;*.TTA;*.WAV;*.WMA;);视频文件(*.WMV;*.ASF;*....

    Wmv To Wav

    1. **WM ASF Reader**:这是DirectShow滤镜之一,专门用于读取ASF(Advanced Systems Format)文件,WMV就是基于ASF的视频格式。它能够解析WMV文件的结构,提取视频和音频流。 2. **WMAudio Decode DMO**:Digital ...

    VB使用MediaInfo.dll组件读取流媒体文件信息.rar

    VB读取流媒体文件信息,程序是基于MediaInfo.dll组件来实现,可以保存流媒体信息到 txt文件,可以读取出媒体比率、时长、编码类型、屏幕比率、采样率、字节数、文件类型等详细信息,获取的内容比较多,不列举了,...

    DSHOW wmstub.lib WMVCORE.lib

    ASF是一种由微软设计的容器格式,常用于存储和流式传输音频和视频数据,包括Windows Media Audio(WMA)和Windows Media Video(WMV)等编码格式。wmstub.lib可能包含了解码ASF文件所必需的函数和数据结构,使得...

    视频转换大师(WinMPG Video Convert) V9.2.2专业版免注册

    把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...

    视频转换大师

    它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, AMV, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, XVID, DivX, ASF, WMV, SWF, IPOD, PSP, GIF, MJPEG, QuickTime, MOV, FLV, MKV,...

    matlab开发-mmwrite

    在MATLAB开发中,`mmwrite`是一个非常重要的工具,它允许用户将从`mmread`函数读取的媒体文件(如电影)保存为其他常见的视频格式,如AVI、ASF、WMV和WMA。这个功能对于进行多媒体处理、视频分析或者需要在不同格式...

    MP3文件查看器exe程序

    压缩包中的"ASFView"可能是另一个相关工具,可能用于查看Advanced Systems Format(ASF)文件,这是微软开发的一种容器格式,通常用于包含Windows Media Audio(WMA)和Video(WMV)文件。尽管MP3文件查看器主要处理...

    视频转换软件,支持无限格式转换,速度极快

    把各种视频格式转换成便携视频:手机3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA; 把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB; 把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264; 把各种视频格式转换成SWF、FLV...

    视频转换大师(WinMPG Video Convert)

    它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, AMV, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, XVID, DivX, ASF, WMV, SWF, IPOD, PSP, GIF, MJPEG, QuickTime, MOV, FLV, MKV,...

    强大多媒体视频转换器

    它几乎涵盖了现在所有流行的影音多媒体体文件的格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, DivX, ASF, WMV, SWF以及 QuickTime MOV/MP4。视频转换大师(WinMPG Video ...

    视频转换大师(WinMPG Video Convert) v8.0(注册码)

    它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, AMV, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, XVID, DivX, ASF, WMV, SWF, IPOD, PSP, GIF, MJPEG, QuickTime, MOV, FLV, MKV,...

    视频转换大师专业版

    它几乎涵盖了所有流行的影音多媒体文件格式, 包括AVI, Mpg, RM, RMVB, 3GP, MP4, AMV, Mpeg, Mpeg1, Mpeg2, Mpeg4, VCD, SVCD, DVD, XVID, DivX, ASF, WMV, SWF, IPOD, PSP, GIF, MJPEG, QuickTime, MOV, FLV, MKV,...

Global site tag (gtag.js) - Google Analytics