IBM Books

Image Extender、Audio Extender 和 Video Extender 管理和程序设计

编目镜头

可将关于镜头的信息存储在镜头目录中。Video Extender 提供了一些 API 来:

已编目的镜头提供故事板的输入:在镜头目录中存储镜头信息之后(无论该目录是在数据库中还是在文件中), 可在与镜头相关的应用程序中使用该信息。例如,可创建一个应用程序,它获取视频中所有镜头的有代表性帧, 并在故事板中加以显示。

只需创建数据库的镜头目录:仅当您想让目录驻留在数据库中时,才需要创建镜头目录。当您存储视频中镜头的数据,并指示要在文件中进行输出时, Video Extender 自动创建镜头目录文件。

在创建目录之前(仅数据库)

在数据库中创建和使用目录之前,必须:

创建镜头目录(仅数据库)

使用 DBvCreateShotCatalog API 在数据库中创建镜头目录。(当存储镜头的数据,并指示要在文件中进行输出时,Video Extender 将自动创建镜头目录文件。)该目录由存储与镜头相关的信息的多个表组成。可通过使用 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 注解

您可灵活地决定在数据库中创建多少镜头目录, 以及在每个镜头目录中存储哪些镜头的信息 可创建一个目录来存储许多视频的镜头信息、 将每个视频的镜头信息存储在独立目录中、 或将视频中多个镜头的信息存储在多个目录中。

使用此 API 时,需要指定目录的名称。超过 16 个字符的名称将被截断。还需要指定 SQLConnect 调用返回给数据库的数据库连接句柄。例如,下列语句创建一个名为 hotshots 的镜头目录:

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 时,都需要:

还需要指定 SQLConnect 调用返回给数据库的数据库连接句柄 (仅对于 DBvBuildStoryboardTable API)。

例如,下列语句在镜头目录中存储视频中所有镜头的信息。镜头目录位于数据库中。

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 存储镜头的一个或多个有代表性帧。在 DBvStoryboardCtrl 结构中指定的值,控制为镜头存储的有代表性帧的数目 以及将使用哪些帧。参见镜头检测数据结构以获取 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 子目录包含两个样本程序, 它们演示构建和显示视频的故事板。makesf.exe 文件中的样本程序使用 DBvBuildStoryBoardFile API 来创建镜头目录文件,并在该文件中存储镜头数据。另一个样本程序 makehtml.exe 存取镜头目录文件, 并创建 HTML 页来供 Web 浏览器显示。

指定镜头的注解(仅数据库)

可指定要与镜头的其他信息一起存储在镜头目录中的注解。使用 DBvSetShotComment API 来指定注解。

使用此 API 时,需要指定存储注解的镜头目录的名称、 正在添加其注解的镜头的句柄,以及注解。还需要指定 SQLConnect 调用返回给数据库的数据库连接句柄。例如, 下列语句在名为 hotshots 的镜头目录中添加镜头注解(从帧号 85 开始):

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*/

合并镜头目录中的镜头信息(仅数据库)

可以合并镜头目录中存储的两个镜头的信息。在合并镜头信息时, 通过标识第一个镜头和第二个镜头来指示合并次序。将第一个镜头的起始帧号存储为合并后镜头的起始帧号。将第一个和第二个镜头之间最大帧的号码存储为合并后镜头的结束帧号。合并将存储的第一个镜头的信息替换为合并后镜头的信息; 将从镜头目录中删除存储的第二个帧的信息。

使用 DBvMergeShots API 来合并镜头目录中两个镜头的信息。当使用此 API 时,指定镜头目录名,后跟要合并的第一个和第二个帧的句柄。还需要指定 SQLConnect 调用返回给数据库的数据库连接句柄。例如,下列语句合并名为 hotshots 的目录中存储的两个镜头的信息; 第一个镜头开始于帧 85,第二个镜头开始于帧 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 调用返回给数据库的连接句柄。例如, 下列语句删除名为 hotshots 的镜头目录:

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


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]