Mp3文件標籤信息讀取和寫入(Kotlin)

原文: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) 清除幀組

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章