第 14章GStreamer におけるクロック

パイプライン再生で同期を取るため (パイプライン再生は同期を取ることが実際に問題となる唯一のケースです)、GStreamer ではさまざまなクロックを使用します。クロックを公開するのは一部のエレメントで、その他のエレメントは単にクロックスレーブです。クロックの第一の役割は、クロックを公開しているエレメントに従い、その再生レートに基づいて時間の進行状況を表すことです。パイプライン内に利用可能なクロックプロバイダが1つもない場合は、システムクロックが代わりに使われます。

GStreamer は、クロックと再生状態からさまざまな時間を引き出します。注意しておく必要があるのは、クロック時間 (clock-time) は単調増加する点、ただしその値自体には意味がない点です。クロック時間からベース時間 (base-time) を差し引くと、実行時間 (running-time) になります。実行時間は、始めから終わりまでオリジナルレートで再生を行った場合のストリーム時間 (stream-time) と同じです。ストリーム時間は、メディア内での位置を表します。

図 14-1. GStreamer のクロックとさまざまな時間

14.1. クロックプロバイダ

クロックプロバイダはあるレートでメディアを再生しますが、このレートは必ずしもシステムクロックのレートと同じではありません。この点に、クロックプロバイダの存在理由があります。たとえば、サウンドカードが 44.1 kHz で再生を行ったとします。この場合、システムクロックで正確に 1 秒後に、サウンドカードが 44.100 のサンプルを再生しているかというと、必ずしもそうではありません。これは近似的に真であるにすぎません。したがって一般的に、音声出力を伴うパイプラインでは、audiosink をクロックプロバイダとして使います。こうすることによって、サウンドカードが 1 秒分の音声を再生するのと同じレートで、1 秒分の動画を再生することができます。

パイプラインのいずれかの部分で現在のクロック時間を知る必要がある場合には、gst_clock_get_time () を呼び出してクロックからクロック時間を要求することができます。クロック時間は 0 からスタートする必要はありません。パイプラインには、そのパイプライン内のすべてのエレメントが使用するグローバルクロックが含まれており、そのほかに"ベース時間"というものを持っています。ベース時間は、ゼロからスタートするメディア時間のスタート地点におけるクロック時間のことです。このタイムスタンプがクロック時間から差し引かれ、その結果得られた値が _get_time () によって返されます。

クロックプロバイダは、クロック時間が可能な限り現在のメディア時間に近い値を表すようにする役割を果たします。クロックプロバイダは、再生遅延、オーディオカーネルモジュールにおけるバッファリングといったさまざまなことがらを管理します。これらはいずれも、音声と動画の同期に影響を及ぼす可能性があり、したがってユーザーの操作感を損なうおそれがあるからです。