.NET TIPS

MP3ファイルからタイトルやアーティスト名などを取得するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2007/05/10

 MP3ファイルには、曲のタイトルやアーティスト名といった付加情報(「ID3タグ情報」と呼ばれる)が格納されている。Windowsのエクスプローラでは、ファイルのプロパティ・ダイアログでそれらを確認できる。


MP3ファイルのプロパティ(ID3タグ情報)
MP3ファイルに格納されている曲のタイトルやアーティスト名、ジャンルといったID3タグ情報を見ることができる。このダイアログでは値の部分をクリックしてその内容を編集することも可能。

 プログラムからMP3ファイルのID3タグ情報を得るには、MP3ファイルをオープンし、そのフォーマット仕様(ID3.orgで規定されている)に従って順に読み出すこともできるが、Windowsに含まれるShell32.dllの機能を利用すれば、非常に容易に取得できる(ただし主要な項目のみ)。

 本稿ではShell32.dllの機能を使用してMP3ファイルのID3タグ情報を取得する方法について解説する。

Shell32.dllの参照設定

 Shell32.dll(既定ではC:\WINDOWS\System32に格納されている)は.NETのアセンブリではなくCOMコンポーネントであり、その機能をC#やVBから利用するには、まず参照設定を行う必要がある。

 Visual Studioを利用している場合には、ソリューション・エクスプローラ上でプロジェクト内の「参照設定」の項目を右クリックして「参照設定の追加」を実行し、開く[参照の追加]ダイアログの[COM]タブで「Microsoft Shell Controls And Automation」の項目を追加する。

 コマンドラインでコンパイルを行う場合には、.NET Framework SDKなどに含まれているツール「TlbImp.exe」を使用して、COMコンポーネントを呼び出すためのインターフェイスとなるアセンブリをまず作成する。これにはコマンド・プロンプトで「TlbImp.exe Shell32.dll」を実行すればよい。これによりアセンブリ・ファイル「Shell32.dll」が作成されるので、コンパイル時には/reference:オプション(省略形は「/r:」)によりそれを参照する(このファイルはプログラムの実行時にも必要であるため、実行ファイルと同じディレクトリに配置する)。

Shell32.dllによりID3タグ情報を表示するサンプル・プログラム

 ID3タグ情報を取得するには、Shell32.dllに含まれる以下の3つのクラス/インターフェイスを使用する(これらの名前空間は既定では「Shell32」となる)。

  • ShellClassクラス
  • Folderインターフェイス
  • FolderItemインターフェイス

 これらを使用してMP3ファイルのID3タグ情報を表示するサンプル・プログラムを次に示す。ここでは「C:\mp3」ディレクトリにある「james.mp3」というファイルを対象にしている。

using System;
using Shell32;

class ShowID3Tags {
  static void Main() {

    string dir = @"C:\mp3"; // MP3ファイルのあるディレクトリ
    string file = "james.mp3";

    ShellClass shell = new ShellClass();
    Folder f = shell.NameSpace(dir);
    FolderItem item = f.ParseName(file);

    Console.WriteLine(f.GetDetailsOf(item,  9)); // アーティスト
    Console.WriteLine(f.GetDetailsOf(item, 10)); // タイトル
    Console.WriteLine(f.GetDetailsOf(item, 12)); // ジャンル
    Console.WriteLine(f.GetDetailsOf(item, 14)); // コメント
    Console.WriteLine(f.GetDetailsOf(item, 17)); // アルバムのタイトル
    Console.WriteLine(f.GetDetailsOf(item, 18)); // 年
    Console.WriteLine(f.GetDetailsOf(item, 19)); // トラック番号

    // 出力例:
    // Billy Joel
    // James
    // Rock
    // no comment
    // Turnstiles
    // 1976
    // 5
  }
}
Imports System
Imports Shell32

Class Program
  Shared Sub Main()

    Dim dir As String = "C:\mp3" ' MP3ファイルのあるディレクトリ
    Dim file As String = "james.mp3"

    Dim shell As New ShellClass()
    Dim f As Folder = shell.NameSpace(dir)
    Dim item As FolderItem = f.ParseName(file)

    Console.WriteLine(f.GetDetailsOf(item,  9)) ' アーティスト
    Console.WriteLine(f.GetDetailsOf(item, 10)) ' タイトル
    Console.WriteLine(f.GetDetailsOf(item, 12)) ' ジャンル
    Console.WriteLine(f.GetDetailsOf(item, 14)) ' コメント
    Console.WriteLine(f.GetDetailsOf(item, 17)) ' アルバムのタイトル
    Console.WriteLine(f.GetDetailsOf(item, 18)) ' 年
    Console.WriteLine(f.GetDetailsOf(item, 19)) ' トラック番号

    ' 出力例:
    ' Billy Joel
    ' James
    ' Rock
    ' no comment
    ' Turnstiles
    ' 1976
    ' 5
  End Sub
End Class
MP3ファイルのID3タグ情報を表示するサンプル・プログラム(上:C#、下:VB)
コンパイル時にはShell32.dllを参照設定する必要がある。

 プログラムでは、まずShellClassクラスのインスタンスを作成する。次にMP3ファイルの存在するフォルダをパラメータに指定してNameSpaceメソッドを呼び出し、Folderオブジェクトを取得する。続いて、MP3ファイルのファイル名をパラメータに指定してFolderオブジェクトのParseNameメソッドを呼び出し、FolderItemオブジェクトを取得する。

 そして最後にFolderオブジェクトのGetDetailsOfメソッドを呼び出すことにより、各ID3タグ情報を文字列として取得できる。このときGetDetailsOfメソッドの第2パラメータには、取得したい情報に対応した番号を指定する。この番号は、エクスプローラで詳細表示可能な列の項目の並びに(ほぼ)対応している。

 エクスプローラで表示可能な列の一覧は、エクスプローラのメニューの[表示]−[詳細表示の設定]により表示することができる。


エクスプローラで表示可能な列の一覧
メニューの[表示]−[詳細表示の設定]により表示できる。

 GetDetailsOfメソッドの第2パラメータに指定可能な番号と、エクスプローラの詳細表示時の列項目のヘッダ・タイトル(名前、サイズ、種類など)の一覧については、次のようなプログラムにより取得することもできる。

using System;
using Shell32;

class DetailList {
  static void Main() {

    ShellClass sc = new ShellClass();
    Folder f = sc.NameSpace(@"C:\");

    for (int i = 0; i < 10000; i++) { // 10000は適当な大きな値
      string name = f.GetDetailsOf(null, i);
      if (!string.IsNullOrEmpty(name)) {
        Console.WriteLine("{0} : {1}", i, name);
      }
    }
  }
}
Imports System
Imports Shell32

Class Program
  Shared Sub Main()

    Dim shell As New ShellClass()
    Dim f As Folder = shell.NameSpace("C:\")

    For i As Integer = 0 To 9999 ' 9999は適当な大きな値
      Dim name As String = f.GetDetailsOf(Nothing, i)
      If Not String.IsNullOrEmpty(name)
        Console.WriteLine("{0} : {1}", i, name)
      End If
    Next
  End Sub
End Class
GetDetailsOfメソッドで指定可能な項目一覧を表示するサンプル・プログラム(上:C#、下:VB)
コンパイル時にはShell32.dllを参照設定する必要がある。

 GetDetailsOfメソッドの第1パラメータでnull(VBの場合にはNothing)を指定しているところがポイントだ。

 このプログラムの実行結果を表形式で表すと次のようになる。

番号 ヘッダ・タイトル 番号 ヘッダ・タイトル
0 名前 19 トラック番号
1 サイズ 20 ジャンル
2 種類 21 長さ
3 更新日時 22 ビット レート
4 作成日時 23 保護
5 アクセス日時 24 カメラのモデル
6 属性 25 写真の撮影日
7 状態 26 大きさ
8 所有者 29 この回のタイトル
9 作成者 30 プログラムの説明
10 タイトル 32 オーディオ サンプル サイズ
11 表題 33 オーディオ サンプル レート
12 カテゴリ 34 チャンネル
13 ページ数 35 会社名
14 コメント 36 説明
15 著作権 37 ファイル バージョン
16 アーティスト 38 製品名
17 アルバムのタイトル 39 製品バージョン
18    
上記サンプル・プログラムの実行結果

 ただしエクスプローラの詳細表示時の列項目はWindowsのシェル拡張機能により追加可能である。上記の結果はWindows XP Professional SP2の既定の状態で実行したときのものだ。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ファイル&ディレクトリ
使用ライブラリ:ShellClassクラス(Shell32名前空間)
使用ライブラリ:Folderインターフェイス(Shell32名前空間)
使用ライブラリ:FolderItemインターフェイス(Shell32名前空間)

この記事と関連性の高い別の.NET TIPS
[ASP.NET]ページから生成されたソース・コードを見るには?
アプリケーション設定を活用するには?
バージョン情報ダイアログを作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間