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

最近准备抽空完善了自己的星之小说下载器(JavaFx应用 ),发现下载下来的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() 获取码率
getBitrates() 获取码率,返回map,key为码率,value为 MutableInteger 对象
getChannelMode() 获取渠道模式
isCopyright() 是否有版权
getEmphasis() 获取强调信息
getLayer() 获取压缩级别
getModeExtension() 获取模式扩展
isOriginal() 是否是原版
getSampleRate() 获取音频采样率
getVersion() 获取版本
hasXingFrame() 判断是否有 xing帧
getXingOffset() 获取xing设置
getXingBitrate() 获取xing比特率
hasId3v1Tag() 判断是否有3v1本版标签
getId3v1Tag() 获取3v1本版标签
setId3v1Tag(ID3v1 var1) 设置3v1本版标签
removeId3v1Tag() 移除3v1本版标签
hasId3v2Tag() 判断是否有3v2本版标签
getId3v2Tag() 获取3v2本版标签
setId3v2Tag(ID3v2 var1) 设置3v2本版标签
removeId3v2Tag() 移除3v2本版标签
hasCustomTag() 判断是否有自定义标签
getCustomTag() 获取自定义标签
setCustomTag(byte[] var1) 设置自定义标签
removeCustomTag() 移除自定义标签
save(String var1) 保存mp3文件

ID3v1对象方法

方法名 说明
getVersion() 获取版本
getTrack() 获取唱片歌曲数量
setTrack(String var1) 设置唱片歌曲数量
getArtist() 获取艺术家
setArtist(String var1) 设置艺术家
getTitle() 获取歌曲名
setTitle(String var1) 设置歌曲名
getAlbum() 获取唱片名
setAlbum(String var1) 设置唱片名
getYear() 获取发行时间
setYear(String var1) 设置发行时间
getGenre() 获取流派
setGenre(int var1) 设置流派
getGenreDescription() ; 获取流派描述
getComment() ; 获取注释
setComment(String var1) 设置注释
toBytes() 转换为字节数组

ID3v2对象方法(ID3v2为ID3v1的子类)

方法名 说明
getPadding() 判断是否填充
setPadding(boolean var1) 设置是否填充
hasFooter() 判断是否有页脚
setFooter(boolean var1) 设置页脚
hasUnsynchronisation() 判断是否有不同步
setUnsynchronisation(boolean var1) 设置是否有不同步
getBPM() 获取每分钟节拍数
setBPM(int var1) 设置每分钟节拍数
getGrouping() 获取分组
setGrouping(String var1) 设置分组
getKey() 获取调号,它关系到我们整首歌曲的音高范围
setKey(String var1) 设置调号
getDate() 获取日期
setDate(String var1) 设置日期
getComposer() 获取作曲家
setComposer(String var1) 设置作曲家
getPublisher() 获取发版者
setPublisher(String var1) 设置发版者
getOriginalArtist() 获取原创艺术家
setOriginalArtist(String var1) 设置原创艺术家
getAlbumArtist() 获取专辑艺术家
setAlbumArtist(String var1) 设置专辑艺术家
getCopyright() 获取版权信息
setCopyright(String var1) 设置版权信息
getArtistUrl() 获取艺术家url地址
setArtistUrl(String var1) 设置艺术家url地址
getCommercialUrl() 获取广告url地址
setCommercialUrl(String var1) 设置广告url地址
getCopyrightUrl() 获取版权url地址
setCopyrightUrl(String var1) 设置版权url地址
getAudiofileUrl() 获取音频文件路径
setAudiofileUrl(String var1) 设置音频文件路径
getAudioSourceUrl() 获取音频资源路径
setAudioSourceUrl(String var1) 设置音频资源路径
getRadiostationUrl() 获取广播url地址
setRadiostationUrl(String var1) 设置广播url地址
getPaymentUrl() 获取付款url地址
setPaymentUrl(String var1) 设置付款url地址
getPublisherUrl() 获取发版url地址
setPublisherUrl(String var1) 设置发版url地址
getUrl() 获取MP3地址
setUrl(String var1) 设置MP3地址
getPartOfSet() 获取部分配置信息
setPartOfSet(String var1) 设置部分配置信息
isCompilation() 获取是否汇编
setCompilation(boolean var1) 设置是否汇编
getChapters() 获取章节
setChapters(ArrayList var1) 设置章节
getChapterTOC() 获取章节目录
setChapterTOC(ArrayList var1) 设置章节目录
getEncoder() 获取编码格式
setEncoder(String var1) 设置编码格式
getAlbumImage() 专辑插画
setAlbumImage(byte[] var1, String var2) 设置专辑插画
setAlbumImage(byte[] var1, String var2, byte var3, String var4) 设置专辑插画
clearAlbumImage() 清除专辑插画
getAlbumImageMimeType() 专辑插画类型
getWmpRating() 获取评分
setWmpRating(int var1) 设置评分
getItunesComment() 获取调音方式
setItunesComment(String var1) 设置调音方式
getLyrics() 获取歌词
setLyrics(String var1) 设置歌词
setGenreDescription(String var1) 设置类型说明
getDataLength() 获取数据长度
getLength() 获取长度
getObseleteFormat() 获取过时的格式
getFrameSets() 获取帧组
clearFrameSet(String var1) 清除帧组

参考

Mp3文件标签信息读取和写入(Kotlin)的更多相关文章

  1. MP3文件ID3信息编辑器代码开源 - 开源研究系列文章

    上次把磁性窗体的源码开源了,这次就开源另一个程序源码:MP3文件ID3信息编辑器.这个源码也比较简单,关键在于获取和写入MP3文件的这个ID3的信息即可. 这个操作信息编辑的就封装在MP3ID3.ba ...

  2. 创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来

    /*4.创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来*/ #import <Foundation/Foundation.h>#defin ...

  3. 实现php获取mp3文件元信息如播放时间歌曲作者等

    最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ...

  4. 使用Python读取Mp3的标签信息

    什么是ID3 MP3是音频文件最流行的格式,它的全称是 MPEG layer III.但是这种格式不支持对于音频内容的描述信息,包括歌曲名称.演唱者.专辑等等. 因此在1996年,Eric Kemp在 ...

  5. FileStream文件流的读取和写入(为以后聊天工具的设计基础)

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  6. 【Python】sasa版:文件中csv读取在写入csv读取的数据和执行是否成功。

    sasa写的文件(包含解析文字) # coding=utf- from selenium import webdriver from time import sleep import keyword ...

  7. Python开发【笔记】:获取mp3文件获取信息

    import eyed3 def main(): mp3 = '8200031001_13429822982_1_00163e086216990b11e82403f00d3d9a.mp3' xx = ...

  8. 表数据文件DBF的读取和写入操作

    import sys import csv import struct import datetime import decimal import itertools from cStringIO i ...

  9. PE文件数字签名信息读取存储及格式具体解释图之上(历史代码,贴出学习)

    // 注意下图PE文件格式具体解释图中的 // IMAGE_NT_HEADERS------->OptionalHeader------>DataDirectory[IMAGE_DIREC ...

随机推荐

  1. 【Java】学习路径44-多线程入门篇

    这一章,我们学习线程的创建.线程的启动.线程的名字设置.线程的休眠.线程的加入.守护线程. 一个线程是一个单独的类的对象. 想让一个普通的类变成多线程,那么这个类需要继承Thread. 创建多线程的步 ...

  2. CF-1562B- Scenes From a Memory

    Problem - 1562B - Codeforces 题意:给定一个字符串,每次操作可以选择这个字符串中的一种字符,将他们全部都减1,最多K次操作,问可以形成的字典大小最小的字符串. 题解:首先我 ...

  3. Golang 动态脚本调研

    一.技术背景 1.1 程序的动态链接技术 在实际开发过程中,我们经常需要动态地更新程序的功能,或者在不变更程序主体文件的情况下添加或者更新程序模块. 1.1.1 动态链接库 首先最常见的是window ...

  4. KingbbaseES V8R6集群维护案例之---集群之间数据迁移

    案例说明: 生产环境是集群环境,测试环境是集群,现需要将生产环境的数据迁移到测试集群中运行,本文档详细介绍了从集群环境迁移数据的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingbase ...

  5. CDH6.2.0 搭建大数据集群

    1. 资料准备 现在官网https://www.cloudera.com 需要注册账号,未来可能会收费等问题,十分麻烦,这里有一份我自己百度云的备份 链接: https://pan.baidu.com ...

  6. 谣言检测——《MFAN: Multi-modal Feature-enhanced Attention Networks for Rumor Detection》

    论文信息 论文标题:MFAN: Multi-modal Feature-enhanced Attention Networks for Rumor Detection论文作者:Jiaqi Zheng, ...

  7. 第一行代码Android(第3版).pdf下载

    2020年人民邮电出版社出版的图书 <第一行代码Android(第3版)>是2020年4月人民邮电出版社出版的图书,作者是郭霖. 封面: 内容简介: <第一行代码 Android 第 ...

  8. Exchange 2019中启用自动转发到外部域

    今天遇到一个用户反映自动转发的邮件规则没有生效.检查了一下,邮件规则配置没有问题.用户邮箱也能正常收到邮件,但是就是没有转发出去.仔细检查邮件规则,转发的收件人是外部邮箱.Exchange出于安全考虑 ...

  9. JS 模块化 - 02 Common JS 模块化规范

    1 Common JS 介绍 Common JS 是模块化规范之一.每个文件都是一个作用域,文件里面定义的变量/函数都是私有的,对其他模块不可见.Common JS 规范在 Node 端和浏览器端有不 ...

  10. 第2篇----Istio架构概述篇

    Istio的工作机制 Istio的工作机制和架构,分为控制面和数据面两部分.控制面主要包括Pilot.Mixer.Citadel等服务组件:数据面由伴随每个应用程序部署的代理程序Envoy组成,执行针 ...