Microsoft DirectX 8.0 |
このトピックでは、SMPTE (Society of Motion Picture and Television Engineers) タイムコードについて解説する。プロダクション環境でのタイムコードの使用方法についても説明し、外部デバイスに依存するアプリケーションで代表的なものをいくつか示す。最後に、Microsoft® DirectShow® に外部デバイス制御を実装する方法を解説し、DirectShow で VCR 制御とタイムコードに対応したフィルタを作成するために使用できるインターフェイスへのリンクを与える。
このトピックは、以下のセクションで構成される。
SMPTE タイムコードは、ポストプロダクション処理をつなぎ合わせる接着剤である。ビデオおよびオーディオのソースを識別し、トラックの自動同期を可能にし、プロダクションに関連する補助データのコンテナを提供する。このデータ ストリームを理解すると共に、メディア プロダクション、ツール開発、またはシステム設計への応用について理解することが必要になる。
SMPTE タイムコードは、正確には SMPTE タイムおよび制御コードとして知られ、ANSI/SMPTE 12-1986 で定義されている。SMPTE タイムコードは、ビデオまたはオーディオ ストリームに適用されるデジタル フレームのアドレス値、フラグ、およびその他の一連のデータである。SMPTE タイムコードの目的は、マシンが判読可能なビデオまたはオーディオのアドレスを提供することである。
SMPTE タイムコード データ構造体の最も一般的なフォーマットは、以下の情報が含まれる 80 ビットのフレームである。
DirectShow の TIMECODE_SAMPLE 構造体は、ビデオ データやオーディオ データのタイムコード情報が含まれるタイムコード データ構造体の例である。
SMPTE タイムコードには 2 つのタイプがある。アナログ オーディオ トラックにバイフェーズ マークでエンコードされた信号として記録されるタイムコードは、LTC (Linear TimeCode、以前は Longitudinal TimeCode) と呼ばれる。タイムコードの各フレームは、時間幅内の 1 つのビデオ フレーム タイムである。タイムコードのもう 1 つの一般的なタイプは、VITC (Vertical TimeCode) と呼ばれる。通常、VITC はビデオ信号の垂直同期間隔のライン 10 〜 20 の中の 2 ラインに格納される。
LTC タイムコードは、独立したオーディオ信号にエンコードされるので、録画済みのテープに簡単に追加できる。しかし、テープがポーズしていたり、超低速または超高速で動いているときは読み出すことができない。また、プロ仕様ではない VCR では 1 つのオーディオ チャンネルを消費する。
一方、VITC タイムコードは、通常速度の 0 〜 15 倍の速度で読み出すことができる。フィールドに依存するデータを含むことができ、ビデオ キャプチャ カードから読み出すこともできる。しかし、録画済みのテープに追加するのは簡単ではなく、高価なハードウェアが必要になることが多い。
SMPTE タイムコードには 2 つのモードがある。ノンドロップ フレームとドロップ フレームである。ノンドロップ フレームは、一貫して増加しているシーケンシャルなタイムコードである。リアルタイム クロックの役割を果たすことができ、ちょうど 30 フレーム/秒のフレーム レートで再生される白黒ビデオの場合にうまく機能する。
ただし、NTSC カラー ビデオは白黒テレビとの互換性の問題のために、実際には 29.97 Hz (フレーム/秒) のフレーム レートで再生される。これによって、1 時間あたり 108 フレーム (3.6 秒) の割合で実際の時間と一致しなくなり、ノンドロップ フレーム タイムコードでは問題が発生する。つまり、開始点を 00:00:00:00 とすると、1 時間の再生後にタイムコードは 00:59:56:12 になるということだ。このため、表示時間幅を計算したり、"時刻" を参照したりすると問題が発生する。
この問題の解決策は、誤差が許容できるレベルになる程度にフレームを飛ばすことである。この補正法を "ドロップ フレーム" と呼び、00、10、20、30、40、および 50 分を除いて、1 分ごとに最初の 2 つのフレームを飛ばすことで実装する。最終的に、エラーは 1 フレーム/時間未満になり、24 時間あたり 3 フレーム程度になる。
何らかの実装で両モードの混合をサポートすべきだが、現在のプロダクションではドロップ フレームの使用がさらに一般的になっている。
通常、ビデオ キャプチャと編集機能を提供するアプリケーションは、外部デバイスの制御を必要とする。これらのアプリケーションは、SMPTE タイムコードを参照して、ビデオおよびオーディオのフレームを識別し、インデックス付けをする必要がある。リニア編集システム コンピュータは、一般に 3 台以上のテープ装置とビデオ切替器を制御し、場合によってはデジタル ディスク レコーダも制御する。制御コンピュータは、正確な時期にコマンドを発行しなければならないので、ビデオテープを特定の時点で特定の場所に挿入しなければならない。
アプリケーションは以下のようなさまざまな方法でタイムコードを使用するが、方法はこれらに限定されるわけではない。
タイムコードを正しく扱えば多くのことが可能になるが、残念ながら、技術の貧弱さやハードウェアの故障のために悪くなることも多い。タイムコードが含まれるテープについては、以下のようなことに気を付けなければならない。
タイムコードは、外部のタイムコード ジェネレータや、タイムコードを生成できるキャプチャ カード、デバイス制御フィルタ自体、またはタイムコード リーダーが組み込まれている VCR などのデバイスによって生成できる。外部デバイスがタイムコードをホストに送信する場合、通常は RS-422 接続が必要である。
タイムコードが生成されたら、後で編集中にアクセスできるように、ビデオまたはオーディオと共にテーブルまたはストリーム フォーマットでタイムコードをキャプチャする必要がある。これを処理するには、以下の 2 とおりの方法がある。
1. ストリーム内のフレーム位置にインデックス付けされた、タイムコードの不連続性のリストを示すテーブルを作成し、キャプチャが完了した後で、そのテーブルをファイルの最後に書き込む。このリストは、以下のような構造体の配列になるだろう (この構造体は、DirectShow の TIMECODE_SAMPLE 構造体を簡略化したもので、例として示すだけであることに注意してほしい)。
struct { DWORD dwOffset; // フレーム内のストリームへのオフセット char[11] szTC; // オフセット位置における hh:mm:ss:ff フォーマットでのタイムコードの値 // ノンドロップの場合は hh:mm:ss。ff はドロップ フレーム用 } TIMECODE;
たとえば、タイムコード ブレークが 1 つ入ったビデオ ストリームをキャプチャしたとすると、リストは以下のようになると思われる。
{0, 02:00:00:02}, {16305, 15:21:13:29} // タイムコードはフレーム 16305 でジャンプする
このテーブルを使えば、任意のフレームのタイムコードを簡単に計算できる。
2. データをストリームとして扱い、ビデオやオーディオを書き込むようにデータをファイルに書き込む。これは、急速に変化するデータの場合に便利で、クローズドキャプション データなど、垂直同期間隔 (VBI) 内のタイムコードのないデータの場合にも便利である。
タイムコード データがそれに関連するフレーム データと共に正しく格納されたら、編集、合成、同期、または起動するアプリケーションは、よく知られた標準のインデックス システムにアクセスしてそれを使用することができる。
デバイス制御フィルタを実装すると、DirectShow で外部デバイスを制御することができる。これらのフィルタは、完全にコンピュータの外部にあり、IAMExtDevice、IAMExtTransport、IAMTimecodeGenerator、IAMTimecodeReader などのインターフェイスを公開しているデバイスやデータ ストリームを制御する。通常、外部デバイス制御フィルタはピンを公開する必要はないが、ピンを公開する外部デバイス制御フィルタの例として、VCR などのデータのソースを表すフィルタがある。VCR からキャプチャ ボードへ流れるデータを表すピン間の接続によって、デバイス制御フィルタとビデオ キャプチャ フィルタが、互いに通信してデータ型を交渉することが可能になる。ただし、これらは標準の転送を使用せず、フィルタ間に制御情報以外のデータは流れない。アプリケーションは、外部デバイス フィルタのインスタンスを生成して直接制御することができるが、フィルタ グラフのコンテキスト内では、グラフ内の唯一のフィルタである場合でもフィルタを常にインスタンス化しておくことを強くお勧めする。
外部デバイスには、VCR、ビデオ編集ステーション、オーディオ テープ レコーダ (ATR)、ミキサー、またはビデオのキャプチャや編集で使用するその他のデバイスがある。キャプチャや編集では、DirectShow の外部デバイス制御フィルタでオーディオとビデオの同期をとり、正確に制御する必要がある。再生、編集、およびキャプチャの間、外部クロックや SMPTE タイムコードによってオーディオとビデオの同期をとることができる。
外部デバイス制御を理解するには、タイムコードを理解する必要がある。タイムコードについては、基本事項として以下のことを覚えておかなければならない。
これらのことを考えると、デバイス制御には 2 つの根本的な問題がある。第 1 に、さまざまなメーカーのさまざまなデバイス用に、何百種類もの通信プロトコルが存在する。VCR やレーザー ディスク プレーヤーのように、ほかのデバイスより広く使用されているものもあるが、ほぼすべてのデバイスが異なるリモート コントロール インターフェイスを持っている。さらに洗練されたプロ仕様のビデオおよびオーディオ アプリケーションが小型化するにつれて、この問題はますます大きくなっている。これら無数のプロトコルのために、制御する外部デバイスごとに別々の DirectShow フィルタを実装しなければならない。
第 2 に、プロ仕様のビデオおよびオーディオ システムの設計では、イベントが正確な時点で発生しなければならないという問題がある。この問題の概要を見るために、次のタイミング図を考えてみよう。
水平軸はビデオ フィールド内の時間を示す。NTSC ビデオの場合、これは約 1/60 秒である。ここで重要なのは、すべての信号が時間順に並んでいること、すなわちタイムコードはフレームの先頭から開始される点である (システム フレーム パルス)。テープ装置などの外部デバイスは、AVI 対応アプリケーションから実行された AVI ファイルなどのデジタル ビデオ再生と共に、システム基準によって並べられる。
このタイミング要件に適合させるにはさまざまな方法があるが、最も一般的なのは、システム内のすべてのコンポーネントにマスター基準信号を配布する方法である。この基準は、ビデオの世界では"ブラックバースト"として知られ、ブラック レベルを超えるアクティブなビデオが含まれないコンポジット ビデオ信号であることからこう呼ばれる。名前の "バースト" の部分は、ビデオ信号のカラー バースト部分を指している。この基準に接続された各デバイスは、自身の同期を維持しなければならない。すなわち、デジタル ビデオ プレーヤーは垂直同期間隔間にフレームを切り換えなければならず、テープ装置は垂直同期間隔間は録画モードに切り換えなければならず、シリアル ポートを通じて外部デバイスに送信されるコマンドはフレーム パルスに合わせなければならない。そして、これらすべてとその他の同期イベントは、SMPTE タイムコードに定義済みの値が現れたときに発生しなければならない。これらの規則に適合させられなければ、ビデオ画像にテアリングが発生したり、具合の悪いときに編集が発生したりする。
プロ仕様のビデオの世界でこれを実現するのは比較的簡単だが、混成されたデスクトップ ビデオの世界では実現は非常に難しい。
これまでに与えた考え方に基づき、次の 2 つの設計例に外部デバイスの設定を示す。
これらのブロック図を見れば、すべてのボックスに基準信号を配布するのは比較的簡単であることがわかる。たとえば、タイムコード リーダーとデジタル ビデオ プレーヤーの間など、コンピュータ内部で行われる同期を扱うには、オペレーティング システムの専用サービスである "垂直駆動" のハードウェア割り込み、またはその他のカスタム ソリューションを使用することをお勧めする。
最後に、外部デバイスを制御するフィルタを書く場合は、IAMExtDevice および IAMExtTransport インターフェイスを実装しなければならない。フィルタがタイムコードを読み込んだり生成したりする場合は、DirectShow が提供するインターフェイス、IAMTimecodeReader、IAMTimecodeGenerator、および IAMTimecodeDisplay も実装しなければならない。さらに、外部デバイスのマイクロプロセッサ用の実行モジュール コードをダウンロードして実行する場合のように、外部デバイスとの間でバイナリ メッセージをやりとりすることが必要な場合は、COM IDataObject インターフェイスを実装することでそれを行わなければならない。このインターフェイスには、バイナリ データの転送を扱うためのメソッドがすべて揃っている。フィルタに必要な独自のデータ転送には、このインターフェイスを使用する。
SMPTE タイムコードと外部デバイス制御の補足資料としては、以下のようなドキュメントがある。
SMPTE の規格とリプリントは、(914) 761-1100 (米国) に電話すると SMPTE から入手できる。