Q: QuickTime 6 でムービーツールボックス関数の GetMovieNextInterestingTime を使って、MPEG ムービーのフレームをカウントしていますが、うまく動作していないようです。この関数の初回の呼び出しの結果は、サンプルの表示時間がゼロ、再生時間がムービー全体の再生時間になってしまいます。MPEG ムービーのトラックのフレーム数を調べるには特別なコードを書く必要があるのでしょうか。
A: GetMovieNextInterestingTime はあらゆる種類のトラックで動作します。ただしフレーム数を調べる場合は、nextTimeMediaSample フラグを使用しないでください。単一のメディアサンプルに複数のフレームを保存するメディアがあるためです(たとえば、MPEG と Flash など)。個別のフレーム時間を調べる場合は、GetMovieNextInterestingTime に nextTimeStep フラグを渡してください。
また、MPEG メディアについては、QuickTime 6 における不具合(r. 3236091)のため、GetMovieNextInterestingTime を呼び出してこの方法でフレーム数をカウントする前に、最初にムービーをタスク化する必要があります。下のコードに、この仕組みを示します。
#include <QuickTime/QuickTime.h>
long GetFrameCount (Movie theMovie)
{
long frameCount = 0;
TimeValue curMovieTime;
if (theMovie == NULL) goto bail;
// QuickTime 6 の不具合のため、最初に
// ムービーをタスク化する必要がある
MoviesTask( theMovie, 0 );
curMovieTime = 0;
while( curMovieTime >= 0 )
{
GetMovieNextInterestingTime(theMovie,
nextTimeStep,
0, NULL,
curMovieTime,
fixed1,
&curMovieTime,
NULL );
frameCount++;
}
// ムービーの最後に余分な時間をとる
// ステップがある
frameCount--;
bail:
return(frameCount);
}
|
|
リスト 1 MPEG ムービーのフレーム数のカウント
|
さらに、断続的なコマ取りではなく、一定時間内に滑らかに起こる変化を記述するのにつなぎ効果が使用できる点に注意してください。たとえば、2 つのビデオソース間のワイプ効果では、開始時点から終了時点までの各コマには何枚もの出力イメージが生成されます。このような場合「フレーム数はいくつ」という問いはあまり有益とはいえません。なぜなら、その答えは「好きなだけ」となってしまうからです。
[2003 年 5 月 2 日]
|