设为首页 加入收藏

TOP

Mp3文件标签信息读取和写入(Kotlin)(一)
2023-07-25 21:32:29 】 浏览:45
Tags:Mp3 文件标 Kotlin

原文:Mp3文件标签信息读取和写入(Kotlin) - Stars-One的杂货小窝

最近准备抽空完善了自己的星之音乐下载器,发现下载下来的mp3文件没有对应的标签

也是了解可以通过mpatric这个库来实现标签的读取和写入,下面介绍一下关于mp3标签和贴上对应的代码示例

标签介绍

在研究过程,发现mp3音乐标签主要有以下几种格式:

  • ID3v1
  • ID3v2(目前常用)
  • APEv2

ID3v1位于文件尾部,不支持封面,不支持一些特殊字符,长度短,但兼容老设备。

ID3v2ID3v1的后继替代者,位于文件头部,支持封面和特殊字符,长度任意。推荐使用。

APEv2位于文件尾部(同时与ID3v1存在时,在ID3v1之前),同样支持封面和特殊字符,但不推荐用于mp3。

常用的主要是ID3v2.而ID3v2格式又可具体分为3种:

  • ID3v2.4 UTF-8
  • ID3v2.3 UTF-16
  • ID3v2.3 ISO-8859-1

推荐用ID3v2.4 UTF-8,如果设备不支持可退一步用ID3v2.3 UTF-16,如果设备仍不支持可再退一步用ID3v2.3 ISO-8859-1。

如果数码设备不支持,那么再试APEv2或ID3v1。根据设备支持情况进行调整就可以。

使用

引入依赖:

<dependency>
  <groupId>com.mpatric</groupId>
  <artifactId>mp3agic</artifactId>
  <version>0.9.1</version>
</dependency>
@Test
fun testRead() {

    val mp3Path = "D:\\temp\\music-download-test\\封印されし神々(東方風神録) - Whirling Truth.mp3"
    val mp3File = Mp3File(mp3Path)

    if (mp3File.hasId3v2Tag()) {
        val id3v2Tag = mp3File.id3v2Tag
        println("唱片歌曲数量: " + id3v2Tag.track)
        println("艺术家: " + id3v2Tag.artist)
        println("歌曲名: " + id3v2Tag.title)
        println("唱片名: " + id3v2Tag.album)
        println("歌曲长度:" + mp3File.lengthInSeconds + "秒")
        println("码率: " + mp3File.bitrate + " kbps " + if (mp3File.isVbr) "(VBR)" else "(CBR)")


        println("专辑插画类型" + id3v2Tag.albumImageMimeType)
        println("发行时间: " + id3v2Tag.year)
        println("流派: " + id3v2Tag.genre + " (" + id3v2Tag.genreDescription + ")")
        println("注释: " + id3v2Tag.comment)
        println("歌词: " + id3v2Tag.lyrics)
        println("作曲家: " + id3v2Tag.composer)
        println("发行公司: " + id3v2Tag.publisher)
        println("Original artist: " + id3v2Tag.originalArtist)
        println("Album artist: " + id3v2Tag.albumArtist)
        println("版权: " + id3v2Tag.copyright)
        println("URL: " + id3v2Tag.url)
        println("编码格式: " + id3v2Tag.encoder)

        //专辑插画
        val albumImageData = id3v2Tag.albumImage
        if (albumImageData != null) {
            println("专辑插图长度: " + albumImageData.size + " bytes")
            println("专辑插图类型: " + id3v2Tag.albumImageMimeType)
        }
        val imgFile = File("D:\\temp\\output.jpg")
        imgFile.writeBytes(albumImageData)
    }
}

@Test
fun testWrite() {
    //todo m4a转MP3
    //val mp3Path = "D:\\temp\\music-download-test\\Romantic Night.mp3"
    val mp3Path = "D:\\temp\\music-download-test\\test.mp3"
    val imgFile = File("D:\\temp\\music-download-test\\109951167834013257.jpg")
    val mp3File = Mp3File(mp3Path)
    val tag = mp3File.id3v2Tag
    //歌曲名
    tag.title = mp3File.filename
    //歌手
    tag.artist = "张三"
    //唱片名(专辑)
    tag.album = "张三的专辑"

    tag.setAlbumImage(imgFile.readBytes(), MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(imgFile))

    mp3File.save("D:\\temp\\music-download-test\\output.mp3")
}

之后测试,在window系统右键属性就可以看到显示了对应的属性

API大全

Mp3File对象方法

方法名 说明
getFrameCount() 获取MP3文件帧数
getStartOffset() 获取起始设置
getEndOffset() 获取结束设置
getLengthInMilliseconds() 获取MP3长度,单位毫秒
getLengthInSeconds() 获取MP3长度,单位秒
isVbr() 是否为VBR编码,不是为 CBR编码
getBitrate()
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇数据加密 - 数据库隐私字段组件 下一篇Java容器之ArrayList源码分析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目