補遺A

QuickTimeの秘密


QuickTimeムービーの構造

QuickTimeムービーについて考えるとき、フィルムと似たものと考えるのは良い考えで、一つに繋がったフレームは、音と一緒に、もしくは無音で、時間的に直線的に配置されます。

実際には、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(オン)を設定してください。

QuickTime VR

vrpan: VRムービーに対するパンを設定します
vrtilt: VRムービーに対する傾きを設定します
vrfov: VRムービーに対する視野を設定します
vrnode: マルチノードVRムービーに対して、カレントノードを設定します(有効なノードを列挙するには、getvrnodelistメッセージを使用します)

QuickTimeエフェクト(詳しくは、チュートリアル24:QuickTimeエフェクトをご覧ください)

addfxtrack: .qfxファイルをインポートして、QuickTimeエフェクトトラックセット(1〜3つの実際のトラック)を作ります
deletefxtrack: addfxtrackメッセージで作られた、任意の、またはすべてのQuickTimeエフェクトトラックを削除します

バックグラウンドカラー

addbgtrack: バックグラウンドカラートラックを作ります
deletebgtrack: Jitterによって作られたバックグラウンドカラートラックを削除します


QuickTimeでの時間

多くのハードウェアベースのメディアと違い、QuickTimeはフレームベースのタイムシステムを使っていません。その代わりに、QuickTimeはタイムスケールと時間値に基づいたシステムを使っています。タイムスケールは、どのくらいの時間値で1秒のムービーを構成するかを示す整数の値です。デフォルトで、新規のQuickTimeムービーでは、1秒に600のタイム値があることを意味する600のタイムスケールになります。

フレームレートは、interesting timeの概念によって決定されます。それはムービーが変わる時間です。もし、ムービーが40タイム値毎に変わるときには、1秒毎に15フレームの実効フレームレートがあります(600÷40=15だからです)。Jitterが、getframecountメッセージでムービーのフレーム数を得るとき、ムービーのinteresting timeを走査し、それらの数を報告します。frameとjumpメッセージは、様々なinteresting timeのポイント中で再生開始ポイントを動かします。

タイムスケールとフレームレートの関係のさらに詳しい情報については、チュートリアル4の「ムービー再生のコントロール」を参照してください。

Jitterでは、録画処理でフレームレートを指定することができ、Jitterは新規のムービーを構成するように計算します。対照的に、編集処理では効果の範囲を決めるために時間値を使います。


Jitterにおける再生のためのムービーの最適化

Jitterはあなたが投入した任意のムービーを喜んで再生するでしょうが、動作の向上を図るためには、いくつかのガイドラインがあります。残念なことに、完全なものにするための確実な手段はありません。Jitterのようなリアルタイムアプリケーションの動作能力は、ムービートラックの(データバンド幅とプロセッサ負荷に関係する)コーデック、ムービーの大きさ、フレームレート、また、ある程度はそのメディアの処理の複雑さといったものの相互作用の結果によります。

コーデック

細かくなりますが、ビジュアルメディアは、大量のデータを含み、それが表示されるまでには、ディスクからの読み出しや、処理がされなければなりません。コーデック、もしくは圧縮/解凍機能は、データをエンコードしたりデコードするために使われます。エンコーディングでは、ムービーが再生されるときにディスクから読み込まれる情報の量をできるだけ少なくするため、一般的にデータを小さくすることを目標とします。ディスクからのデータの読み出しは、ムービー再生時のオーバーヘッドの主な要因になります。

もし充分なRAMがあれば、ムービーの(圧縮された)メディアからRAMにコピーするためにjit.qt.movie に対してloadramメッセージを使うことができます。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オブジェクトで処理できなくても、そのオーディオをspigot~オブジェクトを通してMSPに送るために、jit.qt.movieオブジェクトのsocアトリビュートを使うことができます(チュートリアル27「JitterマトリクスでのMSPオーディオの使用」をご覧ください)。


ビデオコーデック

MPEGやモーションJPEGのような特定のコーデックをハードウェアで圧縮/解凍を行う特別なビデオカードを持っているなら、ビデオコーデックはハードウェアによって扱われるかもしれません。Jitterでは、ハードウェアコーデックのサポートは、ビデオ出力装置に関連するものだけです。jit.qt.movieオブジェクトがビデオ出力装置へ直接出力するという重要な機能を除き、ムービー再生には、常にソフトウェアコーデックが使用されます(詳しくは、チュートリアル22「ビデオ出力コンポーネントとの連係」とjit.qt.movieのオブジェクトリファレンスをご覧ください)。

技術的注意:コーデックのハードウェアサポートをしているビデオカードの多くは、オンスクリーンでのメディアの解凍しかサポートしていません。通常、Jitterでは(上記の例外は除いて)メディアをオフスクリーンバッファに解凍するので、ソフトウェアコーデックが使われるのです。

ビデオコーデックは一般的に、次の空間圧縮と時間圧縮の仕組みのうちの一つ、もしくは両方を使います。

空間圧縮は、静止画の分野でもお馴染みのものです。JPEG、PNG、PICTファイルは、それぞれ空間圧縮の形式を使っています。空間圧縮の仕組みは、単一のイメージフレームの中で、単純な形で示されるパターンと繰り返しを探します。また、多くは、こういったパターンを含むように画像が単純化されます。しかし、複雑なイメージでは圧縮が難しく、たいてい大きなファイルになってしまいます。空間圧縮は、時間を考慮しておらず、そのエンコーディングアルゴリズムに従い、各フレームを単純に圧縮しているだけです。

時間圧縮は、連続したフレーム間の変化内容を生成することによって処理するものなので、動画の世界にしかないものです。一般的に、時間圧縮は各フレームを完全に描写するものではありません。その代わりに、時間圧縮されたムービーは2種類のフレームを含みます。キーフレームは完全に描写されたフレームで(通常は空間圧縮がされています)、レギュラフレームは前のキーフレームからの変化が記述されているものです。

ムービーを最初から最後まで再生するアプリケーションにとっては、時間圧縮はとても有用なものです。Sorensonのようなコーデックは、ウェブ再生に理想的なとても小さなファイルを作るために、時間圧縮を使います。しかし、時間圧縮では、キーフレームの順番がイメージの流れを正確に示すのにとても重要なことなので、ムービーを逆再生する必要がある場合には、良い選択とは言えません。もし、時間圧縮されたムービーを逆再生するなら、フレームの初期状態を示すキーフレームの前に、その変化の記述が処理されてしまうでしょう。さらに、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メディアで作業しているのなら、あなたのムービーは、(NTSCでは)29.97フレーム/秒か、(PALでは)25フレーム/秒で記録されます。320×240のムービーの利用でさえ、NTSCなら1秒毎に9,206,784個の値を、PALなら1秒毎に7,680,000個の値をJitterは処理しなければなりません。もし処理に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圧縮されたムービーを使うことをお薦めします。