Image、Audio 及 Video Extenders 管理與程式設計

取得快照或框

您可以使用 Video Extender 來取得視訊中的快照或框。 在取得快照或框之前,您必須開啟用於快照偵測的視訊。Video Extender 使用索引來存取框和快照。在取得快照或框之前, 您必須建立視訊索引。

在開啟視訊並建立索引之後, 可透過快照號碼來取得視訊中下一個快照或框,或取得特定框。Video Extender 可處理 MPEG-1 格式的視訊片段。如果您計劃將所擷取的框使用在需要 RGB 格式 的節目,可以使用 Video Extender API 將框轉換成該格式。

開啟用於快照偵測的視訊

使用 DBvOpenFile API 來開啟儲存在檔案中的視訊。此檔案必須可由從屬站存取。使用 DBvOpenHandle API 來開啟儲存在資料庫表格中的視訊。應用程式必須先連接到資料庫。如果視訊是儲存在資料庫表格中,則 Video Extender 會將視訊複製到暫時檔案中。此暫時檔案存放在以從屬站環境變數 DB2VIDEOTEMP 指定的目錄中。 為快照偵測開啟並起始設定一個視訊。Video Extender 在視訊起點設定一個指標,亦即框 0。

當您使用其中一個 API 時,您需指出一個區域,來包含指向視訊資料結構 (DBvIOType) 的指標。 Video Extender 配置此結構來回應 API 呼叫,並使用此結構來儲存視訊的相關資訊。此結構亦指示框資料結構 (DBvFrameData),它含有現行框的圖點內容。 有關這些結構的說明,請參閱快照偵測資料結構。以 DBvOpenFile API 而言, 您也需要指定視訊檔的名稱。以 DBvOpenHandle API 而言,您也需要指定視訊 handle。

例如,下列陳述式可為檔案中儲存的快照偵測,開啟一個視訊:

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 的索引檔,再尋找檔名為 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


[ 頁面頂端 | 前一頁 | 下一頁 | 目錄 | 索引 ]