ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

初心者の為のC#コミュのアプリを作ろう

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。
一人でプログラム作ってます。売れないものばかりなので、Vectorでフリーウェアとして発表しています。
今度、以下のようなアプリを作ろうと思いました。新機軸を使うので、途中で挫折しそうです。

また、新しいことをやるときに、いろいろ試行錯誤しますが、ようやく動くようになっても、その試行錯誤を忘れてしまうんですよ。「あれ?どうやったっけ」と悔やむこともたびたびです。きちんと記録すればいいんですけどね、つい忘れてしまう。

このコミュニティは初心者対象ということですが、1つのアプリの完成(または失敗)までの過程を記録すのも勉強になるかと思います。
そこで、この場をお借りして、(個人ブログも持っていませんので)進行状況を記録することにしました。皆さんの注視の中なのでそう簡単には挫折できません。(でも、挫折したらゴメンネ)
人に教えることで知識も確実になるので、質問は歓迎します。(でも、自分で調べてからにしてね)

では、さっそく作るものの構想を書きます。

・何をするアプリか?
音楽ファイル(MP3)がたまってきました。それらにはタグを設定してあります。これらを、

1.全音楽ファイルのタグを一括して印刷したい。
2.ただ印刷するのも大変なので、Excelに出力して検索、並べ替えなどはExcelに任せる。
3.タグに歌詞、画像もあるので、それらは1ページに1曲印刷して「歌集タイプ」にしたい。
4.iTunesの中のファイルのタグも取得できるようにしたい。

・全体の構想
実際に何から手を付けるか、問題を分けてみます。

1.ファイルの追加はそうたびたびないので、起動のたびにタグを取得するのは時間のムダ。データベースを作っておいて、普段はそちらを使い、ファイル追加の時にデータベースを更新する。

2.データベースといっても、単にタグを収納しておくだけなので、XMLファイルで充分だろう。

3.Excel出力はできれば印刷までもC#でコントロールしたいので、CSVではなく、直接XLSに書き出したい。

4.iTunes中のファイルはm4aという拡張子で、タグの形式もMP3と違う。

5.歌集タイプの印刷は先送り。

・優先順位
タグを読む⇒データベース(XML)を作る⇒Excelに書き出す

という順番に作って行くことになります。処理が独立しているのがいいですね。

・開発手法
個人で作るので、どんな方法を採ってもいいのですが、アジャイル開発で行こうと思います。これは、簡単に言うとつぎのようになります。

1.大体の目標を立てて、とにかく作り始める
2.コードを書いたら必ずテストする
3.機能が不十分でも動くものを短期間でリリースする
4.動いているコードを洗練して行き(リファクタリング)、ドキュメントはコードとテストコードで代用できるくらいにする

そこまでで一段落して、機能の再検討をして新しい目標を設定し、機能を付け加える
後は、
機能追加⇒テスト⇒リファクタリング⇒リリース
の循環になります

・開発環境
VS 2010 アカデミックパック(プロと同じ)Expres版でも使える(ハズ)
Windows Vista
他に
NUnit 2.5 (テストツール)
Visual NUnit(なくてもOK)
Quick Time (m4aのタグ取得用)
MP3Lib (MP3タグのライブラリ)
などなど

コメント(9)

2.タグを読む
前回書きましたが、作る順番は
タグを読む⇒データベース(XML)を作る⇒Excelに書き出す
です。

まず、タグを読まなければなりません。MP3なら、以前作ったクラスライブラリがあるので、それを使います。問題はiTunesにあるm4aファイルのタグです。
今回は、大体の方針を決めます。

方法はいくつかあります。
1.iTunes Music Library.xmlを調べる
iTunesをデフォルトでインストールすると、ユーザフォルダの「ミュージック」というフォルダの中にiTunes Music Library.xmlとiTunes Mususicフォルダができます。iTunes Music Library.xmlには登録されているファイルのタグを含むデータが書いてあり、iTunes Mususicフォルダには実際のファイルが格納されています。
この、iTunes Music Library.xmlを解読してタグのみを取り出す方法があります。しかしこのXMLファイルは構造が独特で、一筋縄では行きません。

2.m4aファイルのタグの規格を調べて読みだす。
MP3の時はこのテを使いました。規格が公開されていましたのでできました。しかし、m4aに関しては皆目わからない。ということであっさり却下。

3.iTunes用のライブラリを使う。
近くの大学図書館に「日経ソフトウェア」があるので調べたところ、「iTunesのCOMインターフェイスを通してパソコンに接続したiPodを操作する」という記事を見つけました。Appleのサイトからマニュアルもダウンロードできます。
でも、機能が多すぎ、マニュアルが英語なのでタグ取得がどこにあるかも分からない。サンプルを実行すると、iTunesが立ち上がってしまう。iTunesを使っている人は分かるでしょうが、立ち上がりに時間がかかるし、非表示にできないらしい。ということで断念。
この日経の記事の中に.NET Frameworkで作ったSharePodというフリーのライブラリが紹介されています。これはかなり有望だと思われますが、これも機能が多すぎ、マニュアルが英語ということで、これまた断念。

4.QuickTimeを使う
最後の頼みの綱で、CodeProjectを調べたところ、「Read M4A tags in C#」というそのものズバリの記事を見つけました。(最初からここに来ればよかった)ソースも短く、英語でも何とかなりそうです。
しかし、QuickTimeのコンポーネントを使うのでフォームを使うことを強制されます。つまり、ふつうのクラスライブラリのDLLは生成できません。ということはテストツールが使えません。しかし、選択肢はこれしかないようなので、これを使うことに、不満足ながら決定!

次回はもう少し詳しく、コードを書けるくらいまでの細かい方針を決めます。
---------
参考:
「iTunesのCOMインターフェイスを通してパソコンに接続したiPodを操作する」
日経ソフトウェア(2008.1 p97-105)

SharePod(http://www.getsharepod.com/)

「Read M4A tags in C#」(http://www.codeproject.com/KB/files/m4afiletags.aspx)
(3)ファイル名の取得

前回まで
m4aタグ取得にはQuickTimeコンポーネント、MP3にはライブラリを使うことに決定。

今回はタグを読むための前段のコードを書けるくらいまでの方針を決めます。

タグ取得クラスのイメージは、ファイル名を入れると各フレーム名(タイトル名、アーティスト名など)とその値のペアをDictionary<string, string>で出力する、という方針です。

その前に、タグ取得するファイルをどこから集めるか、が問題になります。これは、ユーザがフォルダを指定するということにします。
次に、そのフォルダの中からファイル名を抽出する過程が必要になります。普通のフォルダは問題ありません。iTunesは特定のフォルダにあるので、そのフォルダ以下のサブフォルダまで(再帰的に)取得すればいいようです。
iTunesフォルダーはデフォルトでは各ユーザドキュメントのマイミュージックの"iTunes\iTunes Musuc"以下にあります。別フォルダにも作れますが、その下に作られる"iTunes\iTunes Musuc"という構造は変わらないので、そこを攻めればいいようです。

次に、(タグ取得のための)指定フォルダ内のファイル名取得用のクラスのイメージは以下のようになります。
1.フォルダを指定する。
2.再帰的に取得するか指定(iTunesは必ず再帰)
3.そのフォルダを走査して、m4a,MP3ファイルを取得する
4.入力データ形式
ファイル名と再帰か否か、のペアなので、Dictionary<string, bool>にします。
クラス名は、ファイルを集めてくるので GatherSongFileとし、メソッド名は
List<ファイル名> GatherInFolder(Dictionary<string, bool>)としましょう
5.出力データ形式
当然、List<フォルダ名>でしょう

これで、コードを書く準備ができました。次回からテスト駆動方式でコーディングします。

これ以降の処理は、GatherInFolderの吐いたList<フォルダ名>をタグ取得クラスに食わせて吐いたデータを順次XMLファイルに書き出すという流れになります。

--------------------------
アジャイル開発についてのウンチク(1)
「まだ後半、Excel出力も決まってないのにもうコード?」という人がいるかと思いますが、アジャイル開発は、私の解釈ではこれでいいのです。
アジャイルのマニフェストというのがありまして、大原則に
「変化を容認する」というのがあります。
従来の開発では、最終目的から決めて、仕様、データ形式などを決めて作り始めます。できてからユーザの検収段階で注文が出て、最初の仕様がズタズタになることがあります。
そうなる前にユーザの意向に沿うように変化を受け入れよう、というものです。

そのためには、機能は低いが、動くものをユーザに見せて、完成形のイメージを共有してもらう、ということに尽きるでしょう。
今回は自分用に作るので、そこまでは必要ないですが、少しづつ作り、動かして完成時のイメージ(目標)を設定して行きます。
(4)テスト環境を整える

アジャイル開発では、「変化の容認」という原則があります。しかし、今まで動いていたものがちょっとコードを変えたら動かなくなることが、製作途中で間々あります。そのため、変化があるたびに今までの動作の確認をしながら進めます。そのために「単体テスト」という方法があり、ツールとしてxUnit(xには言語のシルシが入る)を使います。単体テストについてはネットにたくさんの解説があるのでここでは述べません。

.NETで使うものはNUnitというものです。サイト(1)からダウンしてインストールしてください。私はNUnit-2.5.7.10213.msiをインストールしました。
インストールすると、デスクトップにNUnitというアイコンができて、これはGUIツール(テストランナーと呼ぶ)で、それなりに便利です。しかし、VS中から使える方がさらに便利で、そのようなツールもあります。「Visual Nunit 2010」というものです。

Visual Nunit 2010のインストール
NUnitをインストールしてから、VSの「ツール」メニューから「拡張機能マネージャー」を起動し、Visual Nunit 2010を選びます。後は適当にやってくれます。
使い方はいたって簡単で、「表示」メニューの「その他のウインドウ]の中に「VBisual Nunit」というエントリができてますので、クリックすると表示されます。
もし、そのプロジェクトにテストコードがあれば自動的に読み込んで、登録されます。(オリジナルのNUnitGUIツールでは手動で登録しなければならないのでちょっと面倒です)
一番上にある緑の矢印をクリックするとテストが始まります。(こりゃ便利だ)

テストされるクラスを作る
「テストされる」ですので、実際に使われるDLL、EXEです。それをテストするのがNUnitで動くテストコードです。まず、テストされる方を作ります。
新規プロジェクトで、クラスライブラリを選び、プロジェクト名(名前空間名)をGatherFileとします。(名前空間名とクラス名を同じにしてもコンパイルはできますが、あとで困ることがあるかもしれませんので、違う名前にします)
デフォルトでできているクラスファイル名(Class1.cs)をGatherSongFile.csに変えます。デフォルトコンストラクタと、メソッドを作ります。コンパイルできるような最低限のコードを書いておきます。(このあたりは普通にDLLのときにやっていることと同じです)

こんな感じになるでしょう。
namespace GatherFile
-----------
public GatherSongFile() { }

public List<string> GatherInFolder(Dictionary<string, bool> folder)
{
  List<string> retList = new List<string>();

  return retList;
}

テストコードを書く
NUnitを使うにはソリューションエクスプローラの「参照設定」で追加のダイアログを開き、.NETの中にあるnunit.frameworkを追加して、テストコードファイルの頭で
using NUnit.Framework;
と書いておきます。
テスト用のファイルはまとめておくと便利なので、私は「新しいフォルダ」でテスト用フォルダを作り、その中にまとめてあります。テスト用クラスはTest_GatherFileとします。テストと指定するためにクラス名の前に[TestFixture]と書きます。
同様にテストメソッドの前に[Test]と書きます。メソッド名はテストする条件を加えるので名づけるのに苦労します。しかし、ある時ユニコードなので日本語も通ることに気づきました。やってみると非常に具合がよろしい。

こんな感じになるでしょう
[TestFixture]
public class Test_GatherFile
{
  [Test]
  public void 初めのテスト()
  {
  }
}

ここまでのコードをテストしてみたスクリーンショットを付けておきます。
手前にあるのがVisual Nunit 2010です。右向き緑矢印をクリックするとテストが始まり、各テストコードが成功したら緑チェックが入ります。失敗したら赤×が付きます。
この場合はテストでは何もしていないのですが成功してます。

---------------------
(1)NUnit Home(http://nunit.org/)
「Visual Nunit 2010」(http://visualstudiogallery.msdn.microsoft.com/en-us/c8164c71-0836-4471-80ce-633383031099)
(5)テストコードを書く

GatherInFolderのテストコード
何もしないメソッドなので、空の引数を与えてGatherInFolderを呼んでも返ってくる値も空です。これをテストするには以下のコードです。

public void 初めのテスト()
{
  Dictionary<string, bool> parame = new Dictionary<string, bool>();
  List<string> resList = new List<string>();

  GatherSongFile gather = new GatherSongFile();
  resList = gather.GatherInFolder(parame);
}

さっそく右向き緑矢印をクリックします。緑ですね。空のGatherInFolderがちゃんと終了したということです。返り値が正しいかが分からないと正しく動作しているか分かりませんが、とにかくエラーも出ず最後まで実行はされているようです。

返り値を確かめるためにAssertというコマンドがあります。この場合、返ってくるList<string>のstringの個数はゼロです。これで確かめます。前のパラメータは期待値、後の方は実際の値になります。

次のようになります。
Assert.AreEqual(0, resList.Count);
これを最後に加えて、テストします。もちろん緑ですね。
Assert.AreEqual(1, resList.Count);
とすると、当然赤です。正しいけど何か気になります。やはり緑にしたいものです。というわけで緑になるようなコードが自然に書けてしまう、という次第。

Assertのメソッドはいろいろありますが、当分はAreEqualで間に合います。慣れてくればケースに合わせたメソッドを選べるようになるでしょう。

環境も整ったところで、コードを書く前に、テストコードを書きます。これがテスト駆動開発(TDD)と呼ばれるゆえんです。

テスト項目は
1.指定フォルダが存在しない場合
2.指定フォルダが空の場合
3.ルートフォルダのみからMP3、M4Aファイル名を取得
4.ルートフォルダ以下のフォルダから〃を再帰的に取得
5.iTunes Musicフォルダの場合は必ず再帰
くらいでいいでしょう。

テスト環境でまだ残っているものがあります。テストデータのフォルダとファイルです。上のテストをするためには、適当なフォルダ(今回はF:\Test)を作りMP3、M4aファイルを入れます。それ以外にも別種類のファイルも入れます。再帰的に収集するので、その下にサブフォルダも作り、ファイルを入れます。もうひとつサブフォルダを作りますが、空にしておきます。

テストデータ
F:\Test\(各種ファイル)
F:\Test\Non(空)
F:\Test\Any(各種ファイル)
各種ファイルとはMP3、M4Aファイルと共にその他のファイルも入れておきます。

GatherSongFileの詳細
テスト項目1,2の場合、List<string>.count=0を返すだけにします。後半の処理に影響も出ませんので。

テストコード
データを共通で使えるように最初に宣言します。(inpTestData)
メソッド名
1.Testフォルダなし
2.Testフォルダ空
3.Testルート
4.Testルート再帰
5.TestITunes

テストコード・ソースは次回公開します。
このテストが全てグリーンになるようにソースを書いてゆきます。
(6)テストコード・ソース

今回は詳しくソースを公開します。
Assert.AreEqualの期待値はテストデータの状態で適宜変更してください。

private Dictionary<string, bool> inpTestData
  = new Dictionary<string, bool>();

[Test]
public void Testフォルダなし()
{
  List<string> resList = new List<string>();
  inpTestData.Add(@"F:\Test\XYZ", true);

  GatherSongFile gather = new GatherSongFile();
  resList = gather.GatherInFolder(inpTestData);

  Assert.AreEqual(0, resList.Count);
}

[Test]
public void Testフォルダ空()
{
  List<string> resList = new List<string>();
  inpTestData.Add(@"F:\Test\Non", true);

  GatherSongFile gather = new GatherSongFile();
  resList = gather.GatherInFolder(inpTestData);

  Assert.AreEqual(0, resList.Count);
}

[Test]
public void Testルート()
{
  List<string> resList = new List<string>();
  inpTestData.Add(@"F:\Test", false);

  GatherSongFile gather = new GatherSongFile();
  resList = gather.GatherInFolder(inpTestData);

  Assert.AreEqual(0, resList.Count);
}

[Test]
public void Testルート再帰()
{
  List<string> resList = new List<string>();
  inpTestData.Add(@"F:\Test", true);

  GatherSongFile gather = new GatherSongFile();
  resList = gather.GatherInFolder(inpTestData);

  Assert.AreEqual(0, resList.Count);
}

[Test]
public void TestITunes()
{
  List<string> resList = new List<string>();
  string iTunDir = Environment.GetFolderPath
    (Environment.SpecialFolder.MyMusic) //各ユーザのミュージックフォルダ
      + @"\iTunes\iTunes Music";
  inpTestData.Add(iTunDir, false); //trueでも同じになるはず

  GatherSongFile gather = new GatherSongFile();
  resList = gather.GatherInFolder(inpTestData);

  Assert.AreEqual(0, resList.Count);
}

後はテストがグリーンになるようにコードを書いてゆきます。この、「書くうちに赤が緑になって行く」って言うのはなかなかモチベーションが上がります。

方法が理解できたでしょうから、これからはコードの公開は最低限にしますので、説明不足で良く分からないところは質問してください。(そのうちVectorで公開する予定です)

ということで次に進めます。

(7)単体テスト考

単体テストを使ってみて気づいたことをまとめてみました。

・VSにもテスト機能はあるけど?
Visual Studioのプロ以上には単体テスト機能があります。NUnitと同じ単体テストをする機能ですが、コマンド名が違っています。コマンド名を変更すれば、NUnitと同じコードが使えます(たぶん)。それに、内蔵テスト機能はMS製品に特化しているので、Assert関係が充実しています。さらに、スケルトンだけですが、テストコードを自動生成してくれます。これは、結構便利です。

ところが、テストを実行するたびに、トレース関係のファイルが、どんどん増える。これも、トレースのためか、実行まで時間がかかる。
単体テストは、コードを書いたらすぐ実行して、すぐ結果が出ないと面倒くさくなり、使われなくなります。時間がかかるというのは致命的です。でも、このテスト機能は、チーム開発の一部という扱いらしく、ソースのバックアップ、共有と一緒に使わないと本来の機能が発揮できないようです。

個人的見解ですが、今回のように、一人で単体のWindowsアプリの開発では付属のテストよりNUnitが使いやすそうです。

・テストコードはドキュメントも兼ねる
テストコードを見ればわかると思いますが、使う方法が読み取れます。内容を忘れてしまったクラスでも、引数。返り値などは必ず使いますので、テストがグリーンなら、これで使い方が分かります。
ドキュメントというのは案外信用ならないもので、書いた後にバグをフィックスしても小さな変更なのでドキュメントに反映していないことがあります。また、ソース中に書くコメントも、書かなかったり、変更しないでしまうこともあります。
本当に信用できるのはコードのみで、それが動作することを保証しているテストコードが唯一、最新・正確なドキュメントということができます。

・デバッガは不用か?
NUnitを使えば、プログラムを起動して、結果が分かります。ではデバッガはいらないんじゃないか、と思えますが、目的が違います。
テストで期待しない結果が出た場合、デバグにはデバッガを使わなければなりません。

NUnitでは、結果しか分かりません。ということは、
1.privateメソッドをテストできない
2.メソッド内部の動作が見えない
3.フォームを含むものはテストできない
という限界があります。

内部の挙動を知るにはデバッガしかありません。DLLを作っている場合、同じソリューションにもう1つウィンドウフォームのプロジェクトを作り、そこからDLLを呼ぶようにします。そうすればデバッガを使うデバグができます。

テストとデバッガを比べれば、テストの方がやりやすいし、赤から緑にする、というのがモチベーションが上がります。
そこで、考えを変えて、テストしやすいクラスにすればいいのです。テストコードから書き始めればどうでしょうか。

このあたりは私もまだはっきりしたことは分かりません。具体的にどうすればいいかというのも、まだ手探り状態です。

次回からは、心も新たに、タグ取得クラスを作ります。

(8)タグを取得する

MP3タグ取得クラスを作る準備

フォルダの中のMP3, M4aファイルを集めてList<string>に入れるところまでできました。
次は、この集めてきたファイルの1つ1つのタグを取得する番です。M4aはフォームを使うので先送りして、MP3タグから始めます。

MP3タグ取得はクラスライブラリを使うことにしています。Vectorから「MP3タグ・ライブラリ」(1)をダウンロードします。MP3TagLib.dllをしかるべきフォルダに入れて、参照を追加します。そして、名前空間を追加します。(using MP3TagLib;)
それから、テストも使いますので、nunit.framewworkも追加しておきます。(このあたりはもう、書かなくても分かるでしょう)

MP3TagLibにPDFのドキュメントが入っているので、目を通します。読出しはファイル名を引数にしてReadで呼びだすだけです。

こんな感じです。
 List<MP3Frame> tagData = new List<MP3Frame>();
 MP3Tag tag = new MP3Tag();
 tagData = tag.Read(MP3ファイル名);

返り値がちょっと難物で、Dictionary<MP3Frame>です。MP3Frameのメンバーで使うのは、frameID(タグ名)、dataObj(データ本体)の2つです。

frameIDはFrameIDの列挙型で、規格書のフレームIDです。このままだと分かりずらいので、Title, Artistなどの分かりやすい文字列に変える必要があります。
一応、以下のように名づけました。

FrameID.APIC = "pic";
FrameID.COMM = "comment";
FrameID.TALB = "album";
FrameID.TCOM = "composer";
FrameID.TCON = "genre";
FrameID.TIT2 = "title";
FrameID.TPE1 = "artist";
FrameID.TRCK = "track";
FrameID.TYER = "year";
FrameID.USLT = "lyric";

FrameIDを文字列に変換する、private string GetFrameName(MP3Frame frame)のような関数も必要になるでしょう。

dataObjは、写真データも含まれるのでobject型です。今回は、写真データは必要なく、写真があるかないかの区別があればいいので、stringにキャストします。
"pic"の場合は"*P*"を返すことにします。

コメント、歌詞は複行の文字列なので、Excelに書き出すと巨大セルができるので、こちらも存在のフラグを立てるだけにします。
"comment"は"*C*"、"lyric"は"*L*"とします。

というわけで、返り値はDictionaryu<string(分かりやすいタグ名),string(文字列タグデータ)>にします。

タグを設定していないファイルの場合、MP3ではあるので、フルパス("path")と、フルパスは長くなりがちなので、ファイル名("fileName")のみと、ファイルのタイムスタンプ("createTime")を文字列にして返すことにします。だから、タグがなくても、最低3個のデータが返り値のDictionariの中にあることになります。

このクラスの骨組みを以下のように決めます。
namespace GetTag
public class GetTagMP3
メソッド
public Dictionary<string, string> GetTag(string fName)
(最低でも3個のデータを含む)

テスト項目は
1.普通のタグを設定したファイルを読ませて、タグの個数を確認
2.MP3以外のファイル(期待値 0)
3.タグのないMP3ファイル(期待値 3)
4.存在しないファイル(期待値 0)
5.返り値の中のDirectry<T>に"pic"があればそのデータは"*P*"か?
6.返り値の中のDirectry<T>に"comment"があればそのデータは"*C*"か?
7.返り値の中のDirectry<T>に"lyric"があればそのデータは"*L*"か?

これらがすべてグリーンならOKでしょう。
がんばりましょう。

--------------------------------------------
(1)
http://www.vector.co.jp/soft/winnt/prog/se483898.html
(9)M4aタグ取得

先送りしてきたM4Aタグの取得にかかります。QuickTimeコンポーネントを使いますので、その準備をします。
QuickTime(以下QT)がなければ話になりませんので、インストールを確認します。デフォルトならC:\Program Files\QuickTimeにインストールされています。

フォームの準備
VisualStudioを起動してFileToXMLというプロジェクトを作ります。参照設定でQTフォルダ中のDLL(4コ)を追加します。
次にコンポーネントを追加します。メニューバーの「ツール」下の「ツールボックスのアイテム選択」をクリックすると、アイテム選択のダイアログが出ますので、「COMコンポーネント」タグの中からQuickTimeObjectにチェックを入れます。
すると、ツールボックスにApple Quicktime Control 2.0というアイテムが出るようになります。この状態のスクリーンショットを添付しておきます。

後は普通のウィンドウズアプリと同じで、FormにQTコントロールをD&Dします。このコントロールは、画像再生のためか小さくならないので、VisibleプロパティをFalseにして非表示にします。

テスト用のボタンを配置して、以下のコードを書きます。QTコントロールを渡して、タグデータを受けるクラスを呼んでいます。
private void btnRead_Click(object sender, EventArgs e)
{
  m4aPath = @"F:\DEV2010\10M4A\smpl\smplM4A.m4a";
  Dictionary<string, string> tagDic;
  qtM4ALib m4a = new qtM4ALib(axQTControl1);
  tagDic = m4a.GetTag(m4aPath);
}

M4Aタグの取得クラスの説明は難しくないので、コードで代用します。
public class qtM4ALib
{
  private AxQTOControlLib.AxQTControl QTControl;

  public qtM4ALib(AxQTOControlLib.AxQTControl axQTControl) {
     QTControl = axQTControl;
  }

  internal Dictionary<string, string> GetTag(string m4aPath)
  {
    Dictionary<string, string> Dic
       = new Dictionary<string, string>();
    QTControl.URL = m4aPath;
    QTOLibrary.QTMovie mov = new QTOLibrary.QTMovie();
    mov = QTControl.Movie;
    if(mov == null)
      return null;
    //Get the file props
    string fram = "";
    fram = mov.get_Annotation
      ((int)QTAnnotationsEnum.qtAnnotationArtist);
    if (fram != null)
      retDic.Add("artist", fram);
    //同じように別のタグ取得
    return retDic;
  }

}

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

初心者の為のC# 更新情報

初心者の為のC#のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。