VB.Net MP3関連
ちょっと前は、MP3ファイルをバイナリで開いてID3v1タグを取得して…
とかそこらへんに落ちていたコードを参考にやっていましたが。
ID3v1しか取得できないですし、ID3v1であっても、しっかりと取得できなかった場合があった気がします。
それで、出来る限り取得できた方が良いと思ったのでDLLを探しました。
つい最近までは、 曲名、アーティスト名やタイトルの取得は
ID3.dll http://id3.codeplex.com/
を利用していました。
最初、このDLLでコードを書いていた時、書き方感覚的に判ったから。が理由ですね。
ちなみに「曲の長さ」までこのDLLで取得出来ることを知りませんでした。
プレイリストに追加した時点。プレイリストに曲名、アーティスト、アルバム、曲の長さを表示したかったので
「曲の長さ」に関しては、
mciSendStringで一度ファイルを開いて、lengthで取得、秒:分に計算後にファイルを一度閉じる。
という処理を行わせていました。
結構な曲数をリストに追加する場合、処理が重くなるんですよねぇ…。
DLLで取得できたら、多少でも軽くなるんじゃないかなぁ。と思って。
このDLL内に無いか探したら、普通に合ったんですけど。
ただ、ID3v2.4?で書かれたMP3ファイルだと曲の長さが上手く取得できませんでした。
アーティスト名などは取得できましたが、曲の長さを取得しようとしても「2.4はサポートして無い!」とエラーを嘔吐。
そこだけがちょっと。。
どうせなら、取得できて欲しかったので別のDLLに。
UltraID3Lib
http://home.fuse.net/honnert/UltraID3Lib/
ID3.DLLをダウンロードした時期…いつかわからないけど。
結構前にこちらのDLLもダウンロードしていて、VB2010で参照させていたのですが。
その、触った当初…どう記述させたら良いんだ??と感覚的に判らなかったので放置されてました。
そして、「曲の長さ」について、取得できないかなぁ。と思い。
触れてみたら、何となく判って。取得コードを前DLLのヤツから書き換えて。
先程の、「曲の長さ」が上手く取得できないファイルをこっちのDLLを使って取得したら…?
イョ━━━━ヽ(=゚ω゚)人(゚ω゚=)ノ━━━━!!
はい。こっちのがちゃんと取得できました。
なんて事だ!って感じなんでした。。
利用するなら、こっちの UltraID3Lib が良いかも?
さて。無駄話は終えまして。
*DLLをダウンロード後、 UltraID3Lib.dllをVB.netに参照させてください。
-----------------------------------------------------------------------------
'ID3タグを取得するMP3ファイルの場所
Dim FilePath as String = "MP3ファイル"
'ID3Tag取得の準備
Dim ID3Tag As New HundredMilesSoftware.UltraID3Lib.UltraID3
'ID3タグを取得する為に、ファイルを読み込ませる
ID3Tag.Read(FilePath)
Dim EncodeB() As Byte '文字エンコード用変数
'各、代入用変数
Dim MusicTitle As String = "" 'タイトル
Dim MusicAlbum as String="" 'アルバム
Dim MusicArtist as String="" 'アーティスト
Dim MusicTotalTime as string="00:00" '曲の長さ
'タイトル
EncodeB = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(ID3Tag.Title)'文字エンコード用
MusicTitle = System.Text.Encoding.GetEncoding("Shift-JIS").GetString(EncodeB).Replace(vbNullChar, "")'Shift-JISにエンコード
'ID3タグから取得できなかった場合、拡張子を除くファイル名を曲名として代入。
If MusicTitle = "" Then MusicTitle = IO.Path.GetFileNameWithoutExtension(FilePath)
’アルバム
EncodeB = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(ID3Tag.Album) '文字エンコード用
MusicAlbum = System.Text.Encoding.GetEncoding("Shift-JIS").GetString(EncodeB).Replace(vbNullChar, "")’Shift-JISにエンコード
'アルバムがID3タグから取得できなかった場合、Noneとする
If MusicAlbum = "" Then MusicAlbum = "None"
’アーティスト
EncodeB = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(ID3Tag.Artist)'文字エンコード用
MusicArtist = System.Text.Encoding.GetEncoding("Shift-JIS").GetString(EncodeB).Replace(vbNullChar, "")'Shift-JISにエンコード
'アーティストがID3タグから取得できなかった場合、Noneとする
If MusicArtist = "" Then MusicArtist = "None"
'曲の長さ(ミリ秒から計算する方法で)
'一桁の場合、先頭に0をつけて表示。(3分8秒の場合、03:08と表示)
Dim M, S As String
M = Convert.ToString(ID3Tag.Duration.TotalMilliseconds ¥ 1000 ¥ 60).PadLeft(2, Convert.ToChar("0")) '分
S = Convert.ToString(ID3Tag.Duration.TotalMilliseconds ¥ 1000 Mod 60).PadLeft(2, Convert.ToChar("0")) '秒
MusicTotalTime = M & ":" & S
---------------------------------------------------------------------------------------
判りにくいかもしれませんが、こんな感じのコードで取得できます。
----------------------------------------------------------------------------------------
'ID3タグを取得するMP3ファイルの場所
Dim FilePath as String = "MP3ファイル"
Dim ID3Tag As New HundredMilesSoftware.UltraID3Lib.UltraID3
'MP3ファイルの読み込み
ID3Tag.Read(FilePath)
'アルバムアートのタグを取得
Dim AlbumArtTag = ID3Tag.ID3v2Tag.Frames.GetFrames(HundredMilesSoftware.UltraID3Lib.CommonMultipleInstanceID3v2FrameTypes.Picture)
'アルバムアートをPictureBoxに表示
If AlbumArtTag.Count > 0 Then
PictureBox1.Image = CType(AlbumArtTag.Item(0), HundredMilesSoftware.UltraID3Lib.ID3v2PictureFrame).Picture
End If