イメージ、オーディオ、およびビデオ・エクステンダー 管理およびプログラミングの手引き

ショットまたはフレームの入手

ビデオ・エクステンダーを使用して、ビデオのショットやフレームを得ることができます。 ショットやフレームを入手する前に、ビデオをオープンして、ショットを検出できるようにする必要があります。 ビデオ・エクステンダーは、索引を使ってフレームやショットにアクセスします。 ショットやフレームを入手するためには、そのビデオの索引を作成する必要があります。

ビデオをオープンし、索引を作成したら、そのビデオ内の次のショットやフレームを入手したり、フレーム番号別に特定のフレームを入手したりできます。 ビデオ・エクステンダーは MPEG-1 型式のビデオ・クリップを処理することができます。 RGB 型式を必要とするプログラムで検索したフレームを使用する計画がある場合は、ビデオ・エクステンダー API を使用してフレームをその型式に変換することができます。

ショット検出のためにビデオをオープンする

データベース表に保管されているビデオをオープンするには、DBvOpenFile API を使用します。 そのファイルは、クライアントからアクセス可能でなければなりません。 データベース表に保管されているビデオをオープンするには、DBvOpenHandle API を使用します。 アプリケーションは、まずそのデータベースに接続する必要があります。 ビデオがデータベース表に保管されている場合には、ビデオ・エクステンダーはそのビデオを一時ファイルにコピーします。 この一時ファイルは、クライアント環境変数 DB2VIDEOTEMP によって指定されるディレクトリーにあります。 ビデオをオープンすると、ショット検出のためにビデオが初期設定されます。 ビデオ・エクステンダーは、ポインターをビデオの始め (つまり、フレーム 0) にセットします。

これらの API のどちらかを使用する際には、ビデオ・データ構造 (DBvIOType) へのポインターが入っている区域をポイントしなければなりません。 API 呼び出しの応答として、ビデオ・エクステンダーは、この構造体を割り当て、ここにそのビデオに関する情報を保管します。 さらに、この構造体は、現行フレームのピクセル内容をもつフレーム・データ構造 (DBvFrameData) をポイントします。 これらの構造体の説明については、ショット検出のデータ構造を参照してください。 DBvOpenFile API の場合は、ビデオ・ファイルの名前も指定する必要があります。 DBvOpenHandle API の場合は、ビデオ・ハンドルをさらに指定する必要があります。

たとえば、次のステートメントでは、ファイルに保管されているビデオをショット検出のためにオープンします。

DBvIOType    *videoptr;
 
rc=DBvOpenFile (
       &videoptr,                        /* pointer to video structure pointer */
       "/employee/video/rsmith.mpg");    /* video file */

次のステートメントでは、データベース表に保管されているビデオをショット検出のためにオープンします。

EXEC SQL BEGIN DECLARE SECTION;
char Vid_hdl[251];
EXEC SQL END DECLARE SECTION;
 
DBvIOType    *videoptr;
 
EXEC SQL SELECT VIDEO INTO :Vid_hdl
FROM EMPLOYEE
WHERE NAME="Anita Jones";
 
rc=DBvOpenHandle(
       &videoptr,                         /* pointer to video structure pointer */
       vid_hdl);                          /* video handle*/

ビデオの索引付け

ビデオ・エクステンダーは、索引を使ってビデオのフレームやショットにアクセスします。 ビデオからショットやフレームを入手する前に、そのビデオの索引を作成する必要があります (MPEG 形式はフレームとショットの索引を備えていません)。 索引は、フレーム番号を、MPEG-1 ビデオを表すビット・ストリームにマップします。

DBvCreateIndexFromVideo API または DBvCreateIndex API を使用することにより、ビデオの索引を作成することができます。 しかし、DBvOpenFile API または DBvOpenHandle API を使用してショット検査のためにビデオをオープンした場合は、索引を明示的に作成する必要はありません。 ビデオ・エクステンダーが自動的に索引を作成してくれるからです。 (ビデオをオープンする方法については、ショット検出のためにビデオをオープンするを参照してください。)

索引が (明示的または自動的に) 作成されると、DB2 ビデオ・エクステンダーはその索引をビデオ・ファイルと同じパスに保管しようとします。 まず最初に、索引ファイルを fname.ext.idx (fname はビデオ・ファイルの名前で、ext はビデオ・ファイルの拡張子) という名前で保管しようとします。 これに失敗すると、ビデオ・エクステンダーは索引ファイルを fname.idx という名前で、ビデオ・ファイルと同じディレクトリーに保管しようとします。 これにも失敗すると、索引ファイルをローカル・ディレクトリーに、最初は fname.ext.idx という名前で、次には fname.idx という名前で保管しようとします。

ファイルがオープンしているときには、ビデオ・エクステンダーは次の順序で索引ファイルを探します。

  1. 書き込み可能バージョンの索引ファイル。
  2. ビデオ・ファイルと同じパスにある索引ファイル、続いて現行ディレクトリー内の索引ファイル。
  3. fname.ext.idx という名前の索引、続いて fname.idx という名前をもつもの (fname はビデオ・ファイルの名前で、ext はビデオ・ファイルの拡張子)。

たとえば、myvideo.mpg という名前のビデオ・ファイルの索引を作成した場合、まずビデオ・エクステンダーはこのビデオ・ファイルと同じパスで myvideo.mpg.idx という名前の書き込み可能な索引を探します。

DBvCreateIndexFromVideo API を使用するときは、DBvIOType データ構造を指定します。 ビデオ・エクステンダーは、索引ファイルの名前を構造に保管します。 この構造については、ショット検出のデータ構造を参照してください。 たとえば、次のステートメントでは、ショット検出のためにすでにオープンしたビデオのための索引を作成します。

DBvIOType    *video;
 
rc=DBvCreateIndexFromVideo(
       video);                  /* pointer to video structure */
 

DBvCreateIndex API を使用するときは、ビデオ・ファイルの名前を指定してください。 ビデオ・エクステンダーは、その索引を (そのビデオがあるのと同じディレクトリーの) ファイルに保管します。 たとえば、次のステートメントでは、ビデオ・ファイルのための索引を作成します (ファイルはショット検出のためにあらかじめオープンされていません)。

rc=DBvCreateIndex(
       "/employee/video/rsmith.mpg");    /* video file */

さらに、ビデオの索引が存在するかどうかを判断することもできます。 索引があるかどうかを検査するには、DBvIsIndex API を使用します。 この API によって、ビデオのための索引がなければ 0 が、索引があれば 1 が状況変数にセットされます。 たとえば、次のステートメントでは、ビデオ・ファイルの索引があるかどうかを検査します。

short  *status
 
rc=DBvIsIndex(
       "/employee/video/rsmith.mpg",     /* video file */
       &status);                         /* status indicator */

ビデオ索引のバックアップ: 回復しなければならないときに備えて、ビデオ索引ファイルのバックアップを取ります。 このファイルは、ビデオ・エクステンダーがインストールされているのと同じディレクトリーにあります。

フレームの入手

ビデオ内の現行フレームを入手することができます。 さらに、現行フレームを特定のフレーム番号にセットすることもできます。 ビデオ内の現行フレームを入手するには DBvGetFrame API を使用します。 特定のフレーム番号に現行フレームをセットするには DBvSetFrameNumber API を使用します。

DBvGetFrame API を使用するときは、ビデオ構造を指定します。 たとえば、次のステートメントでは、ビデオ内の現行フレームを入手します。

DBvIOType    *video;
 
rc=DBvGetFrame(
       video);                  /* pointer to video structure */

DBvSetFrameNumber API を使用する場合、ビデオ構造および現行フレームとしてセットしたいフレームの番号を指定します。 たとえば、次のステートメントは、現行フレームをフレーム番号 85 にセットしてから、そのフレームを入手します。

DBvIOType    *video;
 
rc=DBvSetFrameNumber(
       video,                   /* pointer to video structure */
       85);                     /* frame number */ 
 
rc=DBvGetFrame(
       video);                  /* pointer to video structure */

出力のとき、DBvSetFrameNumber API は DBvIOType 構造内の currentFrame フィールドをリセットします。 DBvGetFrame API は、フレームのピクセル内容を DBvFrameData 構造に入れます。 これらの構造の説明については、ショット検出のデータ構造を参照してください。

ショットの入手

ビデオの次のショットを入手するには、DBvDetectShot API を使用します。 DBvDetectShot API を使用する場合には、次のデータ構造をポイントする必要があります。

さらに、探索を開始するフレームをポイントする必要があります。 ビデオ・エクステンダーは、ビデオ内のその地点から次のショットの探索を開始します。

API からの結果として、ビデオ・エクステンダーは、shotDetected フラグをセットし、次のショットに関する開始フレームとそのフレーム・データをポイントします。 shotDetected フラグが 1 にセットされている場合は、ショットが検出されたことを示します。 この場合、ビデオ・エクステンダーは次のようにします。

shotDetected フラグが 0 にセットされている場合は、ショットが検出されなかったことを示します。 この場合、ビデオ・エクステンダーは、ビデオの最後に到達したことを示すコードを戻します。

これらの構造の説明については、ショット検出のデータ構造を参照してください。

たとえば、次のステートメントでは、ビデオの次のショットを要求します。

DBvIOType    *video;
long start_frame = 1;
char shotDetected = 0;
DBvShotControl    shotCtrl;
DBvShotType    shot;
 
shotCtrl>method=DETECT_CORRHIST
shotCtrl>normalCorrValue=60;
shotCtrl>sceneCutSkipXY=1;
shotCtrl>CorrHistThresh=10;
shotCtrl>DissThresh=10;
shotCtrl>DissCacheSize=4;
shotCtrl>DissNumCaches=7;
shotCtrl>minShotSize=0;
 
rc=DBvDetectShot(
       video,              /* pointer to video structure */
       start_frame,        /* starting frame for search */
       &shotDetected,      /* shot detected flag */
                           /* 1=detected, 0=not detected */
       shotCtrl,           /* pointer to shot control structure */
       &shot);             /* pointer to shot type structure */       

取り出されたフレーム形式の変換

MPEG-1 フレームの内容は YUV 形式です。 これは、フレームの明度ピクセル・プレーン、Cr ピクセル・プレーン、Cb ピクセル・プレーンの情報を含む形式です。

このビデオ・フレームを編集する場合には、フレームの形式を YUV から RGB へ変換した方が便利な場合があります。 ビデオ・エクステンダーには、取り出された MPEG-1 フレームを YUV 形式から 24 ビットの RGB 形式に変換する DBvFrameDatato24BitRGB API が用意されています。 この API を使用する場合には、まずターゲット・バッファーを割り当ててください。

この API を出すときは、ターゲット・バッファーと、変換したいフレーム・データをポイントする必要があります。 さらに、フレームの高さと幅を指定します。 (フレームのデータ、高さ、幅は、そのフレームの DBvIOType 構造体から入手することができます。) たとえば、次のステートメントでは、MPEG-1 フレームを 24 ビットの RGB 形式に変換します。

char RGB[18000];
DBvIOType      *video;
DBvFrameData   fd;
 
rc=DBvGetNextFrame(
       video);                  /* pointer to video structure */
 
fd=video.fd
dx=video.dx
dy=video.dy
 
rc=DBvFrameDataTo24BitRGB (
       RGB,                      /* pointer to target buffer */
       &fd,                      /* pointer to frame data */
       dx,                       /* frame width */
       dy);                      /* frame height */

ビデオ・ファイルのクローズ

ショット検出のためにオープンしたビデオ・ファイルをクローズするには、DBvClose API を使用します。 API を使用するときは、ファイルのビデオ構造を指すポインターを指定する必要があります。

たとえば、次のステートメントでは、ショット検出のためにオープンされていたビデオ・ファイルをクローズします。

DBvIOType    *video;
 
rc=DBvClose (video);

取り出したフレームの表示

取り出される MPEG-1 フレームの内容は YUV 形式です。 これは、ほとんどの画像表示プログラムが表示できる形式ではありません。 取り出されるビデオ・フレームを表示するには、画像表示プログラムが認識できる形式 (たとえば、BMP 形式) に変換する必要があります。 たとえば、MPEG-1 フレームを表示するには、次のようにします。

  1. DBvFrameDatato24BitRGB API を使って、取り出された MPEG-1 フレームを YUV 形式から 24 ビットの RGB 形式に変換する。 DBvFrameDatato24BitRGB API の使い方については、取り出されたフレーム形式の変換を参照してください。
  2. 変換したフレームに適切なヘッダーを付加する。 たとえば、BMP 形式では、画像の高さや幅などの情報をもつヘッダーが必要です。
  3. フレーム内容 (とそのヘッダー) をファイルへコピーする。
  4. DBiBrowse API を使って、そのファイルを表示する。 DBiBrowse API の使い方については、表示 / 再生 API の使用を参照してください。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]