玩酷之家

 找回密码
 立即注册
查看: 2039|回复: 1

VB.NET 使用 TagLib Sharp 媒体标签库

[复制链接]

20

主题

21

帖子

909

积分

高级会员

Rank: 4

积分
909
QQ
发表于 2019-3-2 22:25:34 | 显示全部楼层 |阅读模式
本帖最后由 1059-Studio 于 2019-3-3 13:03 编辑

【引用介绍】
  • TagLib Sharp 是美国网站 GitHub 上的一个开源项目,用于读取和编辑媒体文件的标签数据
  • 项目主页:https://github.com/mono/taglib-sharp
  • TagLib Sharp 是一个引用 DLL,在工程中直接添加该引用即可使用

  • 由于论坛编辑器兼容性问题,本帖无法采用代码编辑器展示代码
  • 本文对应的dll版本号:2.1.0.0

【基本操作】
读取标签
        Dim file As TagLib.File = TagLib.File.Create(文件路径)
        file.Tag.[Object]

编辑标签
        Dim file As TagLib.File = TagLib.File.Create(文件路径)
        file.Tag.[Object] = [Object]
        file.Save()

读取媒体参数
        Dim file As TagLib.File = TagLib.File.Create(文件路径)
        file.Properties.[Object]

【读取和编辑音乐专辑封面】
读取封面
        Dim file As TagLib.File = TagLib.File.Create(文件路径)
        If file.Tag.Pictures.Length >= 1 Then '这里判断Pictures数组的元素数量也可以
            Dim bin = DirectCast(file.Tag.Pictures(0).Data.Data, Byte())
            Dim AlbumArt As System.Drawing.Image = Image.FromStream(New IO.MemoryStream(bin))
            [ImageObject]= AlbumArt '获取封面图片
            [Object]= file.Tag.Pictures(0).Type.ToString() '获取封面类型,我这里是返回的字符串形式的名称
            [Object]= file.Tag.Pictures(0).Description '获取封面描述
            [Object]= AlbumArt.Width '获取封面宽度
            [Object]= AlbumArt.Height '获取封面高度
        Else
            [ImageObject] = Nothing
        End If

        Image 那一句在一些VS编辑器中可能会报错,在模块外层写 Imports System.Drawing.Image 即可解决
        一首歌曲文件可以保存多张专辑图,每张都可以指定类型和描述,判断Pictures元素数量即可实现
         
编辑封面
        Dim file As TagLib.File = TagLib.File.Create(文件路径)
        Dim pic As TagLib.Picture = TagLib.Picture.CreateFromPath(图片路径)
        pic.Description = [Object]
        pic.Type = TagLib.PictureType.[Object]
        file.Tag.Pictures = New TagLib.IPicture() {pic}
        file.Save()

          注意这只能保存一张专辑封面并且会覆盖掉其他所有的专辑封面信息

为了方便大家在保存专辑封面时需要判断众多的封面类型,我把这个 Select Case 结构在这里写出
        Select Case [TextObject]
            Case "Artist"
                pic.Type = TagLib.PictureType.Artist
            Case "BackCover"
                pic.Type = TagLib.PictureType.BackCover
            Case "Band"
                pic.Type = TagLib.PictureType.Band
            Case "BandLogo"
                pic.Type = TagLib.PictureType.BandLogo
            Case "ColoredFish"
                pic.Type = TagLib.PictureType.ColoredFish
            Case "Composer"
                pic.Type = TagLib.PictureType.Composer
            Case "Conductor"
                pic.Type = TagLib.PictureType.Conductor
            Case "DuringPerformance"
                pic.Type = TagLib.PictureType.DuringPerformance
            Case "DuringRecording"
                pic.Type = TagLib.PictureType.DuringRecording
            Case "FileIcon"
                pic.Type = TagLib.PictureType.FileIcon
            Case "FrontCover"
                pic.Type = TagLib.PictureType.FrontCover
            Case "Illustration"
                pic.Type = TagLib.PictureType.Illustration
            Case "LeadArtist"
                pic.Type = TagLib.PictureType.LeadArtist
            Case "LeafletPage"
                pic.Type = TagLib.PictureType.LeafletPage
            Case "Lyricist"
                pic.Type = TagLib.PictureType.Lyricist
            Case "Media"
                pic.Type = TagLib.PictureType.Media
            Case "MovieScreenCapture"
                pic.Type = TagLib.PictureType.MovieScreenCapture
            Case "Other"
                pic.Type = TagLib.PictureType.Other
            Case "OtherFileIcon"
                pic.Type = TagLib.PictureType.OtherFileIcon
            Case "PublisherLogo"
                pic.Type = TagLib.PictureType.PublisherLogo
            Case "RecordingLocation"
                pic.Type = TagLib.PictureType.RecordingLocation
        End Select


【部分标签翻译和用法】
标题 Title
副标题 Subtitle
参与创作的艺术家Performers.FirstOrDefault
专辑Album
流派Genres.FirstOrDefault
Year
注释Comment
版权Copyright
音轨号Track
CD号Disc
每分钟节拍数BeatsPerMinute
专辑集艺术家AlbumArtists.FirstOrDefault
发布者Publisher
作曲者Composers.FirstOrDefault
指挥者Conductor
组说明Grouping
歌词Lyrics
- -
- -
修改时一维数组问题New System.String() {Object}

【解决读取标签乱码】

    Public Function FixString(ByVal GBKString As String) As String
        Dim buffer As Byte() = System.Text.Encoding.Unicode.GetBytes(GBKString)
        Dim m As Integer = 0
        If buffer.Length Mod 2 = 1 Then
            Return GBKString
            Exit Function
        End If
        For m = 0 To buffer.Length - 1
            If m Mod 2 = 1 Then
                If Not buffer(m) = 0 Then
                    Return GBKString
                    Exit Function
                End If
            End If
        Next
        Dim Result(0) As Byte
        Dim n As Integer = 0
        For m = 0 To buffer.Length - 1
            If buffer(m) = 0 Then Continue For
            ReDim Preserve Result(n)
            Result(n) = buffer(m)
            n += 1
        Next m      
        Return System.Text.Encoding.Default.GetString(Result)
    End Function

湖边的稻草 1059 Studio
回复

使用道具 举报

4

主题

20

帖子

157

积分

注册会员

Rank: 2

积分
157
QQ
发表于 2019-3-2 22:49:34 | 显示全部楼层
过来支持一下。
细嗅蔷薇。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|玩酷之家 ( 鄂ICP备14012049号-1 )|

GMT+8, 2020-8-4 16:21 , Processed in 1.107602 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表