> For the complete documentation index, see [llms.txt](https://brianwu.gitbook.io/brian/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://brianwu.gitbook.io/brian/java/du-qu-3001-fu-xie-mp3-tag.md).

# 讀取、複寫MP3 Tag

## MP3

別人寫成的套件:(<https://github.com/mpatric/mp3agic/blob/master/src/main/java/com/mpatric/mp3agic/Mp3File.java>)

範例做法: C#(<https://dotblogs.com.tw/yc421206/archive/2009/08/14/10048.aspx>)

參考資料:(<https://stackoverflow.com/questions/1645803/how-to-read-mp3-file-tags>)

Field

|          | Length | Offsets |
| -------- | ------ | ------- |
| Tag      | 3      | 0-2     |
| Songname | 30     | 3-32    |
| Artist   | 30     | 33-62   |
| Album    | 30     | 63-92   |
| Year     | 4      | 93-96   |
| Comment  | 30     | 97-126  |
| Genre    | 1      | 127     |

MP3檔案會預留最後128個Byte用來當記錄、詳細資料，位置如上表格。

裡面的編碼是BIG5，當在讀取的時候要選對編碼，當然 最後輸出檔案的時候，也要選對編碼。

在做複寫動作的時候，要記得把原先的資料清空。

### 讀取檔案，並跳過前面，只要最後128Byte

```
byte[] tagBody = new byte[128];
        FileInputStream fs = new FileInputStream(file);
        fs.skip(fs.available() - 128);
        fs.read(tagBody);
        fs.close();
```

### Byte轉字串

因為整條byte拿去轉BIG5，會有字元遺失，所以要先分段切割。**Arrays.copyOfRange(Byte\[],startIndex,endIndex)**

因為Windows系統是用BIG5，所以轉換回來。

```
SongName_ = new String(Arrays.copyOfRange(TAGBody, SONG_NAME_START, SONG_NAME_END),"BIG5").trim();
```

### 字串轉Byte\[]

參考資料:(<https://stackoverflow.com/questions/18571223/how-to-convert-java-string-into-byte>)

```
byte[] b = string.getBytes();
byte[] b = string.getBytes(Charset.forName("UTF-8"));
byte[] b = string.getBytes(StandardCharsets.UTF_8); // Java 7+ only
```

## 複寫檔案

參考資料:(<https://www.journaldev.com/861/java-copy-file>)

因為要修改整個檔案的最後128 byte，我參考複製檔案的方式，將前面複製完後，後面128 Byte另外處理。

## 成果

<https://github.com/smilebrian0515/BrianToolsByJava>
