ウィンドウ上でムービーを再生したい場合、QuickTime 5までは、NewMovieController() APIを使い、映像の下にムービーコントローラーを配置して利用していました。ただし、コントローラーのお世話するために、Carbon Event HandlerやTimerルーチンなどを用意し「面倒なCarbon Event処理」を実装する必要がありました。QuickTime 6からは、CreateMovieControl()というAPIが用意され、通常のコントロール(ボタンやスクロールバー)と同等の扱いで、コントローラーをウィンドウ上に配置で可能となりました。おかげで、面倒なCarbon Event処理を完全に取り除くことが可能になったわけです。
今回は、ムービーコントローラーに対するMCActionFilter(フィルタ)ルーチンを用意し、コントローラーのプレイボタンによる映像再生のスピードや方向を変更してしまう方法を解説してみたいと思います。CreateMovieControl()の利用方法や使用上の注意は、他のToolBoxコントロールとほとんど同じです。コントロールが正しく作成されれば、APIはMovieController(ムービーコントローラーへアクセスするためのリファレンス)の代わりにControlRef(コントロールへのリファレンス)を返してきます。このControlRefから、割り当てられているMovie(ムービーへのリファレンス)や、MovieControllerを得るには、Control ManagerのGetControlData() APIを用いて、以下の様に処理します。

続いて、ムービー表示用のウィンドウを作るcreateMovieWindow()ルーチンと、引き数で渡されたFSSpecよりムービーファイルをオープンし、そこから得られたMovieを返してくるloadMovie()ルーチンを紹介しておきます。

以下が、オープンしたウィンドウにムービーコントローラを配置するopenMovieWindow()ルーチンです。コントローラに割り当てられるMovieは、loadMovie()を使い得ています。

CreateMovieControl()の最初の引き数は、コントローラーを表示するためのウィンドウのWindowRefです。その次が、コントローラーの表示位置とサイズを決める矩形情報です。ここにNULL(ゼロ)を代入すれば、ムービーの映像サイズをそのまま採用してくれるようです。3番目の引き数には、ムービーファイルから得たMovieを渡します。4番目の引き数は、オプション機能のON/OFFを制御するためのフラグです。オプションフラグの各ビットの意味については詳しく説明しませんが、内容はMovie.hに記されていますので参照してみてください。
CreateMovieControl()で得られたControlRef(chd)をgetMyControlMovieController()に渡して、MovieController(play)を得ています。ムービーコントローラーに関連するAPIには、引き数としてMovieControllerを渡す必要があるわけです。ユーザがコントローラーに対して何か操作(プレイボタンをクリックするとか)をした時、その処理が実行される前に割り込んで処理内容を横取りすることが可能です。そうした処理を担当するのが、MCActionFilterと呼ばれるフィルタルーチンです。こうしたフィルタルーチンは、MCSetActionFilterWithRefCon()を使い、先んじてコントローラーに登録しておく必要があります。
以下が、今回フィルタルーチンとしてコントローラーに登録するmyMovieAction()です。引き数のactには、コントローラーに割り当てられているMovieに対する操作(アクション)の種類が入ってきます。アクションの種類は100近くあり、すべてMovie.hで定義されています。引き数のparaには、そのアクションに必要なパラメータが代入されてきます。今回は、プレイボタンがクリックされた時に発生する「mcActionPlay」アクションのみに注目しています。この時に渡されるパラメータは映像の再生スピードです。x10000という値が等速を表しており、例えば、この値がx20000に設定されれば、映像は2倍速で再生されることになります。

ムービーコントローラーに対して直接アクションを実行させる場合には、MCDoAction()を利用します。つまり、「act==mcActionPlay && now==0x10000L」の条件の時だけ処理を横取りし、外部変数に保存されている再生スピード(mov_speed)、ループ再生の有無(mov_loop)、再生方向(mov_dir)により、コントローラに対して異なる指令を送ってやるわけです。利用するアクションは「mcActionSetLooping」と「mcActionPlay」の2つとなります。今回は、指定パラメータを外部変数に保存していますが、もし各ウィンドウに固有のパラメータを用意したければ、引き数のrefに対象となるウィンドウのWindowRefが入ってきますので、それをうまく利用すると良いでしょう。
ムービーコントローラーに関するAPIや定数が定義されているUniversal Interfacesは、Movies.hです。QuickTime 6のAPIを利用する場合には、プロジェクトへ「QuickTime Framework」を追加し、ソースファイルの先頭で以下の定義を行うことを忘れないでください。またムービーコントローラーを使うのには、アプリケーションの開始時にEnterMovies()を、終了時にExitMovies()を呼ぶ必要があります。
#include <Quicktime/QuickTime.h>
QuickTimeに関する最新技術資料は、以下のサイトにまとめられています。QuickTime 6で新規追加された機能を調査したい方は、このサイトにアップロードされている「Whats New in QuickTime 6」(220ページ 1.2MB)というPDFドキュメントを参照してください。
http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/newsframe.htm
QuickTimeに関する各種サンプルソースコードは、以下のサイトに登録されています。
http://developer.apple.com/samplecode/Sample_Code/QuickTime.htm
copyright 2003 Ottimo, Inc. All rights reserved
無断転載・引用禁止
Contact us: koike@ottimo.co.jp