none
关于音乐文件信息的编程操作问题 RRS feed

  • 问题

  • 最近要写个小程序,用来读取和编辑mp3、wma等文件的媒体信息。我看了一下网上的方法,基本上都是读取一个mp3文件的末尾128个字节来操作。
    可是这样的话只能读取到很有限的信息:
    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;//保留位,一个字节 
    } 
    
    可是Windows media player 能够读取和编辑的信息明显要多很多,比如:



    它可以编辑更多的媒体信息,还可以把歌词也写到mp3文件中,它甚至可以直接把一张图片写入mp3文件中当作专辑封面。
    如何才能实现这么多的功能呢?
    2009年6月5日 8:04

答案

  • 呵呵,楼主,基类库没有提供相关的操作,

    利用WindowsMediaPlayer的方法,直接调用。

    优点:1。支持所有WindowMediaPlayer支持的媒体文件,扩展性好。

               2。支持Tag3V2,可以取得更详细的资料。

               3。写法简捷了很多。

    WindowsMediaPlayer player = new WindowsMediaPlayer();
    IWMPMedia me = player.newMedia(strUrl);
    for (int i = 0; i < me.attributeCount; i++)
    {
           Console.WriteLine("{0}:    {1}       {2}", i, me.getAttributeName(i), me.getItemInfo(me.getAttributeName(i)));
    }

    =================================================

    输出结果:

            //MP3
            //0:    Author       A-MEI
            //1:    AverageLevel       8172
            //2:    CurrentBitrate     
            //3:    Duration       311.902
            //4:    FileSize       4995492
            //5:    Is_Protected       False
            //6:    IsVBR       False
            //7:    PeakValue       32767
            //8:    SourceURL       D:\film\如果你也听说.mp3
            //9:    Title       如果你也聽說
            //10:    WM/AlbumTitle       Star
            //11:    WM/Genre       pop
            //12:    WM/GenreID     
            //13:    WM/TrackNumber       9

            //WMA
            //0:    Author       品冠
            //1:    Copyright       请支持购买正版CD
            //2:    CurrentBitrate     
            //3:    Description       www.lnbx.net
            //4:    Duration       288.417
            //5:    FileSize       1759488
            //6:    Is_Protected       False
            //7:    IsVBR       False
            //8:    SourceURL       D:\film\恍然大悟.wma
            //9:    Title       恍然大悟
            //10:    WM/AlbumTitle       后来的我(新歌+精选)
            //11:    WM/Genre       Pop
            //12:    WM/GenreID     
            //13:    WM/TrackNumber       13
            //14:    WM/UserWebURL     
            //15:    WM/Year       2005
    邹俊才
    2009年6月7日 9:49
    版主
  • 您好,mp3文件末尾128字节存储的是此歌曲的ID3v1信息。
    更多信息(例如艺术家、流派、日期等等)现在流行使用ID3v2结构(比较流行的版本是ID3v2.3),ID3v2结构是放在mp3文件的开头的,而且不固定大小。

    关于ID3v2的官方介绍(英文):http://www.id3.org/id3v2.3.0


    ~~~~~ 如果我的回复对您有所帮助,请您点击一下此回复右上角的“投票认定帖子内容有帮助” ~~~~~
    ~~~~~ 向着三颗奖牌出发!^______^ ~~~~~
    2009年6月5日 14:36

全部回复

  • 多媒体文件是一串二进制代码,可以说是媒体流吧,假设下面的。。

    1010100010101011101010101010110101010

    不同的格式的音乐都会将信息放到文件中,比如MP3,我不知道具体的,但是定义的时候,是从第N个地方开始定义音阶,而前面都是文件信息,比如前三个代表音乐的名字,然后三个代表作曲者。。等等等等,最后一些信息完了之后,就是音阶了。

    其实也就是个编码解码的过程。也是为什么这么多音乐格式彼此要转换,不兼容了。

    你说的末尾128个字节就是存放这些信息的,说不定其他地方存放了这个信息呢。

    我觉得应该是这样,上课学的,不过不是很深入的多媒体,如果有错,希望多探讨 :)

    低调,低调
    哈哈,书出了,可以点这里购买哦。。
    2009年6月5日 10:33
    版主
  • 您好,mp3文件末尾128字节存储的是此歌曲的ID3v1信息。
    更多信息(例如艺术家、流派、日期等等)现在流行使用ID3v2结构(比较流行的版本是ID3v2.3),ID3v2结构是放在mp3文件的开头的,而且不固定大小。

    关于ID3v2的官方介绍(英文):http://www.id3.org/id3v2.3.0


    ~~~~~ 如果我的回复对您有所帮助,请您点击一下此回复右上角的“投票认定帖子内容有帮助” ~~~~~
    ~~~~~ 向着三颗奖牌出发!^______^ ~~~~~
    2009年6月5日 14:36
  • 呃....
    谢谢你们的回复
    我是在想,有没有一个什么类,把对这些信息的操作,做了一个封装呢?
    2009年6月6日 6:07
  • 呵呵,楼主,基类库没有提供相关的操作,

    利用WindowsMediaPlayer的方法,直接调用。

    优点:1。支持所有WindowMediaPlayer支持的媒体文件,扩展性好。

               2。支持Tag3V2,可以取得更详细的资料。

               3。写法简捷了很多。

    WindowsMediaPlayer player = new WindowsMediaPlayer();
    IWMPMedia me = player.newMedia(strUrl);
    for (int i = 0; i < me.attributeCount; i++)
    {
           Console.WriteLine("{0}:    {1}       {2}", i, me.getAttributeName(i), me.getItemInfo(me.getAttributeName(i)));
    }

    =================================================

    输出结果:

            //MP3
            //0:    Author       A-MEI
            //1:    AverageLevel       8172
            //2:    CurrentBitrate     
            //3:    Duration       311.902
            //4:    FileSize       4995492
            //5:    Is_Protected       False
            //6:    IsVBR       False
            //7:    PeakValue       32767
            //8:    SourceURL       D:\film\如果你也听说.mp3
            //9:    Title       如果你也聽說
            //10:    WM/AlbumTitle       Star
            //11:    WM/Genre       pop
            //12:    WM/GenreID     
            //13:    WM/TrackNumber       9

            //WMA
            //0:    Author       品冠
            //1:    Copyright       请支持购买正版CD
            //2:    CurrentBitrate     
            //3:    Description       www.lnbx.net
            //4:    Duration       288.417
            //5:    FileSize       1759488
            //6:    Is_Protected       False
            //7:    IsVBR       False
            //8:    SourceURL       D:\film\恍然大悟.wma
            //9:    Title       恍然大悟
            //10:    WM/AlbumTitle       后来的我(新歌+精选)
            //11:    WM/Genre       Pop
            //12:    WM/GenreID     
            //13:    WM/TrackNumber       13
            //14:    WM/UserWebURL     
            //15:    WM/Year       2005
    邹俊才
    2009年6月7日 9:49
    版主
  • 嗯,你这个方法很好,可是我用着感觉好像有点问题,麻烦你能不能帮我看看:
    问题在于那个计数器的终点值算出来是1,就是说,他好像认为这个MP3文件里面只有一条信息,命令行下面也只显示出来一条信息程序就返回了,这是怎么回事啊?
    有没有相关操作的详细一点的说明资料?谢谢!
    2009年6月8日 14:02
  • 我知道我的问题出在哪里了,呵呵,查了半天原来是我粘贴路径的时候出来问题,呵呵
    我看了一下返回数据,有的歌曲返回值多一些,这一首有两百多项数据,有点歌曲少一些,我后来试的一个有99项数据
    请问哪里有这些数据含义的详细解释啊?
    谢谢
    2009年6月8日 14:13
  • 不客气,具体的数据的详细解释我真没有查过,估计MSDN有,字面上应该也能理解一些!
    邹俊才
    2009年6月8日 15:04
    版主