TWindowsMediaPlayerを利用するとID3タグを取得できるだけでなく書き込むこともできます。
メディアを読み込んで再生できる状態になってからでないと読み書きできないので時間がかかるのが難点ですが、工夫次第で大いに活用できるのではないかと思います。
以下はWMP10を取り込んで試した結果です。
WMP9やWMP11などだと違う結果になるところもあるかも知れません。
WindowsMediaPlayerのOpenStateChangeイベントで状態を判定してMediaOpen(wmposMediaOpen)になれば取得できます。
Shell オブジェクトを利用する場合と違って取得できる項目も多く、またHDDのフォーマットがNTFSに縛られないことからけっこう使えると思います(時間がかかることを許容できれば)
Stage6からダウンロードしたファイルをTMPGEnc XPressでwmaに変換したファイルの例。
タイトルやアーティストなどを書き込んでいない状態だとこういう感じです。
Titleに何も設定していない状態だとTilteタグはファイルの主ファイル名を返すようです。
ちなみにこれらのファイルがVBR(可変ビットレート)である場合WindowsMediaPlayer(コンポーネントではなくMicroSoftの製品の方、、ややこしい)に読み込ませるともっと色々な情報が書き込まれる場合もあります。
行頭にRがある項目は読み込み専用でこれに書き込もうとするとエラーが発生します。
ただしメディアによって読み込み専用と判定されたりされなかったりする項目もありますし、書き込みできる項目であっても読み込み専用であると判定される場合もありました。
またwmaファイルでは書き込み可能であってもmp3では読み込み専用で書き込もうとするとエラーが発生する項目もありました。
書き込むときには読み込み専用かどうか事前にチェックしてから書き込む、try〜exceptで囲む、などした方が良いでしょう。
Windows Media Player SDK
書き込みはURLプロパティにファイル名を代入して開いてから WindowsMediaPlayer1.currentMedia.setItemInfo(ls_Name,
ls_Value)) としてcloseメソッドを呼ぶか別のファイルを読み込むだけでできます。
わざわざ更新処理をする必要はありません。
というか更新処理のプロパティや手続きがないので再生を続けている間は更新できません。
また他のプレーヤーで同じファイルを開いていたりすると(エラーが発生することもなく黙ったまま)更新に失敗します。
また更新しようとするファイルがメディアコレクションに含まれる場合ハングアップします(実際は2-3分待っていれば戻ってきますがタグ情報の更新はされません)
メディアコレクションというのはWMP10を起動して「ライブラリ」をクリックすると一覧で表示されるメディアライブラリのことです。
ここに登録されているファイルのタグを書き込もうとするとハングアップしたようになり失敗してしまうということです。
プログラムからメディアコレクション中のメディアを削除すると、このライブラリからも削除されます。
ということで書き込みにはメディアコレクションからファイルを削除しなければなりません。ただメディアコレクションを操作するとWMPのライブラリに影響してしまいます。
WMPのメディアライブラリなんて関係ないよ、という場合はいいのですがWMPをプレーヤーとして利用している場合はライブラリから削除したままでは不都合なので、更新しようとするファイルがライブラリに登録されているかを確認してから削除・更新を行い登録されていたのなら登録し直すという処理が必要になります。
私は必要ないので削除するだけの処理しかしていませんが。
Author、Title、WM/Composer、WM/Writerの四項目に書き込みできているのが分かります。
AttributeName | 内容 | 備考 | |
---|---|---|---|
W | Author | アーティスト | 「作成者」あるいは「出演者」という表現をしている場合もあり。 |
R | Bitrate | ビット レート | 単位はbps。 通常使用されるkpbsにするには1000で割って小数点以下切捨て(のようです) |
R | Duration | 長さ(時間) | 単位は秒。 小数点以下切捨てで表示していることが多いようです。 |
R | FileSize | ファイルサイズ | 単位はByte。 KBにするには1024で割って小数点以下切り上げ。 |
R | FrameRate | FPS | フレームレート。 1000で割るようです。 |
R | IsVBR | 可変ビットレートかどうか | ビデオ、オーディオどちらか一方、あるいは両方ともVBRであればTrue(という文字列)が返ります。 |
W | Title | タイトル | |
W | WM/AlbumArtist | アルバムのアーティスト | |
W | WM/AlbumTitle | アルバム | |
W | WM/Composer | 作曲者 | |
W | WM/Conductor | 指揮者 | |
W | WM/Director | 監督 | |
W | WM/Genre | ジャンル | |
W | WM/Lyrics | 歌詞 | |
W | WM/MediaOriginalChannel | チャンネル | TVのチャンネル? |
W | WM/MediaStationName | 局名 | 放送局? |
W | WM/PartOfSet | セット | 二枚組みアルバムのうちの何枚目かとか。 |
W | WM/Producer | プロデューサ | |
W | WM/Publisher | スタジオ | スタジオジブリとか? |
W | WM/SubTitle | サブタイトル | アニメやドラマのサブタイトル? |
W | WM/SubTitleDescription | この回の説明 | アニメやドラマの第〜話の説明とか? |
N | WM/TrackNumber | トラック | 数値に変換できる文字列のみ書き込み可能。 よく似たAttributeNameに WM/Track というのがあるがそちらは書き込みできないので注意(書き込んでもエラーは発生しない) |
W | WM/Writer | ライター | 作詞者。 映画やドラマなどのシナリオライターもここに書き込むのだろうか? |
W | WM/Year | 年 |
以前書き込む値はWideStringでないとハングアップするとかmp3infpをインストールした環境でもハングアップするなどと書いていましたが、間違いでした。
ハングアップする(ように見える)のはURLプロパティを使って書き込もうとしたファイルがWMPのメディアライブラリに登録してある場合でした。
解決策としてURLプロパティに代入するのではなくプレイリストに登録して書き込むというのもあるのですが、プレイリストに登録して書き込む場合はファイルに直接書き込むというのではないようで、メディアライブラリ中のタグ情報に書き込むことでいずれファイルにもそれが反映される、という流れのようで変更がすぐには反映されません。
また場合によっては反映されないこともあります。
メディアライブラリ中のタグは更新されているけれどもエクスプローラで見てみると更新されていないということがありました。
正直これは使い難いなぁ、、という感じです。
ちなみにURLプロパティに代入して書き込む時に必要なWindowsMediaPlayer1.close;は必要ないようです。
プレイリストに登録するメリットとしては開けないファイルであったらエラーが発生することです。
URLプロパティに代入するやり方だとエラーは発生せず変わりにいちいち「この拡張子には対応していないが開くか」と聞いてくるダイアログが開いてしまいます。(ここで二回「はい」を選ぶとOnMediaErrorイベントが起きます)
とはいえ反映が直接ファイルに行われるわけではなく反映されるタイミングも今ひとつよく分からないという欠点があります。