[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];
如何寫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();
實作畫面如下
範例下載:
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET