タイトル鶴薗賢吾のCocoaはやっぱり!出張版》Cocoa版ムービープレイヤをチェック(4)カテゴリーQuickTime, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/8/18 13:49:56作成者新居雅行
■ 情報ウィンドウ
Movie Propertiesウィンドウには、現在表示しているムービーの情報を表示していますが、これらの情報は、NSMovieやNSMovieViewから得ることは出来ません。そのため、こちらでもQuickTime APIを呼び出しています。awakeFromNibの一番最後の行に、以下の記述があります。

[ self setMoviePrOpertyWindowControlValues : qtmovie ]; // ムービー情報を収集

setMoviePropertyWindowControlValues:メソッドで、Movie Propertiesウィンドウの中身を順に初期化しています。各項目は、以下の関数もしくはメソッドを呼んで初期化を行っています。

  • 自動再生:QTUtils_IsAutoPlayMovie ( QTUtils.c )
  • トラック数:GetMovieTrackCount ( QuickTime API )
  • メディアタイプ:buildTrackMediaTypesArray ( MyMovieController.m )
  • タイムスケール:GetMovieTimeScaleAsString ( QTUtils.c )
  • ムービーの長さ:GetMovieDurationAsString ( QTUtils.c )

これらを順に見ていきましょう。ただし、トラック数の取得は、専用のQuickTime APIを呼んでいるだけですので省きます。

■■ 自動再生かどうかの取得 QTUtils_IsAutoPlayMovie ( QTUtils.c )
QuickTimeムービーの中には「ユーザーデータ」という、アプリケーション固有のデータを格納する場所があります。そのデータの中にQuickTime Playerが使っているいくつかのデータがあり、ムービーを開いたときに自動的にムービーを再生開始するかを決める「play」という名前のフラグがあります。この関数では、そのフラグを取得しています。
GetMovieUserDataでユーザーデータ全体を取り出して、GetUserDataItemで、その中から「 play 」という名前のデータを取り出しています。

myUserData = GetMovieUserData( theMovie );
myErr = GetUserDataItem( myUserData, &myAutoPlay, sizeof(myAutoPlay), FOUR_CHAR_CODE(’play’), 0 );


■■ メディアタイプリストの取得 buildTrackMediaTypesArray: ( MyMovieController.m )
メディアタイプリストは、buildTrackMediaTypesArray:メソッドで作成し、結果は、MyMovieControllerクラスのmovieTrackMediaTypesArrayという文字列の配列に格納されます。メディアタイプリストの表示は、NSTableViewというテーブルを表示するためのViewを使用していますが、ここも簡単に説明しておきます。Interface Builderでは、Cocoa-Tabulation Views PaletteにNSTableViewがあります。



NSTableViewは、「dataSource」というアウトレットを持っていて、そこに接続されたインスタンスにメッセージを送り、表示するためのデータをもらうという仕組みになっています。SimpleCocoaMovieでは、このデータの供給を行っているのはMyMovieControllerです。Interface Builderで、NSTableViewをダブルクリックして、InfoウィンドウのConnectionsのOutletsの中にあるdataSourceをクリックすると、MyMovieControllerに接続されていることが分かります。



このdataSourceは、2つのメソッドを実装する必要があります(テーブルの内容を編集する場合は3つ)。

  • テーブルの行数を返す : numberOfRowsInTableView:
  • 指定位置のデータを返す : tableView: objectValueForTableColumn:row:

numberOfRowsInTableView:は、行数を配列の要素数を返すcountメソッドを使って行数を返しています。

return [ movieTrackMediaTypesArray count ];

tableView: objectValueForTableColumn: row:は、行の指定を配列のインデックス値として、配列からobjectAtIndex:を使って、配列の中身、つまりメディアタイプの文字列を返しています。

return ( [ movieTrackMediaTypesArray objectAtIndex : rowIndex ] );

テーブルの表示については、触りだけですが2つのメソッドを用意するだけで実現できるわけです。
NSTableViewへのデータ表示についてのポイントをまとめると、以下のようになります。

  • NSTableViewは、dataSourceアウトレットからデータ供給を受ける。
  • dataSourceは、行数と指定位置のデータを返す2つのメソッドを実装する。

■■ タイムスケールを文字列で取得 GetMovieTimeScaleAsString ( QTUtils.c )
QuickTime APIのGetMovieTimeScaleで、ムービーのタイムスケールを取得します。この数値をMakeMovieTimeScaleDisplayStringという自前の関数を使ってC文字列に変換します。そして、Cocoaとやり取りをするために、C文字列をstringWithCString:を使ってNSStringに変換しています。

StringPtr timeScaleString = MakeMovieTimeScaleDisplayString( GetMovieTimeScale( theMovie ) );
NSString *timeScaleNSString = [ NSString stringWithCString : timeScaleString ];

 ★ NSString : C文字列からNSStringを生成する
  [書式] + (id) stringWitCString : (const char *) cString
  [入力] cString : C文字列
  [出力] 返り値 : 変換されたNSStringの文字列

文字列のやり取りについてのポイントは、以下の通りです。

  • C文字列は、stringWithCStringを使ってNSStringに変換する。

■■ ムービーの長さを文字列で取得 GetMovieDurationAsString ( QTUtils.c )
GetMovieDurationとGetMovieTimeScaleがQuickTime APIで、ムービーの長さとタイムスケールを取得します。割り算をすることで秒単位の値になりますので、これをMakeMovieTimeDisplayStringという自前の関数を使って「00:00:00」のフォーマットのC文字列に変換しています。先程と同様に、NSStringに変換しています。

StringPtr movieDurationString = MakeMovieTimeDisplayString( GetMovieDuration( theMovie ) / GetMovieTimeScale( theMovie ) );
NSString *movieDurationNSString = [ NSString stringWithCString : movieDurationString ];

■ タイムスケール
「 タイムスケール 」という言葉を何度か使ってきましたが、これについて説明しておきます。これは、QuickTimeの用語なのですが、QuickTimeで時刻や時間を表す場合、このタイムスケールを基準にした値を使います。サンプルで使用しているMovieFile.movでは、600というタイムスケールの値を持っていますが、これは、1/600秒を1とする時間軸をこのムービーが持っていることを表します。タイムスケールの値が大きいほど、精度の高い時刻指定が可能になり、逆に小さくすると、長い時刻指定を行うことが出来ます。
先程出てきましたGetMovieDurationというQuickTime APIでムービーの長さが得られますが、MovieFile.movは、1800という値になっています。これをタイムスケールの600で割ることで3秒のムービーであることが分かります。


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