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

ショットのカタログ登録

ショットに関する情報をショット・カタログに保管することができます。 ビデオ・エクステンダーには、次の処理を行う API が用意されています。

カタログ登録されるショットは、ストーリーボードへの入力を提供します: ショット情報をショット・カタログに保管した後は (カタログがデータベースにあるか、ファイルにあるかに関係なく)、ショット関連のアプリケーションで使用することができます。 たとえば、ビデオ内のすべてのショットに関する代表フレームを入手して、ストーリーボードに表示するアプリケーションを作成することができます。

ユーザーはデータベースにショット・カタログを作成するだけでよいです: カタログをデータベースに常駐させたい場合にのみ、ショット・カタログを作成する必要があります。 ビデオ内のショットに関するデータを保管し、ファイルへの出力が必要であることを示すと、ビデオ・エクステンダーは自動的にショット・カタログ・ファイルを作成します。

カタログの作成前 (データベースのみ)

データベースにカタログを作成して使用する前に、次のことを行う必要があります。

ショット・カタログの作成 (データベースのみ)

ショット・カタログをデータベース内に作成するには、DBvCreateShotCatalog API を使用します。 (ショットに関するデータを保管し、ファイルに出力が必要であることを示すと、ビデオ・エクステンダーは自動的にショット・カタログ・ファイルを作成します。) このカタログは、ショットに関連する情報が入った表から成り立っています。 SQL を使用すれば、表の視点を照会することができます。次の表 は、視点内の列を示しています。

表 12. ショット・カタログの視点の列
列名 データ・タイプ 説明
SHOTHANDLE CHAR(36) ショット・ハンドル
VIDEOHANDLE VARCHAR(254) ビデオ・ハンドル。 この列には、ビデオが DBvOpenHandle API でオープンされている場合にだけ値が入ります。
VIDEOTABLE VARCHAR(254) ビデオが入る表。 この列には、ビデオが DBvOpenHandle API でオープンされている場合にだけ値が入ります。
VIDEOCOLUMN VARCHAR(254) ビデオが入る表の列。 この列には、ビデオが DBvOpenHandle API でオープンされている場合にだけ値が入ります。
VIDEOFILE VARCHAR(254) ビデオ・ファイルの名前。 この列には、ビデオが DBvOpenFile API でオープンされている場合にだけ値が入ります。
STARTFRAME INTEGER 開始フレームの番号。
ENDFRAME INTEGER 終了フレームの番号。
REPFRAME INTEGER 代表フレームの番号。
REPFRAMEDATA DB2IMAGE 代表フレームのデータ。
COMMENTS LONG VARCHAR 注釈。

データベースにショット・カタログをいくつ作成するか、また、各ショット・カタログにどのショットの情報を保管するかについては、いくつかの選択肢があります。 カタログを 1 つ作って、そこに多くのビデオのショット情報を保管することもできますし、別々のカタログに各ビデオのショット情報を保管することもできます。 あるいは、同じビデオの複数のショットの情報を複数のカタログに保管することもできます。

この API を使用するときは、このカタログの名前を指定する必要があります。 名前が 16 文字より長いと、超える分は切り捨てられます。 さらに、データベースに対する SQLConnect 呼び出しによって戻されるデータベース接続ハンドルを指定する必要があります。 たとえば、次のステートメントでは、ホット・ショットという名前のショット・カタログを作成します。

SQLHDBC  hdbc;
 
rc = SQLConnect(hdbc,"hotshots",SQL_NTS,id,SQL_NTS,password,SQL_NTS);
 
rc=DBvCreateShotCatalog(
                "hotshots",           /* shot catalog name */
                hdbc);                /* database connection handle */

ショット・カタログの視点の名前は、MMDBSYS.SVcatname となります。 catname はそのショット・カタログの名前です。 たとえば、カタログ名が hotshots の場合、その視点の名前は MMDBSYS.SVHOTSHOTS です。

単一のショットに関する情報の保管 (データベースのみ)

単一のショットに関する情報をショット・カタログに保管するには、DBvInsertShot API を使用します。 ショット・カタログがデータベースにある場合にのみ、ビデオ内の単一ショットに関する情報を保管することができます。このカタログに保管される情報には、次のものがあります。

ただし、ショットの注釈は保管されません。 保管されているショット情報に注釈を追加する方法については、ショットの注釈の指定 (データベースのみ)を参照してください。

DBvInsertShot API を使用するときは、ショット・カタログの名前と、ショットを指すポインターを指定する必要があります。 ショットを指すポインターをセットする唯一の方法は、ショットの入手で説明したように次のショットを入手します。 さらに、データベースに対する SQLConnect 呼び出しによって戻されるデータベース接続ハンドルを指定する必要があります。 たとえば、次のステートメントでは、フレーム 1 の後の次のショットを入手してから、そのショットに関する情報を hotshots というショット・カタログに保管します。

SQLHDBC  hdbc;
SQLHENV  henv;
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;
 
SQLAllocConnect(henv,&hdbc)
 
rc = SQLConnect(hdbc,"hotshots",SQL_NTS,id,SQL_NTS,password,SQL_NTS);
 
rc=DBvDetectShot(
       video,
       start_frame,
       &shotDetected,
       &shotCtrl,
       &shot)
        
rc=DBvInsertShot (
       "hotshots",                /*shot catalog name*/
       shot,                      /*pointer to shot*/
       hdbc);                     /*database connection handle*/

ビデオ内のすべてのショットに関する情報の保管

ビデオのすべてのショットに関する情報をショット・カタログに保管するには、DBvBuildStoryboardTable API または DBvBuildStoryboardFile API を使用します。 DBvBuildStoryboardTable API はデータベース内に常駐するショット・カタログに情報を保管します。 DBvBuildStoryboardFile API はショット・カタログ・ファイルを作成して、ショット情報をファイルに保管します。

いずれの API でも、ソース・ビデオはデータベース表またはファイルに置くことができます。

いずれかの API を使用するときは、このカタログの名前を指定する必要があります。

DBvBuildStoryboardTable API の場合にのみ、データベースに対する SQLConnect 呼び出しによって戻されるデータベース接続ハンドルも指定する必要があります。

たとえば、次のステートメントでは、ビデオのすべてのショットに関する情報をショット・カタログに保管します。 ショット・カタログはデータベースにあります。

SQLHDBC  hdbc;
SQLHENV  henv;
DBvIOType    *video;
DBvShotControl    shotCtrl;
DBvStoryBoardCtrl    sbCtrl;
 
sbCtrl>thresh1=50
sbCtrl>thresh2=500;
sbCtrl>delta=20;
 
SQLAllocConnect(henv,&hdbc)
 
rc = SQLConnect(hdbc,"hotshots",SQL_NTS,id,SQL_NTS,password,SQL_NTS);
 
rc=DBvBuildStoryboardTable (
       "hotshots",                /*shot catalog name*/
       video,                     /*pointer to video structure*/ 
       shotCtrl,                  /*pointer to shot control structure*/
       sbctrl,                    /*pointer to storyboard control structure*/
       hdbc);                     /*database connection handle*/

次のステートメントでは、ショット・カタログ・ファイルを作成して、ビデオのすべてのショットに関する情報をそのファイルに保管します。

DBvIOType    *video;
DBvShotControl    shotCtrl;
DBvStoryBoardCtrl    sbCtrl;
 
sbCtrl>thresh1=50
sbCtrl>thresh2=500;
sbCtrl>delta=20;
 
rc=DBvBuildStoryboardFile (
       "hotshots",                /*shot catalog file name*/
       video,                     /*pointer to video structure*/ 
       shotCtrl,                  /*pointer to shot control structure*/
       sbctrl);                   /*pointer to storyboard control structure*/     

ストーリーボードの作成

DBvBuildStoryboardTable API と DBvBuildStoryboardFile API は、その名前が示すように、ストーリーボードで使用される情報を保管する場合に特に便利です。 ストーリーボードは、ビデオを視覚的に要約したものです。 ストーリーボードは、ショット・カタログ内にビデオのために保管された代表フレームを表示することによって、作成することができます。

DBvBuildStoryboardTable API および DBvBuildStoryboardFile API は 1 つのショットに関して 1 つまたはそれ以上の代表フレームを保管します。 DBvStoryboardCtrl 構造に指定した値によって、1 つのショットに関していくつの代表フレームを保管し、どのフレームを使用するかを制御することができます。 DBvStoryboardCtrl 構造の定義については、ショット検出のデータ構造を参照してください。 次の図 は、DBvStoryboardCtrl フィールドの値がどのように使用されるかを示しています。

図 23. DBvStoryboardCtrl 構造内の値が使用される方法


REQTEXT


図 は次のことを示しています。

thresh1 または thresh2 の値を -1 にセットすれば、任意のショットをショート・ショットとして処理することができます。 この場合、唯一の代表フレームである中間フレームがショット・カタログのショットとして保管されます。

DBvStoryboardCtrl データ構造の値のほかに、DBvShotControl データ構造内には、後でストーリーボードに表示するためにどの代表フレームを保管するかに影響を与えるフィールドがいくつかあります。 たとえば、DBvShotControl データ構造内の CorrHistThresh、normalcorrValue、および minShotSize フィールドは、ショット検出のしきい値を指定するので、ビデオのストーリーボードにどのフレームが表示されるかに影響を与えます。 DBvBuildStoryBoardTable API と DBvBuildStoryBoardFile API を使用してストーリーボードで使用するショット情報を保管する場合、DBvStoryBoardCtrl と DBvShotControl データ構造のための初期設定値を使用して、まず試験的な実行を試みることができます。 そうしてから、これらのデータ構造の各フィールドの値を変更することによって、結果を調整することができます。

ストーリーボードの表示

ストーリーボードを表示するプログラムを作成することができます。 そのためには、ビデオに関するショット・カタログに保管されている代表フレームにアクセスします。 ビデオに関するショットを保管するために DBvBuildStoryboardFile API を使用した場合、ショット・カタログ・ファイルは代表フレームに関する GIF ファイルをポイントします。 ブラウザーを使用してこれらの GIF ファイルを表示するか、または必要に応じてプログラムを表示します。

ビデオに関するショットを保管するために DBvBuildStorybBoardTable API を使用した場合、 (データベースに保管されている) ショット・カタログには代表フレームのデータが入っています。 ショット・カタログ視点内の代表フレーム・データにアクセスすることができます (視点については、表 12 を参照してください)。 代表フレーム・データは YUV 形式です。 これは、ほとんどの画像表示プログラムでは表示できない形式です。 代表フレームを表示するためには、取り出したフレームの表示で説明した DBvFrameDatato24BitRGB API を使用してフレーム・データを変換します。 そうしておくと、ブラウザーを使用してこれらの代表フレームを表示したり、または必要に応じてプログラムを表示することができます。

ストーリーボードのサンプル・プログラム

SAMPLES サブディレクトリーには、ビデオに関するストーリーボードの作成と表示を示す 2 つのサンプル・プログラムが入っています。 一方のサンプル・プログラムはファイル makesf.exe に入っており、DBvBuildStoryBoardFile API を使用してショット・カタログ・ファイルを作成し、ショット・データをファイルに保管します。 他方のサンプル・プログラム makehtml.exe は、ショット・カタログ・ファイルにアクセスし、Web ブラウザーで表示するために HTML ページを作成します。

ショットの注釈の指定 (データベースのみ)

ショット・カタログ内のショットに他の情報とともに保管する注釈を指定することができます。 注釈を指定するには、DBvSetShotComment API を使用します。

この API を使用するときは、その注釈を保管するショット・カタログの名前、その注釈を追加する対象のショットのハンドル、そしてその注釈を指定する必要があります。 さらに、データベースに対する SQLConnect 呼び出しによって戻されるデータベース接続ハンドルを指定する必要があります。 たとえば、次のステートメントでは、ショット (フレーム番号 85 から始まる) の注釈を hotshots というショット・カタログに追加します。

SQLHDBC  hdbc;
SQLHENV  henv;
char shothandle[37];
 
SQLAllocConnect(henv,&hdbc)
 
rc = SQLConnect(hdbc,"hotshots",SQL_NTS,id,SQL_NTS,password,SQL_NTS);
 
EXEC SQL SELECT SHOTHANDLE INTO :shothandle
  FROM MMDBSYS.SVHOTSHOTS
  WHERE STARTFRAME=85;
 
rc=DBvSetShotComment (
        "hotshots",                      /*shot catalog name*/
        shothandle,                      /*shot handle*/
        "shot of beach at sunset",       /*comment*/
        hdbc);                           /*database connection handle*/

ショット・カタログに保管されているショット情報を変更する

ショット・カタログに保管されているショットの情報を変更することができます。 その場合、DBvUpdateShot API を使用します。 置き換える情報は DBvShotType 構造体に入れてください。 さらに、変更しないフィールドがある場合は、それらも指定する必要があります。 DBvUpdateShot API を使用する場合には、カタログの名前と、DBvShotType 構造体へのポインターを指定します。 さらに、データベースに対する SQLConnect 呼び出しによって戻されるデータベース接続ハンドルを指定する必要があります。

ショットの情報を変更する場合には、その情報とともに保管されている注釈 (ある場合) も変更することができます。 注釈を変更する場合には、それを DBvShotType 構造体に指定します。 古い注釈を保持する場合には、DBvShotType 構造体にヌル値を指定してください。

たとえば、次のステートメントでは、hotshots というカタログに保管されているショット情報を変更します。 このショットはフレーム番号 85 から始まります。

SQLHDBC  hdbc;
SQLHENV  henv;
char shothandle[37];
DBvShotType    shot;
DBvFrameData  fd110;
 
/* get shot handle */
 
EXEC SQL SELECT SHOTHANDLE INTO :shothandle
  FROM MMDBSYS.SVHOTSHOTS
  WHERE STARTFRAME=85;
 
/* change shot attribute */
 
shot.startFrame=110;
shot.endFrame=200;
shot.repframe=110;
shot.fd=fd110;
shot.comment=NULL;
 
/* update shot information */
 
SQLAllocConnect(henv,&hdbc)
 
rc = SQLConnect(hdbc,"hotshots",SQL_NTS,id,SQL_NTS,password,SQL_NTS);
 
rc=DBvUpdateShot (
        "hotshots",                     /*shot catalog name*/
        shot,                           /*shot information*/
        hdbc);                          /*database connection handle*/

ショット・カタログにおけるショット情報のマージ (データベースのみ)

ショット・カタログに保管されている 2 つのショットの情報を組み合わせすることができます。 ショット情報をマージする場合には、最初のショットと 2 つ目のショットを指定することによって、マージの順序を指定する必要があります。 最初のショットの開始フレーム番号が、マージしたショットの開始フレーム番号として保管されます。 最初のショットと 2 つ目のショットの間の最大フレームの番号が、マージしたショットの終了フレーム番号として保管されます。 このマージによって、最初のショットに対して保管されている情報が、マージされたショットに関する情報で置き換わります。 2 つ目のショットに対して保管されている情報は、ショット・カタログから削除されます。

ショット・カタログにおいて 2 つのショットに関する情報をマージするには、DBvMergeShots API を使用します。 この API を使用する場合には、ショット・カタログの名前と、それに続けて、マージする最初のショットと 2 つ目のショットのハンドルを指定します。 さらに、データベースに対する SQLConnect 呼び出しによって戻されるデータベース接続ハンドルを指定する必要があります。 たとえば、次のステートメントでは、hotshots というカタログに保管されている 2 つのショットのショット情報をマージします。 最初のショットはフレーム番号 85 から始まり、2 つ目のショットはフレーム番号 210 から始まります。

SQLHDBC  hdbc;
SQLHENV  henv;
char shothandle1[37];
char shothandle2[37];
 
EXEC SQL SELECT SHOTHANDLE INTO :shothandle1
  FROM MMDBSYS.SVHOTSHOTS1
  WHERE STARTFRAME=85;
 
EXEC SQL SELECT SHOTHANDLE INTO :shothandle2
  FROM MMDBSYS.SVHOTSHOTS2
  WHERE STARTFRAME=210;
 
SQLAllocConnect(henv,&hdbc)
 
rc = SQLConnect(hdbc,"hotshots",SQL_NTS,id,SQL_NTS,password,SQL_NTS);
 
rc=DBvMergeShots (
        "hotshots",                    /*shot catalog name*/
        shothandle1,                   /*shot handle for first shot*/
        shothandle2,                   /*shot handle for second shot*/
        hdbc);                         /*database connection handle*/

ショット・カタログからショット情報の削除 (データベースのみ)

ショットに関する情報をショット・カタログから削除するには、DBvDeleteShot API を使用します。 この API を使用するときは、ショット・カタログの名前と、それに続けてショット・ハンドルを指定します。 さらに、データベースに対する SQLConnect 呼び出しによって戻されるデータベース接続ハンドルを指定する必要があります。 たとえば、次のステートメントでは、hotshots というショット・カタログにあるショット (フレーム番号 85 から始まる) の情報を削除します。

SQLHDBC  hdbc;
SQLHENV  henv;
char shothandle[37];
 
EXEC SQL SELECT shothandle INTO :shothandle
  FROM mmdbsys.svhotshots
  WHERE startframe=85;
 
rc=DBvDeleteShot (
        "hotshots",                    /*shot catalog name*/
        shothandle,                    /*shot handle*/
        hdbc);                         /*database connection handle*/

ショット・カタログの削除 (データベースのみ)

ショット・カタログを削除するには、DBvDeleteShotCatalog API を使用します。 この API を使用する場合には、削除するショット・カタログの名前と、データベースに対する SQLConnect 呼び出しによって戻されるデータベース接続ハンドルを指定する必要があります。 たとえば、次のステートメントでは、ショット検出のためにオープンされていたビデオ・ファイルをクローズします。

SQLHDBC  hdbc;
SQLHENV  henv;
 
rc=DBvDeleteShotCatalog (
        "hotshots",             /*shot catalog name*/
        hdbc);                  /*database connection handle*/


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