Q: 私のプログラムでは、オーディオファイルを QuickTime ムービーとして開き、ムービーのループ状態の属性を設定してから再生を開始するようになっています。これはすべてうまく行き、オーディオムービーは正しくループします(終了すると自動的にもう一度開始します)が、ムービーが終了して開始するときに、ごく短い一時停止が発生します。この一時停止を修正する方法はありますか。
A: これは、QuickTime の既知の問題です(r. 3792717)。短いオーディオの場合に、この問題が発生することがあります。
回避策は、一時的なムービーを作成し、この一時ムービー内にオーディオソースへの複数の参照を追加することです(QuickTime では、ムービー内の同じオーディオデータを複数回参照することができます)。次に、一時ムービーを再生するときに、単に同じオーディオファイルへの参照を何度も再生します。これにより QuickTime は一時停止なしで非常にスムーズに実行します。
各参照には、データのコピーではなく、実際のデータへのポインタのみが含まれているため、複数の(数百個もの)参照をこの方法でソースオーディオファイルに追加しても、ムービーファイルが大きくなることはありません。
ムービーが終了すると、当然一時停止は発生しますが、ムービーに同じオーディオファイルへの数百個の参照が含まれていれば、その一時停止が発生するのは、オーディオを数百回繰り返した後になります。
下記のコードは、元のオーディオファイルへの複数の参照が含まれている一時ムービーの作成方法を示しています。
リスト 1. オーディオファイルへの複数の参照が含まれている一時ムービーの作成
// 一時ムービーを追加する、オリジナルのオーディオファイルへの
// 参照の数を指定
#define kRefCount 30
//
// createAudioRefMovie
//
// このコードは、指定されたオーディオファイルへの
// 複数の参照を含む一時ムービーを
// 作成する
//
// 入力:
//
// srcAudioFilePath
// - QT が認識する任意のオーディオファイル(たとえば MP3)
// へのフルパス
//
// 出力:
//
// - srcAudioFilePath パラメータに
// 指定されたオーディオファイルへの
// 複数の参照が含まれている、新しい
// ムービーが関数から返される
Movie createAudioRefMovie(CFStringRef srcAudioFilePath)
{
Movie tempMovie, srcMovie;
TimeValue srcMovDuration;
OSErr err = noErr;
Handle audioFileDataRef;
OSType audioFileDataRefType;
short i, resID = 0;
assert(srcAudioFilePath != nil);
// オーディオソースファイルのための
// QuickTime データ参照を作成する
err = QTNewDataReferenceFromFullPathCFString (
srcAudioFilePath,
kQTNativeDefaultPathStyle,
0,
&audioFileDataRef,
&audioFileDataRefType );
assert(err == noErr);
// オーディオファイルのデータ参照を使って、
// オーディオファイルの QuickTime ムービーを作成する
err = NewMovieFromDataRef (
&srcMovie,
newMovieActive,
&resID,
audioFileDataRef,
audioFileDataRefType );
assert(err == noErr);
// ムービーを初期化する
tempMovie = nil;
// 一時ムービーを作成する -- このムービーに
// オーディオファイルへの参照を追加する
tempMovie = NewMovie(newMovieActive);
assert(tempMovie != nil);
srcMovDuration = GetMovieDuration(srcMovie);
// オーディオファイルへの複数の参照を追加する
// 注記:
// BeginMediaEdits/EndMediaEdits を呼び出さないことで、
// QuickTime に実際のデータをコピーするのではない
// ことを伝える -- これにより、データへの小さな参照だけ
// が提供される
for (i = 0; i < kRefCount; ++i)
{
// ソースオーディオファイルへの参照を
// 一時ムービーに追加する
err = InsertMovieSegment (
srcMovie, // 作成したオーディオファイル
tempMovie, // 一時ムービー
0,
srcMovDuration,
GetMovieDuration(tempMovie) );
assert(err == noErr);
}
// 完全を期すために、ソースファイルからムービーの
// 設定をコピーする
err = CopyMovieSettings(srcMovie, tempMovie);
assert(err == noErr);
return tempMovie;
}
ドキュメントの改訂履歴
掲載日: 2004-09-08
|