高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1371
Avoiding Pauses When Looping Audio files with QuickTime

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最初のバージョン

掲載日: 2004-09-08