IBM Books

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

获取镜头或帧

可使用 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 按以下次序寻找索引文件:

  1. 索引文件的可写版本,优先于只读版本。
  2. 与视频文件在同一路径中的索引文件,优先于当前目录。
  3. 名为 fname.ext.idx 的索引,优先于名为 name fname.idx 的索引, 其中 fname 是视频文件的名称,而 ext 是视频文件的扩展名。

例如,若为名为 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 帧:

  1. 使用 DBvFrameDatato24BitRGB API 来将检索到的 MPEG-1 帧的格式由 YUV 格式转换为 24 位 RGB 格式。参见转换检索到的帧的格式以获取关于使用 DBvFrameDatato24BitRGB API 的信息。
  2. 将适当的标题追加至转换后的帧。例如,BMP 格式需要一个包括诸如图象宽度和高度之类的信息的标题。
  3. 将帧内容(及其标题)复制至文件。
  4. 使用 DBiBrowse API 来显示该文件。有关使用 DBiBrowse API 的信息,参见 使用显示或播放 API


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