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

Technical Q&A QA1341
Creating a Movie from Movie Data in Memory

Q:NewMovieFromFile API を使用すればムービーファイルからムービーを作成することが可能ですが、メモリ上にあるムービーデータからムービーを作成するにはどうすればよいのでしょうか。

A:それには、QuickTime データ参照を使用します。

単純にハンドルデータ参照またはポインタデータ参照を使ってデータをラップし、NewMovieFromDataRef API を使用してムービーを作成します。通常どおりにムービーを再生または使用したら、ムービー、データ参照、およびデータを破棄します。

また、扱うデータの種類が分かっていれば(たとえば、MP3)、メディアタイプを示す適切なデータ参照拡張を追加します。QuickTime はこの情報に基づいて、使用するムービーインポータを探します。

テクニカルノート TN1195「Tagging Handle Data References in QuickTime 4」で、参照拡張を詳しく説明しています。

リスト 1 のコードは、NSData データバッファに格納されているデータ(この例では、MP3 データ)のためのポインタデータ参照を作成する方法を示します。QuickTime で使用するムービーインポータを簡単に知ることができるように、ファイル名に対するデータ参照拡張もデータ参照に追加しています。createPointerDataRefWithExtensions のルーチンは、テクニカルノート TN1195「Tagging Handle Data References in QuickTime 4」に由来します。

ポインタデータ参照の作成後、参照を NewMovieFromDataRef に渡してムービーを作成しています。

リスト 1. NSData データバッファに基づく、ポインタデータ参照を使用したムービーの作成

//
// LoadAndPlayMovieFromNSData
//
// 渡された NSData データバッファに基づいてポインタデータ参照を
// 作成した後に、データに基づくムービーを作成する。
// 任意で、ムービー作成の前に、データ参照に対して
// ファイル名データ参照を追加する。
//
//
// パラメータ
//
//   data             インポートするデータが格納されている
//                    データバッファ
//   fileName         元のファイル名が分かっている場合には、
//                    QuickTime がデータに対応するムービーインポータを
//                    探し出せるように、そのファイル名をここで
//                    渡す。

void LoadAndPlayMovieFromNSData(NSData *data, NSString *fileName)
{
    Str255 fileName255;
    Handle ptrDataRef = NULL;
    Movie newMovie = NULL;
    
    c2pstrcpy(fileName255, [fileName UTF8String]);
    ptrDataRef = createPointerDataRefWithExtensions(
                         [data bytes],          /* データへのポインタ */
                         (Size)[data length],   /* データサイズ */
                         fileName255,           /* ファイル名 */
                         0,                     /* ファイルタイプ */
                         nil                    /* MIME タイプ文字列 */
                         );
    if (ptrDataRef)
    {
        short id = 0;
        OSErr err = noErr;
        
           /* ここで、データ参照に基づいてムービーを作成する */
        err = NewMovieFromDataRef(&newMovie,
                                  newMovieActive,
                                  &id,
                                  ptrDataRef,
                                  PointerDataHandlerSubType);
        if (err == noErr)
        {
            // ...ここでムービーを再生したり操作したりする

            // 終了したら後始末をする
            DisposeMovie(newMovie);
        }
    
        DisposeHandle(ptrDataRef);

    }
}

同様に、リスト 2 のコードは、ファイル名に対応するデータ参照拡張のほかに、MP3 データブロックへのポインタに基づいてポインタデータ参照を作成する方法を示します。この場合も、ポインタデータ参照を NewMovieFromDataRef に渡してムービーを作成しています。

リスト 2. ポインタデータ参照を使用したムービーの作成

//
// createMovieFromMemory
//
// ムービーデータへのポインタを渡されると、ポインタデータ参照を
// 作成した後に、そのデータ参照を NewMovieFromDataRef に渡して
// ムービーを作成します。
//
// パラメータ
//
//   data             ムービーデータへのポインタ
//   dataSize         データポインタによって指定された
//                    ムービーデータの実際のサイズ
//   fileName         元のファイル名が分かっている場合には、
//                    QuickTime がデータに対応するムービーインポータを
//                    探し出せるように、そのファイル名をここで
//                    渡す。ファイル名を指定したくない場合には、
//                    nil を渡す。


void createMovieFromMemory(void     *data,
                            Size    dataSize,
                            Str255  fileName)
{
    Handle myDataRef = NULL;

    myDataRef = createPointerDataRefWithExtensions(
                    data,       /* データへのポインタ */
                    dataSize,   /* データのサイズ */
                    fileName,   /* ファイル名 */
                    0,          /* ファイルタイプ */
                    nil);       /* MIME タイプ */
                                
    if (myDataRef)
    {
        OSErr err       = noErr;
        short id        = 0;
        Movie newMovie  = NULL;
        
        err = NewMovieFromDataRef(
                              &newMovie,
                              newMovieActive,
                              &id,
                              myDataRef,
                              PointerDataHandlerSubType);
        if (err == noErr)
        {
            // ... ここでムービーを再生したり操作したりする
            
            // ムービーを使用し終わったら後始末をする
            
            DisposeMovie(newMovie);
        }
        
        // 他のクリーンアップ処理
        DisposeHandle(myDataRef);
    }
}

最後に、リスト 3 のコードは、リスト 2 と同じデータ参照拡張のほかに、ハンドルの MP3 データに対応するハンドルデータ参照を作成する方法を示します。ここでも、createHandleDataRefWithExtensions のルーチンは、テクニカルノート TN1195「Tagging Handle Data References in QuickTime 4」に由来します。

リスト 3. ハンドルデータ参照を使用したムービーの作成

//
// createMovieFromHandleMemory
//
// ムービーデータへのポインタを渡されると、ポインタデータ参照を
// 作成した後に、そのデータ参照を NewMovieFromDataRef に渡して
// ムービーを作成します。
//
// パラメータ
//
//   data             ムービーデータへのポインタ
//   dataSize         データポインタによって指定された
//                    ムービーデータの実際のサイズ
//   fileName         元のファイル名が分かっている場合には、
//                    QuickTime がデータに対応するムービーインポータを
//                    探し出せるように、そのファイル名をここで
//                    渡す。ファイル名を指定したくない場合には、
//                    nil を渡す。


void createMovieFromHandleMemory(Handle     dataHandle,
                                 Str255     fileName)
{
    Handle myDataRef = NULL;

    myDataRef = createHandleDataRefWithExtensions(
                        dataHandle,     /* データハンドル */
                        fileName,       /* ファイル名 */
                        0,              /* ファイルタイプ */
                        nil,            /* MIME タイプ */
                        nil,            /* 初期化データ */
                        0);             /* 初期化データのバイト数 */

    if (myDataRef)
    {
        OSErr err       = noErr;
        short id        = 0;
        Movie newMovie  = NULL;
        
        err = NewMovieFromDataRef(
                              &newMovie,
                              newMovieActive,
                              &id,
                              myDataRef,
                              HandleDataHandlerSubType);
        if (err == noErr)
        {
            // ... ここでムービーを再生したり操作したりする
            
            // ムービーを使用し終わったら後始末をする
            
            DisposeMovie(newMovie);
        }
        
        // 他のクリーンアップ処理
        DisposeHandle(myDataRef);
    }
}

掲載日: 2004-05-20

ドキュメントの改訂履歴

日付メモ
2004-05-20最初のバージョン

掲載日: 2004-05-20