5,534,119 members and growing! (17,195 online)
Email Password   helpLost your password?
General Programming » Algorithms & Recipes » Algorithms     Intermediate

Read MP3 header information and read/write the ID3v1 tag

By Thommy Mewes

A small solution for reading MPEG audio headers and the ID3v1 tag
VB, Windows, .NET 1.1, .NETVisual Studio, VS.NET2003, Dev

Posted: 1 Mar 2005
Updated: 1 Mar 2005
Views: 102,607
Bookmarked: 49 times
Announcements
Want a new Job?



Search    
Advanced Search
Sitemap
23 votes for this Article.
Popularity: 5.37 Rating: 3.94 out of 5
2 votes, 8.7%
1
1 vote, 4.3%
2
4 votes, 17.4%
3
3 votes, 13.0%
4
13 votes, 56.5%
5

Introduction

There are many other articles at The Code Project describing the audio header and tag information, but none in VB.NET. So it's time to update my very old article (Reading and writing MP3 ID3v1 tags ) with nicer code and extend it to read the MPEG header information.

I don't want to go into detail about the structure of MPEG audio headers, because Konrad Windszus already has a very good article (MPEG Audio Frame Header) about that. If you're interested in the structure of the audio header or the ID3 tag format i recommend to visit the following sites:

Using the code

I wrote two classes to handle the header and tag information, called MP3Info and ID3v1Tag. The following code will show the structure to use the classes:

Dim objMP3Info As New _
 Monotic.Multimedia.MP3.MP3Info
With ListView1
    ''' Set the filename property

    objMP3Info.Filename = "c:\test.mp3"

    ''' Add the header information to a listview

    .Add("Filesize").SubItems.Add(objMP3Info.Filesize & " Byte")
    .Add("SamplingRateFrequency").SubItems.Add _
     (objMP3Info.SamplingRateFrequency & " Hz")
    .Add("Padding").SubItems.Add(objMP3Info.Padding & " Bytes")
    .Add("Private").SubItems.Add(objMP3Info.PrivateBit)
    .Add("Copyright").SubItems.Add(objMP3Info.Copyright)
    .Add("OriginalBit").SubItems.Add(objMP3Info.OriginalBit)
    .Add("Bitrate").SubItems.Add(objMP3Info.Bitrate & " bps")
    .Add("FrameSamples").SubItems.Add(objMP3Info.FrameSamples)
    .Add("FrameSize").SubItems.Add(objMP3Info.FrameSize & " Byte")
    .Add("Length").SubItems.Add(objMP3Info.Length & " s (" 
     & Int(objMP3Info.Length / 60) & ":" & _
      objMP3Info.Length Mod 60 & " m)")
    .Add("HeaderPosition").SubItems.Add(objMP3Info.HeaderPosition)
    .Add("VBRScale").SubItems.Add(objMP3Info.VBRScale)

    Select Case objMP3Info.MPEGVersion
        Case MP3.MPEGVersionEnum.MPEG1
            .Add("MPEGType").SubItems.Add("MPEG 1")
        Case MP3.MPEGVersionEnum.MPEG2
            .Add("MPEGType").SubItems.Add("MPEG 2")
        Case MP3.MPEGVersionEnum.MPEG25
            .Add("MPEGType").SubItems.Add("MPEG 2.5")
    End Select

    Select Case objMP3Info.Layer
        Case MP3.LayerEnum.LayerI
            .Add("Layer").SubItems.Add("Layer I")
        Case MP3.LayerEnum.LayerII
            .Add("Layer").SubItems.Add("Layer II")
        Case MP3.LayerEnum.LayerIII
            .Add("Layer").SubItems.Add("Layer III")
    End Select

    Select Case objMP3Info.Protection
        Case MP3.ProtectionEnum.None
            .Add("Protection").SubItems.Add("None")
        Case MP3.ProtectionEnum.CRC
            .Add("Protection").SubItems.Add("By CRC")
    End Select

    Select Case objMP3Info.ChannelMode
        Case MP3.ChannelModeEnum.DualChannel
            .Add("ChannelMode").SubItems.Add("Dual Channel")
        Case MP3.ChannelModeEnum.JointStereo
            .Add("ChannelMode").SubItems.Add("Joint Stereo")
        Case MP3.ChannelModeEnum.SingleChannel
            .Add("ChannelMode").SubItems.Add("Single Channel")
        Case MP3.ChannelModeEnum.Stereo
            .Add("ChannelMode").SubItems.Add("Stereo")
    End Select

    Select Case objMP3Info.Emphasis
        Case MP3.EmphasisEnum.CCIT
            .Add("Emphasis").SubItems.Add("CCIT")
        Case MP3.EmphasisEnum.MS5015
            .Add("Emphasis").SubItems.Add("50/15 ms")
        Case MP3.EmphasisEnum.None
            .Add("Emphasis").SubItems.Add("None")
    End Select

    Select Case objMP3Info.Encoding
        Case MP3.EncodingEnum.CBR
            .Add("Encoding").SubItems.Add("CBR")
        Case MP3.EncodingEnum.VBR
            .Add("Encoding").SubItems.Add("VBR")
    End Select

    ''' Add the ID3v1 tag information to a listview

    If (objMP3Info.ID3v1Tag.TagAvailable) Then
        .Add("ID3 Title").SubItems.Add _
         (objMP3Info.ID3v1Tag.Title)
        [...]
    End If

    ''' Update the tag

    objMP3Info.ID3v1Tag.Title = "Another title"
    objMP3Info.ID3v1Tag.Update()

End With

Please have a look at the sample and the class code to see all the features.

Points of Interest

Unlike other articles, this class will handle CBR and VBR encoded files, so the playtime is calculated correctly.

The class is well-commented with XML comments made by AxTools CodeSmart 2005 and NDoc . I included the generated HTML help file in the download.

I'm working on reading and writing the much more complex ID3v2.x tags at the moment (80% done, just compressed frames are a little bit tricky). If you are interested in this, i will update this article in the future.

History

27.02.2004 Release of version 1

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Thommy Mewes


Feel free to contact me via Email or MSN Messenger (thommy@live.com).
Occupation: Architect
Company: Albamond GmbH
Location: Germany Germany

Other popular Algorithms & Recipes articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 25 of 32 (Total in Forum: 32) (Refresh)FirstPrevNext
Subject  Author Date 
GeneralSet mp3-Tag with objMP3Infomembersquirrel910:45 28 Jul '07  
QuestionIs it?memberRola /anglian/1:03 12 Jun '07  
GeneralRemote MP3memberohadioe26:33 30 Apr '07  
GeneralOverFlow searching Genresmemberricsamma18:25 15 Nov '06  
AnswerRe: OverFlow searching GenresmemberThommy Mewes21:39 15 Nov '06  
GeneralAdding Info to a listboxmemberJohn Dovey3:36 7 Sep '06  
GeneralHow to use this dll in Exel Macro?memberstrangerland19:16 26 May '06  
AnswerRe: How to use this dll in Exel Macro? [modified]memberbill-tor18:50 4 Jan '07  
GeneralBitrate problemmemberAlberto Venditti10:12 15 Feb '06  
GeneralRe: Bitrate problemmemberAndyLang16:17 15 Jul '07  
GeneralRe: Bitrate problemmemberLegoMindstorms11:44 5 Apr '08  
QuestionUpdate MissingmemberIftikhar Ali0:54 17 Jan '06  
AnswerRe: Update MissingmemberThommy Mewes9:44 17 Jan '06  
GeneralRe: Update MissingmemberIftikhar Ali21:33 17 Jan '06  
GeneralPassword???memberGodz1lla13:44 1 Jan '06  
GeneralRe: Password???memberThommy Mewes9:45 17 Jan '06  
GeneralException by reading header info from CDmemberRonny Foerster21:03 29 May '05  
GeneralRe: Exception by reading header info from CDmemberThommy Mewes13:21 16 Jun '05  
GeneralRe: Exception by reading header info from CDmemberJef Lagueux13:59 21 Mar '06  
QuestionRe: Exception by reading header info from CDmemberKaosKidd5:11 7 Dec '06  
GeneralRe: Exception by reading header info from CDmembercicijay10:32 5 Aug '07  
GeneralWhat kind of listview do you usememberratel321:06 30 Apr '05  
GeneralRe: What kind of listview do you usememberThommy Mewes11:34 1 May '05  
GeneralRe: What kind of listview do you usememberratel33:42 5 May '05  
GeneralRe: What kind of listview do you usememberXDG3:02 24 May '05  

General General &nb