`

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的吗?

相关推荐

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

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

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

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

    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;*....

    视频转换大师(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,...

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

    把各种视频格式转换成便携视频:手机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 ...

    matlab开发-mmwrite

    matlab开发-mmwrite。从mmread读取的电影中写入avi/asf/wmv/wma文件

    视频转换大师(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,...

    视频转换大师 9.1.5 专业版

    3GP/MP4/iPOD/PSP/AMV/ASF/WMV/PDA;把各种视频转换成标准的DVD、SVCD、VCD、MPEG、RMVB;把各种视频格式转换成AVI、XVID、DIVX、MJPEG、H264;把各种视频格式转换成SWF、FLV、GIF、MOV、MKV;支持读取DVD光盘, 以及...

    豪杰超级解霸 3000英雄版(0117)

    强纠错,完美支持 DVD/VCD/RM/ASF/WMA/WMV/MOV 等上百种视音频格式的播放器。支持网络流媒体在线播放,流畅播放各种无文件影碟,立体环绕超强震撼!功能说明: 一、网络播放全面兼容 *支持网络流媒体,在线播放...

    视频转换大师v8.5绿色破解版

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

    WinMPG视频格式转换大师

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

    转码大师DVD、SVCD、VCD、MPEG、RMVB

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

    视频转换工具WinMPG_cn

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

    视频转换大师专业版 8.9.82

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

    视频转换大师WinMPG v9.2.6.rar

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

    多功能视频转换工具 Program4Pc Video Converter Pro 9.8..zip

    TS,TP,TRP,VRO,WMV,ASF,WTV,WEBM,DVD和蓝光文件,并转换他们许多不同的视频格式:MP4,M4V,AVI,MPG,WMV,3GP,3G2,SWF,MOV,FLV,WEBM,M2TS,MTS,RM,MKV,OGV,TS,DV,ASF,动画GIF,VOB,等我们向...

Global site tag (gtag.js) - Google Analytics