可使用 Video Extender 从视频中获取镜头或帧。在获取镜头或帧之前,必须为镜头检测打开视频。Video Extender 使用索引来存取帧和镜头。在获取镜头或帧之前,必须创建视频的索引。
在打开视频并创建索引之后, 就可获取视频中的下一镜头或帧,或通过帧号获取特定帧。Video Extender 可处理 MPEG-1 格式的视频剪辑。如果计划将检索到的帧与要求 RGB 格式的程序配合使用, 则可以通过使用 Video Extender API 将帧转换为该格式。
使用 DBvOpenFile API 来打开存储在文件中的视频。该文件必须可以从 客户机进行存取。使用 DBvOpenHandle API 来打开存储在数据库表中的视频。该应用程序必须首先连接到数据库。若视频存储在数据库表中, 则 Video Extender 将视频复制至一个临时文件。该临时文件位于客户机 环境变量 DB2VIDEOTEMP 中指定的目录中。打开视频将对它初始化, 以进行镜头检测。Video Extender 将设置一个指向视频起始处(即帧 0)的指针。
在使用任一 API 时, 都需要指向用来包含指向视频数据结构 (DBvIOType) 的指针的区域。作为对 API 调用的响应,Video Extender 分配此结构, 并使用此结构来存储关于视频的信息。此结构还指向包含当前帧的象素内容的帧数据结构 (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*/
Video Extender 使用索引来存取视频中的帧和镜头。需要创建视频的索引(MPEG 格式未提供帧和镜头的索引), 才能从视频中获取镜头或帧。索引将帧号映射至组成 MPEG-1 视频的位流。
可通过使用 DBvCreateIndexFromVideo API 或 DBvCreateIndex API 来创建视频的索引 但是,若已使用 DBvOpenFile API 或 DBvOpenHandle API 为镜头检测打开了视频, 则不必明确创建索引;Video Extender 将自动地为您创建索引。(参见 为镜头检测打开视频 以获取关于如何打开视频的信息)。
当(明确或自动地)创建索引时, DB2 Video Extender 尝试将索引存储在视频文件所在的路径中。它首先尝试将索引文件存储为 fname.ext.idx, 其中 fname 是视频文件的名称,而 ext 是视频文件的扩展名。若该尝试失败,则 Video Extender尝试将该文件存储为 fname.idx, 并存储在视频文件所在的目录中。若该尝试失败,则它尝试将索引文件存储在本地目录中, 首先存储为 fname.ext.idx,然后存储为 fname.idx。
当文件打开时,Video Extender 按以下次序寻找索引文件:
例如,若为名为 myvideo.mpg 的视频文件创建了索引, 则 Video Extender 将首先在视频文件的路径中寻找名为 myvideo.mpg.idx 的可写索引。
使用 DBvCreateIndexFromVideo API 时, 指定 DBvIOType 数据结构。Video Extender 将索引文件的名称存储在该结构中。有关此结构的说明,参见镜头检测数据结构。例如,下列语句创建先前为镜头检测而打开的视频的索引:
DBvIOType *video; rc=DBvCreateIndexFromVideo( video); /* pointer to video structure */
当使用 DBvCreateIndex API 时,指定视频文件的名称。Video Extender 将索引存储在文件中(与视频位于同一目录)。例如, 下列语句创建视频文件(先前未为镜头检测打开的文件)的索引:
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 */
备份视频索引: 备份视频索引文件,以防需要恢复它。该文件位于安装 Video Extender 的目录中。
可获取视频中的当前帧 还可将当前帧设置为特定帧号。使用 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 时,需要指向下列数据结构:
还需要指向搜索的起始帧。Video Extender 将从视频中的该点开始搜索下一镜头。
作为此 API 的结果,Video Extender 设置 shotDetected 标志, 并指向下一镜头的起始帧及其帧数据。若将 shotDetected 标志设置为 1, 则表示已检测到镜头。在这种情况下,Video Extender:
若将 shotDetected 标志设置为 0, 则表示未检测到镜头。在这种情况下,Video Extender 返回一代码, 指示到达视频的末尾。
有关这些结构的说明,参见镜头检测数据结构。
例如,下列语句请求视频中的下一镜头:
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 格式很方便。Video Extender 提供了 DBvFrameDatato24BitRGB API 来将检索到的 MPEG-1 帧由 YUV 格式转换为 24 位 RGB 格式。要使用此 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 帧: