原文:Mp3文件標簽信息讀取和寫入(Kotlin) - Stars-One的雜貨小窩 最近準備抽空完善了自己的星之小說下載器(JavaFx應用 ),發現下載下來的mp3文件沒有對應的標簽 也是瞭解可以通過mpatric這個庫來實現標簽的讀取和寫入,下麵介紹一下關於mp3標簽和貼上對應的代碼示例 標簽 ...
原文: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 |
設置章節 |
getChapterTOC() | 獲取章節目錄 |
setChapterTOC(ArrayList |
設置章節目錄 |
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這三種類型的標簽能否任意添加或者刪除? - 知乎
- Java為MP3文件嵌入封面圖片_來自大山深處的Doge_的博客-CSDN博客
提問之前,請先看提問須知 點擊右側圖標發起提問 或者加入QQ群一起學習 TornadoFx學習交流群:1071184701