Kotlin Mp3文件标签信息读取和写入

原文:Mp3文件标签信息读取和写入(Kotlin) - Stars-One的杂货小窝
最近准备抽空完善了自己的星之小说下载器(JavaFx应用 ),发现下载下来的mp3文件没有对应的标签
也是了解可以通过mpatric这个库来实现标签的读取和写入,下面介绍一下关于mp3标签和贴上对应的代码示例
标签介绍在研究过程,发现mp3音乐标签主要有以下几种格式:

  • ID3v1
  • ID3v2(目前常用)
  • APEv2
ID3v1位于文件尾部,不支持封面,不支持一些特殊字符,长度短,但兼容老设备 。
【Kotlin Mp3文件标签信息读取和写入】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>@Testfun testRead() {val mp3Path = "D:\\temp\\music-download-test\\封印されし神々(東方風神録) - Whirling Truth.mp3"val mp3File = Mp3File(mp3Path)if (mp3File.hasId3v2Tag()) {val id3v2Tag = mp3File.id3v2Tagprintln("唱片歌曲数量: " + 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 = https://www.huyubaike.com/biancheng/id3v2Tag.albumImageif (albumImageData != null) {println("专辑插图长度: " + albumImageData.size + " bytes")println("专辑插图类型: " + id3v2Tag.albumImageMimeType)}val imgFile = File("D:\\temp\\output.jpg")imgFile.writeBytes(albumImageData)}}@Testfun 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)清除帧组参考

经验总结扩展阅读