/**/
QuickTimeムービーについて考えるとき、フィルムと似たものと考えるのは良い考えです。1つのフレームのシリーズは、サウンドを伴い、あるいはサウンドなしで、時間軸上に直線的に配置されます。
実際、QuickTimeムービーの構造は、あなたがよく知っているかもしれない、MIDIとオーディオのシーケンサーのモデルにかなり近いものです。
QuickTimeムービーはトラックのコンテナ(入れ物)です。各トラックは、オーディオやビデオというような特定のタイプのメディアを持ち、それらのメディアの空間的、および/あるいは、時間的な境界を定義します。例えば、あるQuickTimeムービーのビデオトラックの一つが80×60のサイズで30秒だけの長さだとしても、そのムービーは320×240のサイズで3分の長さであっても良いのです。QuickTimeムービーは、それらの最も長いトラックの終わりよりも長くなることはありません。
QuickTimeムービーの各トラックは、別々のタイプのものかもしれません。ビデオ、オーディオ、スプライト、MIDI(QuickTimeでは、これをミュージックトラックと呼びます)、VRパノラマといったものが可能なタイプの一部で、そのムービー内の異なったポイントから開始することができます。それに加え、単独のムービーで同一タイプの複数トラックを持つこともできます。トラックは独立していて、それらを個別にオンやオフに切り替えることができ、また、それらはすべて異なった長さにすることができます。
QuickTimeミュージックトラックは、標準MIDIファイルのコンテナです。QuickTime設定コントロールパネルを使って、これらのトラックの出力を設定できます。デフォルトでは、QuickTimeはQuickTime Music Synthesizerを使います。これはQuickTimeに組み入れられているGeneral MIDIソフトウェアシンセサイザです。もし、Open Music System(OMS)がインストールされていれば、QuickTimeはOMSを通してハードウェアのシンセサイザにミュージックトラックを送ることができます。また、Inter-Application Communication bus (IAC)を使うことによって、それらをMaxに送り戻すことも可能です!
トラックの視覚的な優先度は、トラックのビジビリティレイヤによって決まります。トラックレイヤには?32768から32767の数が付けられます。低いビジビリティレイヤ値を持つトラックは、高いビジビリティレイヤ値を持つトラックの前面に表示されます。オーディオトラックは、そのレイヤ値に関係なく、自動的にミックスされます。
jit.qt.movie オブジェクトは、トラックのまとまりに対する多くの機能を提供します。次に示すのは役に立ついくつかのメッセージの簡単なリストです。
addtrack: | 新規のトラックを作ります。 |
deletetrack: | トラックを削除します。 |
gettrackinfo: | いくつかのトラック情報 (index, name, type, enabled status, visibility layer) を表示します。 |
gettrackoffset: | トラックのオフセット時間を表示します(trackoffsetメッセージを使って設定します)。 |
gettrackduration: | トラックのデュレーションを表示します (trackdurationメッセージを使って設定します)。 |
gettrackdim: | トラックの空間的な大きさを表示します(trackdimメッセージを使って設定します)。さらに、特定のトラックに対するマトリックス変換を行うためのmxformメッセージを利用すれば、トラックサイズを調整できます。 |
gettrackname: | トラック名を表示します(tracknameメッセージを使って設定します)。 |
gettracktype: | トラックタイプを表示します(タイプを設定することはできません。新規のトラックを作るにはaddtrackを使ってください)。 |
gettracklayer: | トラックのビジビリティレイヤを表示します(tracklayerメッセージを使って設定します) |
gettrackcodec: | トラックのコーデックを表示します(コーデックは設定できません)。 |
gettrackenabled: | トラックが有効かを表示します(trackenabledメッセージを使って設定します)。 |
getgmode: | トラックの描画モード(他のトラックと相互作用する方法)を表示します。(gmodeメッセージを使って設定します)。 |
重要:トラックの作成や削除も含めて、どの種類のトラック編集も、それが閉じられたときにムービーと一緒に自動的に保存されません。変更を確実に保存するためには、 savemovie、savemovieas、savemoviecopyといったメッセージを使うか、jit.qt.movie オブジェクトの autosave アトリビュートに1(オン)を設定して下さい。
vrpan: | VRムービーに対するパンを設定します。 |
vrtilt: | VRムービーに対する傾きを設定します。 |
vrfov: | VRムービーに対する視野を設定します。 |
vrnode: | マルチノードVRムービーに対して、カレントノードを設定します(有効なノードを列挙するには、getvrnodelistメッセージを使用します)。 |
addfxtrack: | qfxファイルをインポートして、QuickTimeエフェクトトラックセット(1?3つの実際のトラック)を作ります。 |
deletefxtrack: | addfxtrackメッセージで作られた、任意の、またはすべてのQuickTimeエフェクトトラックを削除します。 |
addbgtrack: | バックグラウンドカラートラックを作ります。 |
deletebgtrack: | Jitterによって作られたバックグラウンドカラートラックを削除します。 |
多くのハードウェアベースのメディアと違い、QuickTimeはフレームベースのタイムシステムを使っていません。その代わりに、QuickTimeはタイムスケールとタイム値に基づいたシステムを使っています。タイムスケールは、どのくらいの時間値で1秒のムービーを構成するかを示す整数値です。デフォルトでは、新規のQuickTimeムービーでは600というタイムスケールを持ちます。これは、1秒に600のタイム値があることを意味しています。
フレームレートは、interesting time という概念によって決定されます。これはムービーが変わる時間です。もし、ムービーが40タイム値毎に変わるときには、1秒毎に15フレームの実効フレームレートがあります(600÷40=15だからです)。Jitterが、getframecount メッセージでムービーのフレーム数を得るとき、ムービーの interesting time をスキャンし、それらの数を報告します。frame と jumpメッセージは、様々な interesting time のポイント中で「再生開始ポイント」を動かします。
タイムスケールとフレームレートの関係についてのさらに詳しい情報は、チュートリアル4:「ムービー再生のコントロール」を参照して下さい。
Jitterでは、録画処理でフレームレートを指定することができ、Jitterは新規のムービーを構成するように計算してくれます。対照的に、編集処理では効果の範囲を決めるためにタイム値を使います。
Jitterはあなたが投入した任意のムービーを喜んで再生しますが、動作の向上を図るためには、いくつかのガイドラインがあります。残念なことに、完全なものにするための確実な手段はありません。Jitterのようなリアルタイムアプリケーションの動作能力は、ムービートラックの(データバンド幅とプロセッサ負荷に関係する)コーデック、ムービーの大きさ、フレームレート、また、ある程度はそのメディアの処理の複雑さといったものの相互作用の結果によります。
細かくなりますが、ビジュアルメディアは、大量のデータを含み、それが表示されるまでには、ディスクからの読み出しや、処理がされなければなりません。コーデック、もしくは圧縮/復元機能は、データをエンコードしたりデコードするために使われます。エンコーディングでは、ムービーが再生されるときにディスクから読み込まれる情報の量をできるだけ少なくするため、一般的にデータを小さくすることを目標とします。ディスクからのデータの読み出しは、ムービー再生時のオーバーヘッドの主な要因になります。
充分なRAMがある場合、jit.qt.movie に対して loadram メッセージを使うことによって、ムービーの(圧縮された)メディアをRAMにコピーことができます。RAMへのアクセスは、ハードディスクへのアクセスよりも非常に高速なので、ムービーの再生時に jit.qt.movie オブジェクトが各フレームを復元しなければならないことは変わりないものの、ムービー再生は一般的に向上します。復元したマトリックスデータをRAMにバッファリングするためには、jit.matrixset オブジェクトを使います。
デコーディングでは、可能な限り速くエンコード(圧縮)前の状態にそのデータを戻すことが目標とされます。一般的にコーデックは損失があるものです。これは、処理の過程でいくらかのデータが失われることを意味します。ユーザとしては、こういったコーデックが、特定のアプリケーションで高速で高画質なものになることが目標です。
QuickTimeムービーのトラックのコーデックを決定するためには、jit.qt.movie に対してgettrackcodecメッセージを使います。
コーデックは、ビデオとオーディオのトラックの両方に利用できます。オンラインでの配付については、小さいファイルを作るためにMPEG 1レイヤー3(.mp3)、あるいはQDesignオーディオコーデックを利用したいかもしれません。しかし、Jitterでビデオとオーディオのトラックがあるムービーを再生するなら、単にオーディオコーデックの復元によるオーバヘッドがないため、非圧縮オーディオ(PCMオーディオ)が最も良い結果となります。
技術的な注: .mp3ファイルは、jit.qt.movie によってオーディオだけのムービー(それらはMPEG 1レイヤー3コーデックで圧縮されます)として読み込まれることが可能です。このオーディオデータは jit.qt.movie オブジェクトや別のJitterオブジェクトで処理することはできませんが、jit.qt.movie オブジェクトのsocアトリビュートを使うことによって、そのオーディオを spigot~ オブジェクト(チュートリアル27:「JitterマトリックスでのMSPオーディオの使用」を参照してください)を介してMSPに送ることができます。
MPEGやモーションJPEG、あるいは、より一般的にソフトウェアで扱われるような特定のコーデックのハードウェア圧縮/復元機能を提供する特別なビデオカードを持っているならば、ビデオコーデックはハードウェアによって扱われるかもしれません。Jitterでは、ハードウェアコーデックのサポートは、ビデオ出力装置に関連するものだけです。jit.qt.movie オブジェクトがビデオ出力装置へ直接出力するという重要な機能(詳しくは、チュートリアル22:「ビデオ出力コンポーネントとの連係」と jit.qt.movie のオブジェクトリファレンスを参照してください)を除き、ムービー再生には、常にソフトウェアコーデックが使用されます。
技術的な注:コーデックのハードウェアサポートをしているビデオカードの多くは、オンスクリーンでのメディアの復元しかサポートしていません。通常、Jitterでは(上記の例外は除いて)メディアをオフスクリーンバッファに復元するため、ソフトウェアコーデックが使われます。
ビデオコーデックは一般的に、次のような空間圧縮と時間圧縮の仕組みのどちらか、もしくは両方を使います。
空間圧縮は、おそらく静止画の分野でお馴染みでしょう。JPEG、PNG、PICTファイルは、それぞれ空間圧縮の形式を使っています。空間圧縮の仕組みは、単一のイメージフレームの中で、単純な形で示されるパターンと繰り返しを探します。また、多くは、こういったパターンを含むように画像が単純化されます。しかし、複雑なイメージでは圧縮が難しく、たいてい大きなファイルになってしまいます。空間圧縮は、時間を考慮しておらず、そのエンコーディングアルゴリズムに従い、各フレームを単純に圧縮しているだけです。
時間圧縮は、連続したフレーム間の変化内容を生成することによって処理するものなので、動画の世界にしかないものです。一般的に、時間圧縮は各フレームを完全に描写するものではありません。その代わりに、時間圧縮されたムービーは2種類のフレームを含みます。キーフレームは完全に描画されたフレームで(通常は空間圧縮がされています)、レギュラフレームは前のキーフレームからの変化が記述されているものです。
ムービーを最初から最後まで再生するアプリケーションにとっては、時間圧縮はとても有用なものです。Sorenson のようなコーデックは、web再生に理想的なとても小さなファイルを作るために、時間圧縮を使います。しかし、時間圧縮では、キーフレームの順番がイメージの流れを正確に示すのにとても重要なことなので、ムービーを逆再生する必要がある場合には、良い選択とは言えません。時間圧縮されたムービーを逆再生する場合、フレームの初期状態を示すキーフレームの前に、その変化の記述が処理されてしまうでしょう!さらに、Sorenson コーデックは、復元するためにかなりのプロセッサ性能を必要とします。Sorenson 圧縮されたムービーの再生は、より“軽い”方法で圧縮されたムービーの再生に比べて遅くなるでしょう。
Jitterの再生では、フォトJPEGやモーションJPEGのような時間圧縮なしのビデオコーデックを使うことをお勧めします(フォトJPEGとモーションJPEG圧縮は、同じ圧縮方法を用いていますが、モーションJPEGは、特別なハードウェアサポート[上記参照]のために最適化されています)。JPEG圧縮は、高画質の設定ではファイルサイズと画質が良いバランスになります。それは比較的単純にデコードできるものでもあるので、プロセッサの能力をビデオの復元以外の作業に回すことができます。
画質を最高にした場合、「アニメーション」コーデックは、フォトJPEGよりも良く見えるでしょうが、生成されるファイルは大きくなります。
QuickTime の様々なバージョンでは、様々なオーディオとビデオのコーデックをサポートしています。例えば、QuickTime 5は、MPEG-4 コーデックをサポートしていませんが、QuickTime 6ではサポートしています。あなた独自のJitterの利用のための最適なコーデック設定を見つけるように、様々な設定を試してみるべきでしょう。
Discreet's Codec Centralは、コーデックについての素晴らしいオンライン教材を作成しています。これを書いているときには、それはオフラインになっていますが、Discreetは、http://www.codeccentral. com/ですぐに再度公開すると述べています。
コーデックに比べて、ムービーのディメンション(大きさ)とフレームレートは、Jitterのパフォーマンスにおいて、より直接的な要因となります。簡単に言えば、大きなイメージのフレームや、高いフレームレートでは、Jitterが毎秒処理するデータはより大きなものになります。
640×480のムービーでは、Jitterの処理のために、1秒間に1,228,800の独立した値を生成します(640×480×4(アルファ、赤、緑、青のチャンネルの値にわかれるためです))。320×240のムービーでは、1秒間にほんの307,200の独立した値しか生成しません。それより大きなサイズのムービーの4分の1です。処理にJitterを使おうと思うのであれば、できれば小さめのムービーを使うことをお薦めします。ほとんどのマシンで、320×240のムービーは良好なパフォーマンスを提供します。
あなたがDVメディアで作業している場合、あなたのムービーは、29.97フレーム/秒(NTSC)か、25フレーム/秒(PAL)でレコーディングされます。320×240のムービーを使った場合でも、Jitterは、NTSCでは1秒毎に9,206,784個の値、PALでは1秒毎に7,680,000個の値を処理しなければなりません。Jitterを使って処理をする場合、15もしくは20フレーム/秒にフレームレートを減らすことによるデータの軽量化で、かなり動作が改善されます。多くのマシンでは、15fpsが良い選択です。
私たちは、多くのムービーに対する好ましい設定を発見しました。次のパラメータは、常に良い結果をもたらします。
・320×240のフレームサイズ
・15フレーム/秒
・ビデオトラック:フォトJPEGコーデックで、中?高画質設定
・オーディオトラック:非圧縮
QuickTimeムービーは、少し例をあげれば、オーディオ、ビデオ、QuickTime VR、テキストといった様々なタイプの多くのトラックを含むことができます。Jitterでは、jit.qt.movieオブジェクトのトラックメッセージを使うことで、これらのトラックについての時間的オフセット、空間的大きさ、デュレーション、可視レイヤ、グラフィックトランスファーモードを含む基本情報を取得したり設定したりすることができます。
QuickTimeのタイムモデルは、標準的なフレームベースのモデルと多少異なり、QuickTimeメディアのある時間における時間値を決めるために、タイムスケール値に依存しています。jit.qt.movieオブジェクトは、フレームとタイムスケールの両方のモデルを使い、再生操作を可能にしています。jit.qt.movieオブジェクトのすべての編集機能は、それらの適用範囲を決めるために、タイムスケールモデルを使っています
Jitterで使われるムービーに対する理想的な設定は、理論的に決められるものではありません。実際の動作は、コーデック、大きさ、フレームレート、メディアの複雑さを含んだいくつかの要因に依存します。現在のハードウェアで最良の結果を出すためには、320×240、15fps、フォトJPEG圧縮されたムービーを使うことをお薦めします。