您可以將快照相關資訊儲存在快照型錄中。Video Extender 提供 API 來:
為 storyboard 將提供輸入的快照編入型錄:將快照資訊存入快照型錄 (此型錄位於資料庫或檔案中) 後, 您可以使用快照相關應用程式中的資訊。 例如,您可以建立應用程式來取得視訊中所有快照的代表框, 並在 storyboard 中顯示它們。
您僅需對資料庫建立快照型錄:只有在您要型錄常駐於資料庫時,才需要建立快照型錄。 當您儲存視訊中快照的資料並指示要檔案中的輸出時,Video Extender 會自動建立一個快照型錄檔。
在資料庫中建立及使用型錄之前,您必須:
在資料庫中建立快照型錄或執行作業之前,您必須透過 SQLConnect 呼叫來連接資料庫。(SQLConnect 是一種 DB2 CLI 呼叫。) 此呼叫會傳回在管理快照型錄的 API 中,您必須指定的連接 handle。
使用 DBvCreateShotCatalog API,在資料庫中建立快照型錄。
(當您儲存快照資料並指示要檔案中的輸出時,Video Extender 會自動建立一個快照型錄檔。).
此型錄是由儲存快照相關資訊的表格所組成。 您可以使用 SQL 來查詢表格的概略表。 下表顯示概略表中一些直欄。
直欄名稱 | 資料類型 | 說明 |
---|---|---|
SHOTHANDLE | CHAR(36) | 快照 handle |
VIDEOHANDLE | VARCHAR(254) | 視訊 handle。僅在視訊使用 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 對資料庫呼叫後所傳回的資料庫連接 handle。例如,下列陳述式建立一個快照型錄,名為 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 對資料庫呼叫後所傳回的資料庫連接 handle。 例如,下列陳述式取 得框號 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 時,您必須:
對 DBvBuildStoryboardTable API 而言,您還需要指定 SQLConnect 對資料庫呼叫後所傳 回的資料庫連接 handle。
例如,下列陳述式將視訊中所有快照的資訊儲存在快照型錄中:該快照型錄位於資料庫中。
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, 特別適合來儲存 storyboard 中所用的資訊。storyboard 是視訊的視覺摘要。您可以藉由顯示快照型錄中某視訊所儲存 的代表框,來建立一個 storyboard。
DBvBuildStoryboardTable API 和 DBvBuildStoryboardFile API, 儲存快照的一個或多個代表框。在 DBvStoryboardCtrl 結構中指定的值,控制某快照所儲存的 代表框數,以及要使用哪些框。有關 DBvStoryboardCtrl 結構的定義,請參閱快照偵測資料結構。下列圖表說明如何使用 DBvStoryboardCtrl 欄位中的值。
圖 23. 如何使用 DBvStoryboardCtrl 結構中的值
![]() |
如圖表所示:
若 thresh1 或 thresh2 值設為 -1,則任何快照皆可當做小型快照來處理。 此時,只有一個代表框,亦即中間框,會被儲存在快照型錄內。
除了 DBvStoryboardCtrl 資料結構中的值以外,DBvShotControl 資料結構中的許多欄位, 會影響後來用以顯示於 storyboard 中的代表框。 例如,DBvShotControl 資料結構中的 CorrHistThresh、normalcorrValue 及 minShotSize 欄位, 指定快照偵測的臨界值,因此會影響哪些框要顯示於視訊的 storyboard 內。 使用 DBvBuildStoryBoardTable API 和 DBvBuildStoryBoardFile API 來儲存 storyboard 中所用的快照資訊時, 您可以先試著使用 DBvStoryBoardCtrl 和 DBvShotControl 資料結構的起始設定值。 然後,您可以在這些資料結構中變更各種欄位值,以調整您的結果。
您可以建立程式來顯示 storyboard。作法是存取視訊中快照型錄內所儲存的代表框。若使用 DBvBuildStoryboardFile API 來儲存視訊的快照,則快照型錄檔會指向代表框的 GIF 檔案。 您可以使用瀏覽程式或顯示程式,來顯示這些 GIF 檔案。
若使用 DBvBuildStorybBoardTable API 來儲存視訊的快照, 則快照型錄 (儲存於資料庫中) 會包含代表框的資料。您可以在快照型錄概略表中, 存取代表框資料 (有關概略表的說明,請參閱表 12)。代表框資料是 YUV 格式; 這種格式不是大多數顯示程式所能顯示的。 若要顯示代表框,您可使用DBvFrameDatato24BitRGB API 來轉換框資料,其有關資訊請參閱顯示擷取框。 然後,即可使用瀏覽程式或顯示程式來顯示代表框。
SAMPLES 次目錄包含兩個範例程式,用以展示建置和顯示視訊的 storyboard。 其中一個範例程式 makesf.exe 檔,使用 DBvBuildStoryBoardFile API 來建立快照型錄檔, 並將快照資料儲存於檔案中。另一個範例程式 makehtml.exe, 存取快照型錄檔,並建立 Web 瀏覽程式所顯示的 HTML 網頁。
對於快照型錄中的快照,您可以指定註解來與其它資訊儲存在一起。 使用 DBvSetShotComment API 來指定註解。
使用該 API 時,您必須指定要儲存註解的快照型錄名稱、要新增註解的快照 handle、 以及該註解。 您 也需要指定 SQLConnect 對資料庫呼叫後所傳回的資料庫連接 handle。 例如,下列陳述式在 名為 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 對資料庫呼叫後所傳回的資料庫連接 handle。
變更快照的資訊時,您可以變更資訊中儲存的任何註解。 若您想變更註解,請在 DBvShotType 結構中指定。若您想保留以前的註解, 請在 DBvShotType 結構中指定 NULL 值。
例如,下列陳述式在一個名為 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 時,請指定快照型錄名稱,之後接著要合併之第一個和第二個快照的 handle。 您 也需要指定 SQLConnect 對資料庫呼叫後所傳回的資料庫連接 handle。 例如,下列陳述式在一個稱為 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 時,請指定快照型錄名稱,再接著快照 handle。 您 也需要指定 SQLConnect 對資料庫呼叫後所傳回的資料庫連接 handle。 例如,下列陳述式在 名為 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 對資料庫呼叫後所傳回的資料庫連接 handle。 例如,下列陳述式刪除一個快照型錄,稱為 hotshots:
SQLHDBC hdbc; SQLHENV henv; rc=DBvDeleteShotCatalog ( "hotshots", /*shot catalog name*/ hdbc); /*database connection handle*/