ショットに関する情報をショット・カタログに保管することができます。 ビデオ・エクステンダーには、次の処理を行う API が用意されています。
カタログ登録されるショットは、ストーリーボードへの入力を提供します: ショット情報をショット・カタログに保管した後は (カタログがデータベースにあるか、ファイルにあるかに関係なく)、ショット関連のアプリケーションで使用することができます。 たとえば、ビデオ内のすべてのショットに関する代表フレームを入手して、ストーリーボードに表示するアプリケーションを作成することができます。
ユーザーはデータベースにショット・カタログを作成するだけでよいです: カタログをデータベースに常駐させたい場合にのみ、ショット・カタログを作成する必要があります。 ビデオ内のショットに関するデータを保管し、ファイルへの出力が必要であることを示すと、ビデオ・エクステンダーは自動的にショット・カタログ・ファイルを作成します。
データベースにカタログを作成して使用する前に、次のことを行う必要があります。
データベースにショット・カタログを作成したり、それに対して操作を行ったりする前に、SQLConnect 呼び出しを使って、そのデータベースに接続しなければなりません。 (SQLConnect は DB2 コール・レベル・インターフェースの呼び出しです。) この呼び出しは、ショット・カタログを管理する API に指定する必要がある接続ハンドルを戻します。
ショット・カタログをデータベース内に作成するには、DBvCreateShotCatalog API を使用します。
(ショットに関するデータを保管し、ファイルに出力が必要であることを示すと、ビデオ・エクステンダーは自動的にショット・カタログ・ファイルを作成します。)
このカタログは、ショットに関連する情報が入った表から成り立っています。
SQL を使用すれば、表の視点を照会することができます。次の表 は、視点内の列を示しています。
列名 | データ・タイプ | 説明 |
---|---|---|
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 構造内の値が使用される方法
![]() |
図 は次のことを示しています。
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*/