mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する

mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得するコードを紹介します。

概要

mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの情報をファイル内の「ID3タグ」に記録できます。この記事ではファイル内に記録されたタイトルやトラック番号、アーティスト名などの情報をWindowsのShellオブジェクトを利用して取得するコードを紹介します。

補足
この記事では、WindowsのOS(エクスプローラー/ファイルシステム)のシェルの機能を利用して情報を取得しています。ファイルに直接アクセスして情報を取得するライブラリを利用する方法もあります。ID3タグを処理するライブラリを利用する方法はこちらの記事を参照して下さい。

プログラム

事前準備 : Microsoft Shell Controls の参照追加

Windows Formアプリケーションを作成します。

はじめに、WindowsのCOMコンポーネントの参照を追加します。Windows Formアプリケーションを開きます。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像1

ソリューションエクスプローラーのプロジェクトのノードの子にある[参照]ノードをクリックして選択し、右クリックします。下図のポップアップメニューが表示されますので、[参照の追加]の項目をクリックします。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像2

[参照マネージャー]ダイアログが表示されます。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像3

ダイアログの左側の[COM]の項目内の[タイプライブラリ]の項目をクリックして選択します。下図の画面が表示されます。右側のエリアにCOMコンポーネントのリストが表示されます。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像4

右側のエリアの一覧から [Microsoft Shell Controls And Automation]の項目を探し、左側のチェックボックスをクリックしてチェックを付けます。チェックを付けた状態が下図です。選択後、ダイアログ右下の[OK]ボタンをクリックします。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像5

ダイアログが閉じられ、ソリューションエクスプローラーの[参照]ノードに"Shell32"が追加されます。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像6

UI

Windows Formアプリケーションで下図のフォームを作成します。ボタンと複数行のテキストボックスとFileOpenDialogを配置します。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像7

コード

下記のコードを記述します。button1のclickイベントの実装が中心です。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using Shell32;

namespace GetFileProperty
{
  public partial class FormSoundFile : Form
  {
    public FormSoundFile()
    {
      InitializeComponent();
    }

    [STAThread]
    private void button1_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == DialogResult.OK) {
        Shell shell = new Shell();
        Folder f = shell.NameSpace(Path.GetDirectoryName(openFileDialog1.FileName));
        FolderItem item = f.ParseName(Path.GetFileName(openFileDialog1.FileName));

        for (int i = 0; i < 500; i++) {
          textBox1.Text += i.ToString() +"\t"+f.GetDetailsOf(null, i) +"\t"+f.GetDetailsOf(item, i) + "\r\n";
        }
      }
    }
  }
}

解説

ファイルを開くダイアログを開きます。ファイルが選択され、DialogResult.OK が戻った場合に、if文のブロックを実行します。

  if (openFileDialog1.ShowDialog() == DialogResult.OK) {
    //中略...
  }

Shellオブジェクトを作成し、NameSpaceメソッドを呼び出しフォルダオブジェクトを取得します。NameSpaceオブジェクトの引数には取得したい情報のあるフォルダのパスを与えます。
フォルダオブジェクトが取得できたら、ファイルを示す、FolderItemオブジェクトを取得します。FolderオブジェクトのParseNameメソッドを呼び出すことでFolderItemオブジェクトを取得できます。ParseNameメソッドの引数には、ファイル名を与えます。与えるファイル名はフルパスのファイル名ではなく、フォルダオブジェクトのフォルダに配置されているファイル名を与えます。

    Shell shell = new Shell();
    Folder f = shell.NameSpace(Path.GetDirectoryName(openFileDialog1.FileName));
    FolderItem item = f.ParseName(Path.GetFileName(openFileDialog1.FileName));


FolderItemオブジェクトのGetDetailOfメソッドを呼び出すことで、ファイルの詳細情報を取得できます。GetDetailsOfメソッドの第一引数に取得したいファイルのFolderItemオブジェクトを与えます。第二引数に取得するフィールド番号を与えます。なお、GetDetailsOfメソッドにnullを与えた場合は、プロパティの値ではなく項目名が取得できます。
また、項目数は取得できないため、ループで500カラムまでを取得しています。数値に上限はなく値が無いカラムでも例外は発生しないようです。

    for (int i = 0; i < 500; i++) {
      textBox1.Text += i.ToString() +"\t"+f.GetDetailsOf(null, i) +"\t"+f.GetDetailsOf(item, i) + "\r\n";
    }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像8

[button1]をクリックします。ファイルを開くダイアログが表示されます。プロパティ情報を取得したいサウンドファイルを選択します。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像9

ファイルを開くと下部のテキストボックスにファイルの情報が表示されます。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像10

サウンドファイル中にトラック番号やビットレートなどが設定されていれば、それらの値も表示されます。
mp3, wav, flac などのサウンドファイルのタイトルやトラック番号、アーティスト名などの詳細情報を取得する:画像11

音楽ファイル内のタグ情報を取得できました。

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2020-01-20
Copyright © 1995–2025 iPentec all rights reserverd.