可将关于镜头的信息存储在镜头目录中。Video Extender 提供了一些 API 来:
已编目的镜头提供故事板的输入:在镜头目录中存储镜头信息之后(无论该目录是在数据库中还是在文件中), 可在与镜头相关的应用程序中使用该信息。例如,可创建一个应用程序,它获取视频中所有镜头的有代表性帧, 并在故事板中加以显示。
只需创建数据库的镜头目录:仅当您想让目录驻留在数据库中时,才需要创建镜头目录。当您存储视频中镜头的数据,并指示要在文件中进行输出时, Video Extender 自动创建镜头目录文件。
在数据库中创建和使用目录之前,必须:
使用 DBvCreateShotCatalog API 在数据库中创建镜头目录。(当存储镜头的数据,并指示要在文件中进行输出时,Video Extender
将自动创建镜头目录文件。)该目录由存储与镜头相关的信息的多个表组成。可通过使用 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 | 注解 |
您可灵活地决定在数据库中创建多少镜头目录, 以及在每个镜头目录中存储哪些镜头的信息 可创建一个目录来存储许多视频的镜头信息、 将每个视频的镜头信息存储在独立目录中、 或将视频中多个镜头的信息存储在多个目录中。
使用此 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 结构中的值
![]() |
如图中所示:
若将 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*/