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
|