タイトル鶴薗賢吾のCocoaはやっぱり!出張版》Cocoa版ムービープレイヤをチェック(3)カテゴリーQuickTime, Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2001/8/18 13:48:25作成者新居雅行
■ ムービーの制御 ( MyMovieController.m )
ムービーが表示できたので、次は、5つのボタンでの再生や制御について調べます。先頭に飛ぶ(goToBeginning:)、コマ戻し(stepBack:)、コマ送り(stepForward:)、末尾に飛ぶ(goToEnd:)は、ほぼ似たような処理になっているのと、NSMovieViewに対応するメソッドがあるため、goToBeginning:のみを代表として説明します。goToBeginning:の処理の中心は、この行です。

[ movieViewObject gotoBeginning : sender ]; // 先頭に飛ぶ

メソッド名そのままなのですが、ムービーの再生位置を先頭に戻すメソッドであるgotoBeginningを呼んでいます。前後の行にはムービーの再生状態をキープするための自前のメソッドがあります。

[ self saveCurrentMoviePlayingState ]; // 再生状態を保存
[ self restoreMoviePlayingState : sender ]; // 再生状態を復帰

この2つのメソッドの中で扱っている再生状態というのは、「再生しているかどうか」と「再生スピード」の2つです。再生しているかどうかは「isPlaying」で取得できます。逆に、再生と停止は「start:」と「stop:」を使います。再生スピードを得るには「rate」、再生スピードを変えるには「setRate:」を使用します。

 ★ NSMovieView : 再生開始
  [書式] - (void) start : (id) sender
  [入力] sender : メッセージの送信者

 ★ NSMovieView : 再生停止
  [書式] - (void) stop : (id) sender
  [入力] sender : メッセージの送信者

 ★ NSMovieView : 再生中かどうかを取得
  [書式] - (BOOL) isPlaying
  [出力] 返り値 : 再生中 - YES、停止 - NO

 ★ NSMovieView : 再生速度を変更
  [書式] - (void) setRate : (float) rate
  [入力] rate : 再生速度 ( 1で等速再生、0で停止、負の値は逆転再生 )

 ★ NSMovieView : 再生速度を取得
  [書式] - (float) rate
  [出力] 返り値 : 再生速度 ( 1で等速再生、0で停止、負の値は逆転再生 )

NSMovieViewのメソッドは、QuickTime Playerのメニューをそのままメソッドにしたようなものが多く、分かりやすいものばかりですので、リファレンスを見ながらソースを追ってみてください。

■ 再生ボタンの制御(MyMovieController.m)
再生ボタンは、他のアクションよりもちょっと複雑です。ムービー再生中は、再生ボタンが停止ボタンに変化するためです。再生ボタンは、MainMenu.nibの定義では play:メソッドを呼び出すようになっています。クリックされると、play:メソッドが起動されて、start:メソッドでムービーの再生を行います。

[ movieViewObject start : sender ]; // 再生開始

その後の処理で、再生ボタンのタイトルをsetTitle:で「 || 」に変更して、クリックされたときに呼び出すメソッドをsetAction:で「 stop: 」に変更しています。

[ sender setTitle : @"||" ]; // タイトル変更
[ sender setAction : @selector(stop:) ]; // アクション変更

このように、状態に応じてアクションを切替えているわけです。その逆の動作をstop:メソッドでは行っています。まず、stop:で再生を止めて、resetPlayButtonForMovieStopState:を呼びます。

[ movieViewObject stop : sender ]; // 再生停止
[ self resetPlayButtonForMovieStopState : sender ];

resetPlayButtonForMovieStopState:は、以下のような処理になっています。これで、再生ボタンに戻ります。

[ playButton setTitle : @">" ]; // タイトル変更
[ playButton setAction : @selector(play:) ]; // アクション変更

ここでのポイントは、以下のように、動的にアクションを変更できることです。

  • setAction:を使うことで、動的にアクションを変えることができる。

■ QuickTime Frameworkの使用
続いては、QuickTime Frameworkの使用方法についてです。QuickTime Frameworkを使用するためには、まず「プロジェクトにフレームワークを追加する」という作業が必要です。Project Builderの「プロジェクト → フレームワークを追加...」メニューを実行して、ファイルパネルより「QuickTime.framework」を選択します。
そして、QuickTime Frameworkを使うソースの先頭部分に「 #import 」と書いてヘッダーを読み込むようにしましょう。これで準備は完了です。続いて、APIコールです。再度、MovieControllerのawakeFromNibに戻ります。真ん中当たりに、

EnterMovies(); // QuickTimeの初期化

と書かれています。これは、QuickTime自身を初期化するもので、QuickTimeを使用する前に必ず呼ばなければなりません。また、QuickTime Frameworkでは、ムービーを「Movie」という構造体で扱い、関数インターフェイスもMovieを使っています。そのため、NSMovieのインスタンスをそのまま渡すことは出来ません。NSMovieからMovie構造体を取り出す「QTMovie」というメソッドが用意されているので、これを使います。

Movie qtmovie = [ theMovie QTMovie ]; // Movieを取り出す
gMovie = qtmovie;

こうして取り出した、Movie構造体の変数を使ってQuickTime Frameworkを呼び出します。例えば、stepForward:を見てみますと、

if ( IsMovieDone( gMovie ) ) // 再生完了か?

という行があります。IsMovieDoneという関数がQuickTime APIで、ムービーを再生し終わって最後のフレームにいるかどうかを返すものです。このように、Movie構造体さえ取得できれば、後は、Cの関数を呼び出すのと同じです。Carbonアプリケーションとも記述は共通ですので、QuickTimeのサンプルコードは、Carbonアプリケーション用のものを参考にすることが出来ます。
QuickTime Frameworkを使用するためのポイントをまとめておきましょう。

  • QuickTime Frameworkをプロジェクトに追加する。
  • 「 #import 」でヘッダーを読み込む。
  • QuickTime APIを使う前には、EnterMovieを実行する。
  • QuickTime APIを使うときには、NSMovie QTMovieでMovie構造体を取り出す。

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