[C#.NET][VB.NET] 如何 使用 FileStream 讀 / 寫 MP3 標籤 tag

[C#.NET][VB.NET] 如何 使用 FileStream 讀 / 寫 MP3 標籤 tag
FileStream 類別 讀Byte檔
Encoding 類別 轉檔

1.MP3存放標籤是有規則性的詳見 http://www.itgrass.com/a/csharp/C-jq/200901/11-8866.html

2.瞭解遊戲規則之後就可以開始動工了

如何讀取MP3 Tag

Step1.使用 FileStream 類別 開檔

//開檔
fs = new FileStream(myFileName, FileMode.Open);

Step2.使用 FileStream類別Seek方法指定讀檔位置,再用 Read方法 將資料讀至陣列

//資訊在MP3文件的後面,占128byte,指定資料流的末端
fs.Seek(-128, SeekOrigin.End);//讀取最後128個
fs.Read(tagBody, 0, 128);
fs.Dispose();//讀完就關掉

Step3.取得前三個byte判斷是否為mp3檔

//讀取tagFlag前三個byte
tagFlag = Encoding.Default.GetString(tagBody, 0, 3);
if (tagFlag == "TAG")
{

}

Step4.依規則讀取相關訊息

//(3—32) 的 30個bytes,放標題 (title)
title = Encoding.Default.GetString(tagBody, 3, 30).TrimEnd().Replace("\0", "") ;
//(33—62) 的 30個bytes,放演唱/奏者,藝術家
artist = Encoding.Default.GetString(tagBody, 33, 30).TrimEnd().Replace("\0", "");
//(63—92) 的 30個bytes, 放專輯
album = Encoding.Default.GetString(tagBody, 62, 30).TrimEnd().Replace("\0", "");
//(93—96) 的 4個bytes,存放 發行年份
pubYear = Encoding.Default.GetString(tagBody, 93, 4).TrimEnd().Replace("\0", "");
//(97—126) 的 30個bytes, 要分情況了:
//v1.0的情況: 存放 註釋/附加/備註信息
//v1.1的情況:前29個bytes存放 註釋/附加/備註信息
comment = Encoding.Default.GetString(tagBody, 97, 30).Replace("\0", "");
//最後一個byte (127) 存放的是 所屬的流派
number = (int)tagBody[127];
type = genre[number];
  
 

 快照-200981441855

如何寫MP3 Tag

很簡單的邏輯把讀出來的Byte依規則再寫回去,我只寫標題,有興趣的再自己改

Step1.讀檔

//開檔
fs = new FileStream(myFileName, FileMode.Open);
//資訊在MP3文件的後面,占128byte,指定資料流的末端
//讀取最後128個
fs.Seek(-128, SeekOrigin.End);
//全部讀到變數
fs.Read(tagBody, 0, 128);

Step2.清掉舊的資料

int j=0;
//清掉舊的
for (int i = 3; i < modify.Length+3; i++)
{
tagBody[i] = modify[j];
j++;
}

Step3.寫入新的資料

//寫新的
modify = Encoding.Default.GetBytes(str);
j = 0;
for (int i = 3; i < modify.Length + 3; i++)
{
tagBody[i] = modify[j];
j++;
}
fs.Write(tagBody, 0, 128);
fs.Dispose();

實作畫面如下

 

快照-20098144191

範例下載:

CS_ReadMp3Info.rar

VB_ReadMp3Info.rar

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo