編集ツールの自作でスキルアップ(最終回・TagLibの使い方)

プログラミング入門
この記事は約8分で読めます。

今回は、フリーのMP3タグ編集用クラスライブラリをC#で使うための方法について解説します。

TagLibで検索すると、いくつかのサイトが表示されますが、簡単な説明とサンプルプログラムだけ紹介されていることが多く、実際使った時に起きる文字化けの対応方法がほとんど記載されていません。

ここでは、TagLibの使い方と文字化けの対策についても解説しています。

TagLibはMP3タグが編集できるフリーのクラスライブラリ

MP3タグを編集する方法として、以下の方法が考えられます。

  1. タグ情報が格納されている部分を直接編集
  2. OS標準の「Shell32.dll」を使ってファイルのプロパティを編集
  3. フリーのクラスライブラリ「TagLib」などを使ってタグを編集

このうち、1はタグの内容がいくつかのバージョンで異なるため、それらを考慮する必要があり、難易度は高めです。

2についてはファイルのタグ情報にMP3タグが含まれているようなイメージで、MP3タグが保存されている場所とは違う場所に格納されているようです。

また、「Sell32.dll」を使ってファイルのタグ情報を変更する方法が見つかりませんでしたので、編集するという事に関しては現時点でこの方法は使えません。

3はMP3タグの読み書きが簡単に行えるので、現時点での選択しはこの方法オンリーになります。

特に「TagLib」は簡単にMP3タグの編集が出来るクラスライブラリとして広く使われていて、安心感があります。

ただ、日本語の場合は文字化けすることがあるので、この点だけ対策が必要です。

インストール方法

TagLib は Visual StudioのNuGetから簡単に自分のプロジェクトに取り込むことが出来ます。

具体的には、Visual Studio のパッケージ管理機能 NuGetとは? の記事に記載していますが、以下の様に画面をクリックしていくことで、インストール(自分のプロジェクトへの取り込み)が行えます。

タグの読み出し

まず、静的クラスである Taglib.FileクラスのCreate メソッドを呼んで、TagLib.Fileクラスのインスタンスを生成します。

以降は、インスタンスのプロパティを通して、MP3タグにアクセスできます。

主なタグは次の様に記述することで取得できます。

以下は主なタグ名とTagLibのプロパティの対応表です。

実際にはこれ以外にもありますが、ほとんど馴染みがないものばかりです。

MP3タグの名前対応するプロパティ名
タイトルstringTitle
アーティストstring[]Artists
アルバムアーティストstring[]AlbumArtists
アルバム名stringTag.Album
作曲家string[]Composers
uintYear
トラック番号uintTrack
ディスク番号 uintDisc
ジャンルstring[]Genres
長さ(再生時間)TimeSmanProperties.Duration
ビットレート(Kbps)intProperties.AudioBitrate
タグstringTagTypes
コメントstringComment

ちなみに、TagLibの長さ(再生時間)やビットレートについては、正しく取得できない場合がありました。

たとえば、5分の曲が30分で表示されたり、128kbps が 32kbps で表示されるようなパターンです。

エクスプローラーからファイルを右クリックしてプロパティを表示してみると、そちらは正しく表示されていました。

有名どころのMP3編集ソフトとTagLibの取得結果は同じだったので、そもそもMP3タグの値がおかしいのだろうと思います。

MP3に埋め込まれた画像の取得

MP3には画像を埋め込むことが出来ますが、その画像は Tag.Pictureプロパティにバイト配列(byte[])で格納されています。

PictureBoxコントロールを用いて画面に表示するには Image 型に変換する必要がありますが、それはFromStream メソッドを使います。

尚、画像は複数格納できるように配列型になっているため、Length プロパティを使って画像が埋め込まれているかを判定できます。

以上のことを踏まえ、画像が埋め込まれている時のみ pictureBox1 に画像を表示するサンプルは次の様になります。

埋め込まれている画像は必ずしも小さな画像とは限らないため、サンプルでは縦横200ドットのサムネイルを作成し、それをpictureBox1.Image に渡しています。

サムネイルを作成せず、pictureBox1のSizeModeプロパティを使って適切なサイズ時自動縮小して表示する方法もあります。

タグの書き込み

タグの書き込みは、読み込みと同様 Createメソッドで Fileクラスを作成し、Tagクラスのプロパティに値を設定していき、最後に Saveメソッドを呼ぶだけです。

MP3ファイルへの画像の埋め込み

Pictureクラスのコンストラクタにimageデータを渡すことで、TagLibで取り扱えるデータに変換できます。

それを TagクラスのPictures プロパティに配列形式で渡した後、Saveメソッドを呼ぶだけで埋め込むことが出来ます。

文字化けの対応

さて、TagLibで一番問題になるのは漢字の文字化けです。

文字化けする場合としない場合があるのですが、これはMP3タグのバージョンによって文字コードが異なることと、その規則を無視してシフトJISを書き込んでしまうMP3エンコーダーが横行していることが原因のようです。

理由はともかく、私が試したところによるとTagLibで正しく日本語が表示される場合と文字化けする場合があったので、それを解決する手段を思考錯誤しました。

最終的にたどり着いたのが次のソースコードになります。

有名どころのMP3タグ編集ソフトで表示される結果と、この方法で変換した結果を約1000ファイルに渡って比較したところ、両者は一致したので、おそらくこれが正解なんだろうと勝手に思ってます。

考え方としては、元の文字列をシフトJISと仮定して一旦バイト列に変換後、再びシフト列に変換してあげると、もしシフトJISであったなら元の文字列に戻るはずです。

この考え方を使ってシフトJISか否かを判断し、シフトJISでなければシフトJISに変換してあげるという事をやっています。

シフトJISに変換する際、一旦バイト列に変換する必要があるのですが、その時1バイトごとに0x00が付加されていますので、これを取り除いています。

私はMP3タグについて詳しく無いので、何故こうなるか理由は分かりませんので、もし分かる方がいれば是非教えて頂きたいと思います。

Shell32.dllを使ったタグの読み出し

最後にオマケとして、Shell32.dll を使ったタグの読み出しだけメモ書きとして記載しておきます。

Google検索して見つけた内容なので、原文はこちらの記事をご覧下さい。

方法は、Shell32.dll をプロジェクト参照してから、数行プログラムを書くことで、プロパティが取得できます。

参照設定の方法

Visual Studio のソリューションエクスプローラーから、「参照」→「参照の追加」→「参照マネージャ」→「COM」と選択していきます。

次に、「Microsoft Shell Controls And Automation 」を探してチェックを入れ、「OK」ボタンをクリックすると完了です。

「参照」の一覧に Sell32 が表示されたと思いますので、これをクリックし、「相互運用型の埋め込み」をFalseに設定します。

初期値はTrueなのですが、Trueのままだとエラーになります。

タグ読み出しのソースコード

参照した Shell32 を使ってタグを読み出す方法は次の通りです。

GetDetailsOfメソッドの第2引数にタグ番号を代入すると、そのタグ番号に登録されている値が取得できます。

実験的に、0~300までタグ番号を変えて値を取得するプログラムを作って、どんな値が返ってくるのか調べてみました。

0010(タグ番号10)は私の端末名とユーザー名が表示されていたので、あえてボカしました。

原文にもタグ番号と内容の一覧が記載されていますが、WindowsXP時代のもののようで、Windows10の場合は次の様になりました。

タグ番号内容
0ファイル名
1ファイル容量
2MP3 形式サウンド
3更新日時
4作成日時
5アクセス日時
9ファイルの種類(オーディオ、ビデオ等)
10所有者
11音楽
13アーティスト
14アルバム名
15
16ジャンル
19評価なし
20アーティスト
21タイトル
24コメント
26トラック番号
27長さ(再生時間)
28ビットレート
194フルパス
196ファイル形式(MP3 形式サウンド、MP4ファイルなど)
215サブタイトル
237アルバムアーティスト
243作曲家
248雰囲気
249ディスク番号

まとめ

以上でTagLibの説明は終わりです。

TagLibを使う事で、簡単にMP3タグを編集することができます。

有名どころのフリーツールにせよ、TagLibにせよ、文字化けする時は文字化けしますので、100%完全という訳ではありませんが、十分使えるクラスライブラリなので、もし使う機会が有れば、是非この記事を参考にして頂ければと思います。

タイトルとURLをコピーしました