タイトル鶴薗賢吾のCocoaはやっぱり!出張版》Cocoa版ムービープレイヤをチェック(2)カテゴリーQuickTime, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/8/18 13:47:22作成者新居雅行
■ プロジェクトのファイル構成
続いて、プロジェクトを構成しているファイルを見ていきます。まず、Project Builderでプロジェクトファイル(SimpleCocoaMovie.pbproj)を開きます。



Classesのところに「MyMovieController.h」と「MyMovieController.m」があります。これは、「MyMovieController」というクラスを定義しているものです。このクラスが今回の主役で、アプリケーションのほとんどの制御を行っています。その下の「QTUtils.h」と「QTUtils.c」は、下請けのユーティリティ関数を持っていて、MyMovieControllerから使われます。
続いて、Resourcesを見ると「MovieFile.mov」というQuickTimeムービーのファイルが入っています。これを読みこんで再生します。「MainMenu.nib」には、ユーザーインターフェイス等の定義がなされています。

■ MainMenu.nibの構成
次に、MainMenu.nibをダブルクリックして、Interface Builderでその中身を見てみましょう。



MainMenu.nibのウィンドウを見ると、ウィンドウのインスタンスが2つあるのが分かります。「Window」がメインの再生用のウィンドウ、「Movie Properties」というのがムービー情報表示用のウィンドウになっています。先程出てきたMyMovieControllerのインスタンスもあります。

では、これらがどういう関係になっているのか、主なアクションの接続を確認してきましょう。メインウィンドウの中にある5つのボタンと音量調整のスライダーのアクションは、全てMyMovieControllerに繋がっています。分かりやすい名前がついていますので、見ていただければ分かると思います。メニューからも直接繋がっています。



次は、主なアウトレットの接続の確認です。こちらも分かりやすい名前になっています。メインのウィンドウだけでなく、情報ウィンドウの方やメニューアイテムにも接続されていることが分かります。これらの図は、ソースを見る時に照らし合わせるとよいと思います。



■ ムービーの読み込みと表示(MyMovieController.m)
それでは、コードの方に入っていきます。このサンプルでは、起動時に自動的にムービーを読みこんでいます。その処理は、MyMovieController.mの「awakeFromNib」メソッドの中に書かれています。
アプリケーションは、起動時にMainMenu.nibを読みこんで、画面にメニューやウィンドウを表示します。そして、MainMenu.nibを読み込み終わったら、MainMenu.nibの中にある全てのインスタンスに向かってawakeFromNibメッセージが送られます。ですので、このメソッドは初期化の処理を書くのに適しているわけです。MyMovieControllerもインスタンスがMainMenu.nibにありますので、起動時にメニューなどと同時に読み込まれて、その後、awakeFromNibメソッドが呼ばれます。

さて、本題のムービーの読み込みと表示ですが、以下の3段階で実現できます。

  • ムービーファイルの存在場所をNSURLで用意する。
  • ムービーをファイルから読み込み、NSMovieのインスタンスを作成する。
  • このNSMovieをNSMovieViewにセットする。

では、サンプルコードの該当個所を見ていきます。まず、ムービーファイルの存在場所を調べるところです。

// ムービーのファイルパスの取得
NSString *filePath = [ [ NSBundle mainBundle ]
pathForResource : @"MovieFile"
ofType : @"mov" ];

// ムービーの場所をURLの形式で取得
NSURL *movieUrl = [ NSURL fileURLWithPath : filePath ];

Cocoaのアプリケーションの実体はフォルダーで、その中に実行ファイルやnibファイルなどのリソースファイルが収められています。このSimpleCocoaMovieのフォルダー構成を見てみましょう。Finder上でSimpleCocoaMovieを表示させて、コントロールキー+クリックで表示されるメニューから「パッケージの内容を表示」を選択すると中身を見ることができます。



このフォルダーのことをバンドル(束)といい、これを扱うクラスがNSBundleです。mainBundleというメソッドで、アプリケーション自身を表すフォルダーのNSBundleが得られます。pathForResource: ofType:を使うことで、バンドル内の「Contents/Resources/」以下にあるリソースファイルのフルパスを取得することが出来ます。このサンプルでは、「MovieFile」という名前と「mov」という拡張子を持つファイルを見つけて、ファイルパスを返してくれます。

 ★ NSBundle : アプリケーション自身のバンドルのインスタンスを作成
  [書式] + (NSBundle *) mainBundle
  [出力] 返り値 : 見つかったファイルのフルパス

 ★ NSBundle : バンドル内のリソースのファイルパスを取得する
  [書式] - (NSString *) pathForResource : (NSString *) name
           ofType : (NSString *) extension
  [入力] name : ファイル名(拡張子を除いたもの)
     extension : 拡張子
  [出力] 返り値 : 見つかったファイルのフルパス

Resourcesフォルダーの下に「English.lproj」というフォルダーがありますが、これは英語圏用のリソースが入るところです。日本語対応したソフトの場合は、Japanese.lprojというフォルダーがあって、この中に日本語化されたリソースファイルが入ります。MovieFile.movは、Resourcesフォルダーの直下にありますが、この場所には言語に依存しないリソースファイルが置かれて共通のリソースとして使われます。

pathForResource: ofType:メソッドは、ローカライズされたリソースが無いかをまずチェックします。この場合は、English.lprojの中を探します。無い場合には、続いてResouces直下のリソースを探します。

次に、得られたファイルパスをURLの形式にします。NSMovieクラスには、ファイルパスからムービーのインスタンスを作るメソッドが無く、URLを扱うクラスである「NSURL」からしか作ることができません。そのため、ファイルパスからfileURLWithPath:を使ってNSURLを作成する必要があります。

 ★ NSURL : ファイルパスからNSURLを作成する
  [書式] + (id) fileURLWithPath : (NSString *) path
  [入力] path : ファイルパス
  [出力] 返り値 : 作成したNSURLのインスタンス

NSURLが準備できたら、NSMovieを作成します。ソースは以下のようになっています。NSMovieのインスタンスをallocで作成して、initWithURL: byReference:にURLを渡して初期化します。これで、ムービーファイルが読みこまれます。

NSMovie *theMovie = [ [ NSMovie alloc ]
initWithURL : movieUrl
byReference : YES ];

ここで得られたNSMovieをNSMovieViewにsetMovie:でセットします。数行飛びますが、以下のようなコードがあります。

[ movieViewObject setMovie : theMovie ];

 ★ NSMovieView : ムービーをセットする
  [書式] - (void) setMovie : (NSMovie *) movie
  [入力] movie : セットするムービー

これで、ムービーを画面に表示させることができます。以上の部分のポイントをまとめると、以下のようになります。

  • MainMenu.nibの中のインスタンスの初期化処理は、awakeFromNibに書くとよい。
  • リソースファイルを取り出すには、NSBundleを使用する。
  • ムービーの場所の指定は、NSURLを使用する。
  • ムービーの読み込みは、initWithURL: byReference:を使用する。
  • ムービーの表示は、NSMovieViewにsetMovie:を使ってNSMovieをセットする。

[鶴薗賢吾]
(続く)
関連リンクCocoaはやっぱり!