Mp3文件标签信息读取和写入(Kotlin)
原文:Mp3文件标签信息读取和写入(Kotlin) - Stars-One的杂货小窝
最近准备抽空完善了自己的星之小说下载器(JavaFx应用 ),发现下载下来的mp3文件没有对应的标签
也是了解可以通过mpatric这个库来实现标签的读取和写入,下面介绍一下关于mp3标签和贴上对应的代码示例
标签介绍
在研究过程,发现mp3音乐标签主要有以下几种格式:
ID3v1
ID3v2
(目前常用)APEv2
ID3v1
位于文件尾部,不支持封面,不支持一些特殊字符,长度短,但兼容老设备。
ID3v2
是ID3v1
的后继替代者,位于文件头部,支持封面和特殊字符,长度任意。推荐使用。
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) | 清除帧组 |
参考
- mpatric/mp3agic: A java library for reading mp3 files and reading / manipulating the ID3 tags (ID3v1 and ID3v2.2 through ID3v2.4).
- mp3处理工具(mp3agic)_郑重其事,鹏程万里的博客-CSDN博客
- 请问mp3音乐标签中,ID3v1,ID3v2,APEv2这三种类型的标签能否任意添加或者删除? - 知乎
Mp3文件标签信息读取和写入(Kotlin)的更多相关文章
- MP3文件ID3信息编辑器代码开源 - 开源研究系列文章
上次把磁性窗体的源码开源了,这次就开源另一个程序源码:MP3文件ID3信息编辑器.这个源码也比较简单,关键在于获取和写入MP3文件的这个ID3的信息即可. 这个操作信息编辑的就封装在MP3ID3.ba ...
- 创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来
/*4.创建一个目录info,并在目录中创建一个文件test.txt,把该文件的信息读取出来,并显示出来*/ #import <Foundation/Foundation.h>#defin ...
- 实现php获取mp3文件元信息如播放时间歌曲作者等
最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ...
- 使用Python读取Mp3的标签信息
什么是ID3 MP3是音频文件最流行的格式,它的全称是 MPEG layer III.但是这种格式不支持对于音频内容的描述信息,包括歌曲名称.演唱者.专辑等等. 因此在1996年,Eric Kemp在 ...
- FileStream文件流的读取和写入(为以后聊天工具的设计基础)
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- 【Python】sasa版:文件中csv读取在写入csv读取的数据和执行是否成功。
sasa写的文件(包含解析文字) # coding=utf- from selenium import webdriver from time import sleep import keyword ...
- Python开发【笔记】:获取mp3文件获取信息
import eyed3 def main(): mp3 = '8200031001_13429822982_1_00163e086216990b11e82403f00d3d9a.mp3' xx = ...
- 表数据文件DBF的读取和写入操作
import sys import csv import struct import datetime import decimal import itertools from cStringIO i ...
- PE文件数字签名信息读取存储及格式具体解释图之上(历史代码,贴出学习)
// 注意下图PE文件格式具体解释图中的 // IMAGE_NT_HEADERS------->OptionalHeader------>DataDirectory[IMAGE_DIREC ...
随机推荐
- Java---Stream进阶
由于本文需要有一定的Stream基础,所以如果不懂什么是Stream的同学请移步:Java---Stream入门 操作分类 graph LR 操作分类 --- 中间操作 终端操作 --- 操作分类 中 ...
- 第六章:Django 综合篇 - 10:消息框架 message
在网页应用中,我们经常需要在处理完表单或其它类型的用户输入后,显示一个通知信息给用户. 对于这个需求,Django提供了基于Cookie或者会话的消息框架messages,无论是匿名用户还是认证的用户 ...
- Nginx支持web界面执行bash|python等系统命令和脚本,可以传递参数
文章转载自:https://me.jinchuang.org/archives/114.html ,有修改 步骤总结 1.安装好nginx,假设其html根路径为/usr/share/nginx/ht ...
- Redis可视化工具(支持ssh链接)
1.Redis Desktop Manager RedisDesktopManager,简称RDM,这是一款很出名的Redis可视化管理工具,支持Windows,Mac,Ipad,LInux 开源地址 ...
- 第二章:视图层 - 1:URL路由基础
路由的编写方式是Django2.0和1.11最大的区别所在.Django官方迫于压力和同行的影响,不得不将原来的正则匹配表达式,改为更加简单的path表达式,但依然通过re_path()方法保持对1. ...
- URL Search查询
#基本查询 GET /movies/_search?q=2012&df=title&sort=year:desc&from=0&size=10&timeout= ...
- Pjax 下动态加载插件方案
在纯静态网站里,有时候会动态更新某个区域往会选择 Pjax(swup.barba.js)去处理,他们都是使用 ajax 和 pushState 通过真正的永久链接,页面标题和后退按钮提供快速浏览体验. ...
- PAT (Basic Level) Practice 1025 反转链表 分数 25
给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...
- NSIS Studio2.1汉化版
这个东西早些时候是我从老外那里下载回来后放在了群共享里面,中间跟着作者的节奏更新了几次,后来和LmTec聊这个软件的时候提出了汉化的设想,可能是LmTec兄弟看这个软件确实不错,就一口答应了下来,结果 ...
- Educational Codeforces Round 106 (Rated for Div. 2)
就ac了2题... A题一开始题意模模糊糊的似懂非懂,然后自己按样例推出了题意,简单题很容易ac了.还是自己的英语水平太菜了.... B题根据0和1的位置关系能看出来,因为0不能在1后面, 所以有00 ...