Der Video Extender stellt eine Gruppe von Anwendungsprogrammierschnittstellen zur Verfügung, mit denen Sie Aufnahmen oder Vollbilder in einem Videoclip suchen können. Wenn Sie eine Aufnahme oder ein Vollbild gefunden haben, können Sie auf die zugehörigen Daten zugreifen, wie z. B. die Anfangs- und Endvollbildnummern oder den Pixelinhalt eines Vollbilds. Sie können dann diese Informationen zur weiteren Verarbeitung an ein Programm übergeben. Beispielsweise können Sie den Inhalt eines Vollbilds an ein Programm übergeben, das diesen Inhalt anzeigen kann.
Der Video Extender stellt außerdem APIs zur Verfügung, mit denen Aufnahmedaten in einem Aufnahmekatalog gespeichert werden können. Der Aufnahmekatalog kann in einer Datenbank oder einer Datei sein. Sie können auf den Aufnahmekatalog in einer Datei oder auf eine schreibgeschützte Sicht des Aufnahmekatalogs in einer Datenbank zugreifen.
Eine Aufnahmekatalogdatei enthält Felder für die folgenden Daten:
Die Sicht des Aufnahmekatalogs in einer Datenbank enthält Spalten für die folgenden Daten:
Sie können auf die Daten in einer Aufnahmekatalogdatei zugreifen oder die Daten abfragen, wenn sich der Aufnahmekatalog in einer Datenbank befindet. Die Informationen zu repräsentativen Vollbildern sind besonders beim Anzeigen von Storyboards sinnvoll. Darüber hinaus können Sie, wenn sich der Aufnahmekatalog in einer Datenbank befindet, die Aufnahmedaten mit zugehörigen Daten in anderen Tabellen verknüpfen. Beispielsweise kann das Personal in einem Fernsehstudio einen Aufnahmekatalog in einer Datenbank erstellen. Es kann dann die Katalogdaten mit einer Tabelle verknüpfen, die die Videoclips sowie Informationen zu den Clips enthält. Auf diese Weise kann das Personal eine einzige Abfrage verwenden, um einen Clip und geschäftsinterne Informationen zum Clip abzufragen sowie Aufnahmen innerhalb des Clips zu identifizieren.
Daten, die mit der Aufnahmeermittlung zusammenhängen, werden in Strukturen gespeichert, die in der Kopfdatei für die Aufnahmeermittlung, dmbshot.h, enthalten sind. Für viele der APIs für die Aufnahmeermittlung ist erforderlich, daß Sie auf eine oder mehrere dieser Strukturen zeigen. Einige dieser Strukturen werden verwendet, um Daten zu speichern, die der Video Extender als Eingabe verwendet. Beispielsweise enthält die Steuerstruktur für Aufnahmen Informationen, die die Aufnahmeermittlung steuern. Die meisten der Strukturen werden vom Video Extender verwendet, um Daten zu speichern, die von einem Video abgerufen werden. Beispielsweise enthält die Datenstruktur für Videovollbilder den Pixelinhalt eines Vollbilds.
Die Strukturen, die für die Aufnahmeermittlung verwendet werden, sind DBvIOType, DBvShotControl, DBvShotType, DBvFrameData und DBvStoryboardCtrl.
Die Datenstruktur DBvIOType enthält Daten zu einem Video, wie z. B. Format, Dimensionen und Anzahl der Vollbilder. Die Datenstruktur ist wie folgt definiert:
typedef struct { FILE *hFile; /* file handle for the video */ char vhandle[255]; /* video handle (if from database) char vtable[255]; /* video table name (if from database) */ char vcolumn[255]; /* video column name (if from database) */ char vFile[255]; /* name of video file */ char idxFile[255]; /* name of index file */ char isIdx; /* 1 if the index exists, 0 otherwise */ char isInDb; /* 1 if from DB, 0 if from file */ int format; /* Format of the video */ unsigned long dx, dy; /* Dimensions of the video */ unsigned long totalFrames; /* TotalFrames in the video */ unsigned long markFrame; /* used by shot detection */ unsigned long currentFrame; /* The current video frame */ DBvFrameData fd; /* Frame data for current frame */ DBvDCFrameData fdDc; /* Frame data for DC images */ unsigned char BGRValid; /* reserved */ unsigned short usDeviceID; /* reserved */ unsigned long hwnd; /* reserved */ int videoReset; /* Flag if video is opened or seeked */ int firstshot; /* Used internally to indicate the first call */ void *reserved /* reserved */ } DBvIOType;
Die Datenstruktur DBvShotControl enthält Informationen, die zur Steuerung der Aufnahmeermittlung verwendet werden, wie z. B. die Ermittlungsmethode. Die Datenstruktur ist wie folgt definiert:
typedef struct { unsigned long reserved; unsigned long method; /* detection method */ #define DETECT_CORRELATION 0x00000001 #define DETECT_HISTOGRAM 0x00000002 #define DETECT_CORRHIST 0x00000003 #define DETECT_CORRHISTDISS 0x00000004 int normalCorrValue; /* Correlation threshold */ int sceneCutSkipXY; /* reserved */ int CorrHistThresh; /* Histogram threshold */ int DissThresh; /* Dissolve threshold */ int DissCacheSize; /* Dissolve cache size */ int DissNumCaches; /* Dissolve cache number */ int minShotSize; /* Minimum frames in a shot */ } DBvShotControl;
In In der folgenden Tabelle werden die einzelnen Felder in DBvShotControl und deren zulässige Einstellungen und Standardeinstellungen beschrieben. Um diese Felder mit deren Standardwerten zu initialisieren, verwenden Sie die API DBvInitShotControl, wie im Abschnitt Werte in Datenstrukturen bei der Aufnahmeermittlung initialisieren beschrieben.
DBvShotControl-Einstellungen hängen vom Videotyp ab:
Szenenwechsel in digitalisierten Videos variieren je nach Inhalt und Format
des Videos sehr. Außerdem variiert die Genauigkeit des Algorithmus für
Szenenwechsel je nach Video. Klar definierte Szenenwechsel mit
offensichtlichen Unterschieden in der allgemeinen Vollbildarstellung werden
akkurater ermittelt als weniger klar definierte Arten von Szenenwechseln oder
Änderungen, bei denen der allgemeine Farbinhalt der gleiche bleibt.
Obwohl die Standardeinstellungen für das DBvShotControl-Feld für die meisten
Anwendungen gut funktionieren, müssen Sie diese Einstellungen möglicherweise
verkleinern, um die Ermittlung falscher oder fehlender Aufnahmen zu
verhindern.
Tabelle 10. DBvShotControl-Felder
Die Datenstruktur DBvShotType enthält Informationen zu einer Aufnahme, wie z. B. Anfang- und Endvollbildnummer, repräsentative Vollbildnummer sowie einen Zeiger auf den Pixelinhalt des repräsentativen Vollbilds. Die Datenstruktur ist wie folgt definiert:
typedef struct { unsigned long startFrame; /* starting frame number */ unsigned long endFrame; /* ending frame number */ unsigned long repFrame; /* representative frame number */ DBvFrameData fd; /* data for representative shot */ unsigned long dx; /* frame data width in pixels */ unsigned long dy; /* frame data height in pixels */ char *comment; /* shot remark */ } DBvShotType;
Die Datenstruktur DBvFrameData enthält den Pixelinhalt eines Vollbilds. Die Datenstruktur ist wie folgt definiert:
typedef struct /* video frame data */ { /* MPEG 1 pixels */ unsigned char *luminance; /* Luminance pixel plane (black and white) */ unsigned char *Cr; /* Cr pixel plane */ unsigned char *Cb; /* Cb pixel plane */ unsigned char *reserved; } DBvFrameData;
Die Datenstruktur DBvStoryboardCtrl enthält Werte, mit denen gesteuert wird, wie viele und welche repräsentative Vollbilder für eine Aufnahme in einem Videokatalog gespeichert werden. Eine Beschreibung zur Verwendung dieser Werte befindet sich im Abschnitt Storyboard erstellen. Die Datenstruktur ist wie folgt definiert:
typedef struct { int thresh1; /* threshold for small to medium scenes */ int thresh2; /* threshold for medium to large scenes */ int delta; /* offset used for representative frames */ } DBvStoryboardCtrl;
In In der folgenden Tabelle werden die einzelnen Felder in DBvStoryboardCtrl und deren Standardeinstellungen beschrieben. Um diese Felder mit ihren Standardwerten zu initialisieren, verwenden Sie die API DBvInitStoryboardCtrl, wie im Abschnitt Werte in Datenstrukturen bei der Aufnahmeermittlung initialisieren beschrieben.
Die Einstellungen für DBvStoryboardCtrl hängen vom Typ des Videos
ab: Welche und wie viele repräsentative Vollbilder für ein
Storyboard optimal sind, hängt möglicherweise von den unterschiedlichen Typen
von Videos ab. Obwohl die Standardeinstellungen für das Feld
DBvStoryboardCtrl für die meisten Typen von Video gut funktionieren, möchten
Sie möglicherweise diese Einstellungen für eine Testuntergruppe von Videos
verwenden. Sie können dann die Einstellung entsprechend verbessern,
bevor Sie Storyboards für eine größere Gruppe von Videos erstellen.
Tabelle 11. DBvStoryboardCtrl-Felder
Feld | Bedeutung |
---|---|
thresh1 | Gibt die Schwelle für kurze Aufnahmen an. Aufnahmen, die weniger
Vollbilder enthalten, als der Wert von thresh1 angibt, sind kurze
Aufnahmen. Beim Katalogisieren enthalten die Informationen für eine
kurze Aufnahme ein repräsentatives Vollbild (das mittlere Vollbild).
Der Standardwert ist 90. Wenn der Wert von thresh1 auf -1 gesetzt ist, wird eine Aufnahme (unabhängig von der tatsächlichen Länge) als kurze Aufnahme betrachtet. |
thresh2 | Gibt die Schwelle für mittellange bis lange Aufnahmen an.
Aufnahmen, die maximal so viele Vollbilder enthalten, wie der Wert thresh2
angibt, aber mindestens so viele Vollbilder, wie der Wert thresh1 angibt,
werden als mittellange Aufnahmen betrachtet. Beim Katalogisieren
enthalten die Informationen für eine mittellange Aufnahme zwei repräsentative
Vollbilder. Die Position der repräsentativen Vollbilder wird durch den
Wert des Deltafeldes gesteuert. Aufnahmen, die mehr Vollbilder
enthalten, als der Wert von thresh2 angibt, sind lange Aufnahmen. Beim
Katalogisieren enthalten die Informationen für eine lange Aufnahme drei
repräsentative Vollbilder. Die Position des ersten und des letzten
repräsentativen Vollbilds wird durch den Wert des Deltafeldes
gesteuert. Das zweite repräsentative Vollbild ist das mittlere
Vollbild.
Der Standardwert ist 150. Wenn der Wert von thresh2 auf -1 gesetzt ist, wird eine Aufnahme (unabhängig von der tatsächlichen Länge) als kurze Aufnahme betrachtet. |
delta | Gibt die relative Position an, die für repräsentative Vollbilder
verwendet wird. Bei mittellangen und langen Aufnahmen wird das erste
repräsentative Vollbild vom Anfang der Aufnahme die Deltazahl an Vollbildern
eingerückt. Das letzte repräsentative Vollbild wird vom Ende der
Aufnahme die Deltazahl an Vollbildern eingerückt.
Der Standardwert ist 5. |
Die Werte in der Datenstruktur DBvShotControl steuern die Aufnahmeermittlung. Die Werte in der Datenstruktur DBvStoryboardCtrl steuern das Erstellen eines Storyboards. Für die Felder in diesen Datenstrukturen können Sie explizit Werte angeben. Darüber hinaus können Sie die Werte in diesen Strukturen mit ihren Standardwerten initialisieren. Tabelle 10 enthält die Standardwerte der Datenstruktur DBvShotControl. Tabelle 11 enthält die Standardwerte der Datenstruktur DBvStoryboardCtrl.
Verwenden Sie die API DBvInitShotControl, um die Werte in der Datenstruktur DBvShotControl zu initialisieren. Wenn Sie die API verwenden, müssen Sie die Steuerstruktur für Aufnahmen angeben. Beispielsweise initialisiert die folgende Anweisung die Felder in der Struktur DBvShotControl mit den Standardwerten:
DBvShotControl shotCtrl; rc=DBvInitShotControl( shotCtrl); /* pointer to shot control structure */
Verwenden Sie die API DBvInitStoryboardCtrl, um die Werte in der Datenstruktur DBvStoryboardCtrl zu initialisieren. Wenn Sie die API verwenden, müssen Sie die Steuerstruktur für das Storyboard angeben. Beispielsweise initialisiert die folgende Anweisung die Felder in der Struktur DBvStoryboardCtrl mit den Standardwerten:
DBvStoryboardCtrl sbCtrl; rc=DBvInitStoryboardCtrl( sbCtrl); /* pointer to storyboard control structure */
Sie können den Video Extender verwenden, um eine Aufnahme oder ein Vollbild eines Videos abzurufen. Bevor Sie eine Aufnahme oder ein Vollbild abrufen können, müssen Sie das Video für die Aufnahmeermittlung öffnen. Der Video Extender verwendet einen Index, um auf Vollbilder und Aufnahmen zuzugreifen. Bevor Sie eine Aufnahme oder ein Vollbild abrufen können, müssen Sie einen Index für das Video erstellen.
Nachdem das Video geöffnet und ein Index erstellt wurde, können Sie die nächste Aufnahme oder das nächste Vollbild in einem Video abrufen oder ein bestimmtes Vollbild nach Vollbildnummer abrufen. Der Video Extender kann Videoclips im MPEG-1-Format verarbeiten. Wenn Sie planen, ein abgerufenes Vollbild mit einem Programm zu verwenden, für das das RGB-Format erforderlich ist, können Sie das Vollbild mit Hilfe einer Video Extender-API in das gewünschte Format umsetzen.
Verwenden Sie die API DBvOpenFile, um ein Video zu öffnen, das in einer Datei gespeichert ist. Auf die Datei muß vom Client aus zugegriffen werden können. Verwenden Sie die API DBvOpenHandle, um ein Video zu öffnen, das in einer Datenbanktabelle gespeichert ist. Die Anwendung muß zunächst mit der Datenbank verbunden sein. Ist das Video in einer Datenbanktabelle gespeichert, kopiert der Video Extender das Video in eine temporäre Datei. Die temporäre Datei befindet sich in einem Verzeichnis, das in der Umgebungsvariablen DB2VIDEOTEMP angegeben ist. Durch das Öffnen wird ein Video für die Aufnahmeermittlung initialisiert. Der Video Extender setzt einen Zeiger an den Anfang des Videos, das heißt auf das Vollbild 0.
Wenn Sie eine der APIs verwenden, müssen Sie auf einen Bereich zeigen, der für den Zeiger auf die Videodatenstruktur (DBvIOType) verwendet wird. Der Video Extender ordnet diese Struktur als Antwort auf den API-Aufruf zu und verwendet die Struktur, um Informationen zum Video zu speichern. Die Struktur zeigt außerdem auf die Vollbilddatenstruktur (DBvFrameData), die den Pixelinhalt des aktuellen Vollbilds enthält. Eine Beschreibung dieser Strukturen befindet sich im Abschnitt Datenstrukturen bei der Aufnahmeermittlung. Für die API DBvOpenFile müssen Sie außerdem den Namen der Videodatei angeben. Für die API DBvOpenHandle müssen Sie die Videokennung angeben.
Beispielsweise öffnet die folgende Anweisung ein Video, das in einer Datei gespeichert ist, für die Aufnahmeermittlung:
DBvIOType *videoptr; rc=DBvOpenFile ( &videoptr, /* pointer to video structure pointer */ "/employee/video/rsmith.mpg"); /* video file */
Die folgende Anweisung öffnet ein Video, das in einer Datenbanktabelle gespeichert ist, für die Aufnahmeermittlung:
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*/
Der Video Extender verwendet einen Index, um auf Vollbilder und Aufnahmen in einem Video zuzugreifen. Sie müssen einen Index für ein Video erstellen, bevor Sie eine Aufnahme oder ein Vollbild des Videos abrufen können (das MPEG-Format liefert keinen Index für Vollbilder und Aufnahmen). Der Index ordnet Vollbildnummern den Bitströmen zu, die ein MPEG-1-Video bilden.
Sie können unter Verwendung der API DBvCreateIndexFromVideo oder der API DBvCreateIndex einen Index für ein Video erstellen. Wenn Sie jedoch ein Video unter Verwendung der API DBvOpenFile oder der API DBvOpenHandle für die Aufnahmeermittlung geöffnet haben, brauchen Sie nicht explizit einen Index zu erstellen; der Video Extender wird automatisch einen Index für Sie erstellen. (Informationen zum Öffnen des Videos befinden sich im Abschnitt Video für die Aufnahmeermittlung öffnen.)
Wenn ein Index (entweder explizit oder automatisch) erstellt wurde, versucht der DB2 Video Extender, den Index im selben Pfad zu speichern wie die Videodatei. Er versucht zunächst, die Indexdatei als 'fname.ext.idx' zu speichern, wobei 'fname' der Name der Videodatei und 'ext' die Erweiterung der Videodatei ist. Wenn dieser Versuch fehlschlägt, versucht der Video Extender, die Datei als 'fname.idx' in demselben Verzeichnis zu speichern wie die Videodatei. Wenn auch dieser Versuch fehlschlägt, versucht er, die Indexdatei im lokalen Verzeichnis zu speichern, zunächst als 'fname.ext.idx' und anschließend als 'fname.idx'.
Wenn die Datei geöffnet wird, sucht der Video Extender in der folgenden Reihenfolge nach der Indexdatei:
Beispielsweise sucht der Video Extender, wenn ein Index für die Videodatei 'myvideo.mpg' erstellt ist, zunächst nach einem Index mit Schreibzugriff mit dem Namen 'myvideo.mpg.idx' in dem Pfad, in dem sich die Videodatei befindet.
Wenn Sie die API DBvCreateIndexFromVideo verwenden, geben Sie die Datenstruktur DBvIOType an. Der Video Extender speichert den Namen der Indexdatei in der Struktur. Eine Beschreibung dieser Struktur befindet sich im Abschnitt Datenstrukturen bei der Aufnahmeermittlung. Beispielsweise erstellt die folgende Anweisung einen Index für ein Video, das zuvor für die Aufnahmeermittlung geöffnet wurde:
DBvIOType *video; rc=DBvCreateIndexFromVideo( video); /* pointer to video structure */
Wenn Sie die API DBvCreateIndex verwenden, geben Sie den Namen der Videodatei an. Der Video Extender speichert den Index in einer Datei (im gleichen Verzeichnis, in dem sich das Video befindet). Beispielsweise erstellt die folgende Anweisung einen Index für eine Videodatei (die Datei wurde zuvor nicht für die Aufnahmeermittlung geöffnet):
rc=DBvCreateIndex( "/employee/video/rsmith.mpg"); /* video file */
Sie können auch ermitteln, ob ein Index für ein Video existiert. Verwenden Sie die API DBvIsIndex, um nach einem Index zu suchen. Die API setzt die Statusvariable auf 0, wenn kein Index existiert, oder auf 1, wenn ein Index für die Datei existiert. Beispielsweise prüft die folgende Anweisung die Existenz eines Indexes für eine Videodatei:
short *status rc=DBvIsIndex( "/employee/video/rsmith.mpg", /* video file */ &status); /* status indicator */
Videoindex sichern: Sichern Sie die Datei mit dem Videoindex für den Fall, daß Sie sie wiederherstellen müssen. Die Datei befindet sich in dem Verzeichnis, in dem der Video Extender installiert ist.
Sie können das aktuelle Vollbild in einem Video abrufen. Sie können außerdem das aktuelle Vollbild auf eine bestimmte Vollbildnummer setzen. Verwenden Sie die API DBvGetFrame, um das aktuelle Vollbild in einem Video abzurufen. Verwenden Sie die API DBvSetFrameNumber, um das aktuelle Vollbild auf eine bestimmte Vollbildnummer zu setzen.
Wenn Sie die API DBvGetFrame verwenden, geben Sie die Videostruktur an. Beispielsweise ruft die folgende Anweisung das aktuelle Vollbild in einem Video ab:
DBvIOType *video; rc=DBvGetFrame( video); /* pointer to video structure */
Wenn Sie die API DBvSetFrameNumber verwenden, geben Sie die Videostruktur und die Nummer des Vollbilds an, das Sie als aktuelles Vollbild festlegen wollen. Beispielsweise setzen die folgenden Anweisungen das aktuelle Vollbild auf die Vollbildnummer 85 und rufen das Vollbild anschließend ab:
DBvIOType *video; rc=DBvSetFrameNumber( video, /* pointer to video structure */ 85); /* frame number */ rc=DBvGetFrame( video); /* pointer to video structure */
Bei der Ausgabe bringt die API DBvSetFrameNumber das Feld currentFrame in der Struktur DBvIOType in Grundstellung. Die API DBvGetFramestellt den Pixelinhalt des Vollbilds in die Struktur DBvFrameData. Eine Beschreibung dieser Strukturen befindet sich im Abschnitt Datenstrukturen bei der Aufnahmeermittlung.
Verwenden Sie die API DBvDetectShot, um die nächste Aufnahme in einem Video abzurufen. Wenn Sie die API DBvDetectShot verwenden, müssen Sie auf die folgenden Datenstrukturen zeigen:
Sie müssen außerdem auf ein Anfangsvollbild für die Suche zeigen. Der Video Extender beginnt an dieser Position des Videos seine Suche nach der nächsten Aufnahme.
Als Ausgabe der API setzt der Video Extender eine Markierung shotDetected und zeigt auf das Anfangsvollbild der nächsten Aufnahme und dessen Vollbilddaten. Ist die Markierung shotDetected auf 1 gesetzt, wurde eine Aufnahme ermittelt. In diesem Fall führt der Video Extender folgende Aktionen aus:
Ist die Markierung shotDetected auf 0 gesetzt, wurde keine Aufnahme ermittelt. In diesem Fall gibt der Video Extender eine Code zurück, der angibt, daß das Ende des Videos erreicht wurde.
Eine Beschreibung dieser Strukturen befindet sich im Abschnitt Datenstrukturen bei der Aufnahmeermittlung.
Beispielsweise fordern die folgenden Anweisungen die nächste Aufnahme in einem Video an:
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 */
Der Inhalt eines MPEG-1-Vollbilds ist im YUV-Format, ein Format, das Informationen zur Luminanzpixelebene, Cr-Pixelebene und Cb-Pixelebene eines Vollbilds enthält.
Wenn Sie ein Videovollbild editieren wollen, ist es möglicherweise sinnvoll, das Vollbild vom YUV-Format in das RGB-Format umzusetzen. Der Video Extender stellt die API DBvFrameDatato24BitRGB zur Verfügung, um ein abgerufenes MPEG-1-Vollbild vom YUV-Format in das 24-Bit-RGB-Format umzusetzen. Um die API zu verwenden, müssen Sie zunächst einen Zielpuffer anlegen.
Wenn Sie die API verwenden, müssen Sie auf den Zielpuffer und die Vollbilddaten, die Sie umsetzen wollen, zeigen. Außerdem müssen Sie die Höhe und die Breite des Vollbilds angeben. (Sie können die Daten, die Höhe und die Breite des Vollbilds aus der Struktur DBvIOType für das Vollbild abrufen.) Beispielsweise setzen die folgenden Beispiele ein MPEG-1-Vollbild in ein 24-Bit-RGB-Format um:
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 */
Verwenden Sie die API DBvClose, um eine Videodatei zu schließen, die für die Aufnahmeermittlung geöffnet wurde. Wenn Sie die API verwenden, geben Sie einen Zeiger auf die Videostruktur für die Datei an.
Beispielsweise schließt die folgende Anweisung eine Videodatei, die für die Aufnahmeermittlung geöffnet wurde:
DBvIOType *video; rc=DBvClose (video);
Der Inhalt eines abgerufenen MPEG-1-Vollbild ist im YUV-Format. Dabei handelt es um ein Format, das von den meisten Programmen zur Abbildanzeige nicht angezeigt werden kann. Um ein abgerufenes Videovollbild anzeigen zu können, müssen Sie es in ein Format umsetzen, das von einem Programm zur Abbildanzeige verstanden wird, z. B. in das BMP-Format. Führen Sie beispielsweise folgende Schritte aus, um ein MPEG-1-Vollbild anzuzeigen:
Sie können die Informationen zu einer Aufnahme in einem Aufnahmekatalog speichern. Der Video Extender stellt APIs für folgende Funktionen zur Verfügung:
Katalogisierte Aufnahmen liefern die Eingabe für Storyboards: Nachdem Sie Aufnahmeinformationen in einem Aufnahmekatalog (in einer Datenbank oder Datei) gespeichert haben, können Sie diese Informationen in einer aufnahmebezogenen Anwendung verwenden. Beispielsweise können Sie eine Anwendung erstellen, die die repräsentativen Vollbilder für alle Aufnahmen in einem Video abruft und sie in einem Storyboard anzeigt.
Sie brauchen nur einen Aufnahmekatalog für eine Datenbank zu erstellen: Sie brauchen nur einen Aufnahmekatalog zu erstellen, wenn Sie wollen, daß der Katalog in einer Datenbank gespeichert wird. Der Video Extender erstellt automatisch eine Aufnahmekatalogdatei, wenn Sie Daten für die Aufnahmen in einem Video speichern und angeben, daß die Ausgabe in einer Datei erfolgen soll.
Bevor Sie einen Katalog in einer Datenbank erstellen und verwenden, müssen Sie
Verwenden Sie die API DBvCreateShotCatalog, um einen Aufnahmekatalog in einer Datenbank zu erstellen. (Der Video Extender erstellt
automatisch eine Aufnahmekatalogdatei, wenn Sie Daten für die Aufnahmen
speichern und angeben, daß die Ausgabe in einer Datei erfolgen
soll.) Der Katalog besteht aus Tabellen, die die aufnahmebezogenen
Informationen speichern. Sie können eine Sicht der Tabellen unter
Verwendung von SQL abfragen. In In der folgenden Tabelle werden die
Spalten in der Sicht gezeigt.
Tabelle 12. Spalten in der Sicht eines Aufnahmekatalogs
Spaltenname | Datentyp | Beschreibung |
---|---|---|
SHOTHANDLE | CHAR(36) | Aufnahmekennung |
VIDEOHANDLE | VARCHAR(254) | Videokennung. Die Spalte enthält nur einen Wert, wenn das Video mit der API DBvOpenHandle geöffnet wurde. |
VIDEOTABLE | VARCHAR(254) | Die Tabelle, die das Video enthält. Die Spalte enthält nur einen Wert, wenn das Video mit der API DBvOpenHandle geöffnet wurde. |
VIDEOCOLUMN | VARCHAR(254) | Die Tabellenspalte, die das Video enthält. Die Spalte enthält nur einen Wert, wenn das Video mit der API DBvOpenHandle geöffnet wurde. |
VIDEOFILE | VARCHAR(254) | Videodateiname. Die Spalte enthält nur einen Wert, wenn das Video mit der API DBvOpenFile geöffnet wurde. |
STARTFRAME | INTEGER | Nummer des ersten Vollbilds |
ENDFRAME | INTEGER | Nummer des letzten Vollbilds |
REPFRAME | INTEGER | Repräsentative Vollbildnummer |
REPFRAMEDATA | DB2IMAGE | Repräsentative Vollbilddaten |
COMMENTS | LONG VARCHAR | Kommentar |
Sie sind flexibel, wie viele Aufnahmekataloge Sie in einer Datenbank erstellen wollen und für welche Aufnahmen Sie Informationen in den einzelnen Aufnahmekatalogen speichern wollen. Sie können einen Katalog erstellen, um Aufnahmeinformationen für viele Videos zu speichern, können Aufnahmeinformationen für jedes Video in einem separaten Katalog speichern oder Informationen für mehrere Aufnahmen innerhalb eines Videos in mehreren Katalogen speichern.
Wenn Sie die API verwenden, müssen Sie einen Namen für den Katalog angeben. Namen, die länger als 16 Zeichen sind, werden abgeschnitten. Außerdem müssen Sie die Kennung für die Datenbankverbindung angeben, die durch den SQLConnect-Aufruf zur Datenbank zurückgegeben wird. Beispielsweise erstellen die folgenden Anweisungen einen Aufnahmekatalog '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 */
Sichten von Aufnahmekatalogen werden MMDBSYS.SVkatname genannt, wobei katname der Name des Aufnahmekatalogs ist. Beispielsweise hat eine Sicht des Katalogs 'hotshots' den Namen MMDBSYS.SVHOTSHOTS.
Verwenden Sie die API DBvInsertShot, um Informationen zu einer einzelnen Aufnahme in einem Aufnahmekatalog zu speichern. Sie können Informationen zu einer einzelnen Aufnahme in einem Video nur speichern, wenn sich der Aufnahmekatalog in einer Datenbank befindet. Zu den Informationen, die im Katalog gespeichert werden, gehören:
Ein Kommentar für die Aufnahme wird jedoch nicht gespeichert. Eine Beschreibung, wie Sie einen Kommentar zu den für eine Aufnahme gespeicherten Informationen hinzufügen können, befinden sich im Abschnitt Kommentar für eine Aufnahme angeben (nur Datenbank).
Wenn Sie die API DBvInsertShot verwenden, müssen Sie den Namen des Aufnahmekatalogs und einen Zeiger auf die Aufnahme angeben. Eine Möglichkeit, den Zeiger auf die Aufnahme zu setzen, besteht darin, die nächste Aufnahme abzurufen, wie im Abschnitt Aufnahme abrufen beschrieben. Außerdem müssen Sie die Kennung für die Datenbankverbindung angeben, die durch den SQLConnect-Aufruf zur Datenbank zurückgegeben wird. Beispielsweise rufen die folgenden Anweisungen die nächste Aufnahme nach dem Vollbild 1 auf und speichern anschließend die Informationen zur Aufnahme im Aufnahmekatalog '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*/
Verwenden Sie die API DBvBuildStoryboardTable oder DBvBuildStoryboardFile, um Informationen zu allen Aufnahmen eines Videos in einem Aufnahmekatalog zu speichern. Die API DBvBuildStoryboardTable speichert die Informationen in einem Aufnahmekatalog, der sich in einer Datenbank befindet. Die API DBvBuildStoryboardFile erstellt eine Aufnahmekatalogdatei und speichert die Informationen in dieser Datei.
Für jede der APIs kann das Quellenvideo in einer Datenbank oder einer Datei sein.
Wenn Sie eine der APIs verwenden, müssen Sie
Nur bei der API DBvBuildStoryboardTable müssen Sie außerdem die Kennung für die Datenbankverbindung angeben, die durch den SQLConnect-Aufruf zur Datenbank zurückgegeben wird.
Beispielsweise speichern die folgenden Anweisungen Informationen zu allen Aufnahmen eines Videos in einem Aufnahmekatalog. Der Aufnahmekatalog befindet sich in einer Datenbank.
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*/
Die folgenden Anweisungen erstellen eine Aufnahmekatalogdatei und speichern in dieser Datei Informationen zu allen Aufnahmen in einem Video.
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*/
Wie ihre Namen implizieren, sind die APIs DBvBuildStoryboardTable und DBvBuildStoryboardFile besonders geeignet, Informationen zu speichern, die in einem Storyboard verwendet werden sollen. Ein Storyboard ist eine visuelle Zusammenfassung eines Videos. Sie können ein Storyboard erstellen, indem Sie die repräsentativen Vollbilder anzeigen, die für ein Video in einem Aufnahmekatalog gespeichert wurden.
Die APIs DBvBuildStoryboardTable und DBvBuildStoryboardFile speichern ein oder mehrere repräsentative Vollbilder für eine Aufnahme. Die Werte, die Sie in der Struktur DBvStoryboardCtrl angeben, steuern die Anzahl der repräsentativen Vollbilder, die für eine Aufnahme speichert werden, und steuern, welche Vollbilder verwendet werden. Die Definition der Struktur DBvStoryboardCtrl befindet sich im Abschnitt Datenstrukturen bei der Aufnahmeermittlung. Die folgende Abbildung zeigt, wie die Werte in den DBvStoryboardCtrl-Feldern verwendet werden.
Abbildung 23. Verwendungsweise der Werte in der Struktur DBvStoryboardCtrl
Die Die Abbildung zeigt folgendes:
Jede Aufnahme kann als kurze Aufnahme verarbeitet werden, wenn der Wert Schwelle1 oder Schwelle2 auf -1 gesetzt wird. In diesem Fall wird nur ein repräsentatives Vollbild, das mittlere Vollbild, für die Aufnahme im Aufnahmekatalog gespeichert.
Neben den Werten in der Datenstruktur DBvStoryboardCtrl hat eine Reihe von Feldern in der Datenstruktur DBvShotControl Auswirkungen darauf, welche repräsentativen Vollbilder für eine nachfolgende Anzeige in einem Storyboard gespeichert werden. Beispielsweise geben die Felder CorrHistThresh, normalcorrValue und minShotSize in der Datenstruktur DBvShotControl Schwellen für die Aufnahmeermittlung an und beeinflussen somit, welche Vollbilder in einem Storyboard eines Videos angezeigt werden. Wenn Sie die API DBvBuildStoryBoardTable und die API DBvBuildStoryBoardFile verwenden, um Aufnahmeinformationen zur Verwendung in einem Storyboard zu speichern, müssen Sie zunächst einen Testlauf mit den Anfangswerten für die Datenstrukturen DBvStoryBoardCtrl und DBvShotControl ausführen. Sie können dann Ihre Ergebnisse optimieren, indem Sie die Werte in den verschiedenen Feldern dieser Datenstrukturen ändern.
Sie können ein Programm erstellen, mit dem ein Storyboard angezeigt wird. Sie greifen dazu auf die repräsentativen Vollbilder zu, die in einem Aufnahmekatalog für ein Video gespeichert sind. Wenn die API DBvBuildStoryboardFile zum Speichern der Aufnahmen für das Video verwendet wurde, zeigt die Aufnahmekatalogdatei auf GIF-Dateien für die repräsentativen Vollbilder. Sie können diese GIF-Dateien mit Hilfe eines geeigneten Browsers oder Anzeigeprogramms anzeigen.
Wenn die API DBvBuildStorybBoardTable zum Speichern der Aufnahmen für das Video verwendet wurde, enthält der Aufnahmekatalog (der in einer Datenbank gespeichert ist) die Daten für die repräsentativen Vollbilder. Sie können auf die Daten von repräsentativen Vollbildern in der Aufnahmekatalogsicht zugreifen (eine Beschreibung der Sicht befindet sich in Tabelle 12). Die Daten von repräsentativen Vollbildern sind im YUV-Format. Dabei handelt es um ein Format, das von den meisten Programmen zur Abbildanzeige nicht angezeigt werden kann. Um die repräsentativen Vollbilder anzuzeigen, können Sie die Vollbilddaten mit Hilfe der API DBvFrameDatato24BitRGB (wie in Abgerufenes Vollbild anzeigen beschrieben) umsetzen. Sie können anschließend die repräsentativen Vollbilder mit Hilfe eines geeigneten Browsers oder Anzeigeprogramms anzeigen.
Das Unterverzeichnis SAMPLES enthält zwei Beispielprogramme, die das Erstellen und Anzeigen eines Storyboards für ein Video demonstrieren. Ein Beispielprogramm, in der Datei MAKESF.EXE, verwendet die API DBvBuildStoryBoardFile, um eine Aufnahmekatalogdatei zu erstellen und Aufnahmedaten in der Datei zu speichern. Das andere Beispielprogramm, MAKEHTML.EXE, greift auf die Aufnahmekatalogdatei zu und erstellt HTML-Seiten für die Anzeige durch einen Web-Browser.
Sie können einen Kommentar angeben, der mit den anderen Informationen für eine Aufnahme in einem Aufnahmekatalog gespeichert werden soll. Verwenden Sie die API DBvSetShotComment, um den Kommentar anzugeben.
Wenn Sie die API verwenden, müssen Sie den Namen des Aufnahmekatalog angeben, in dem der Kommentar gespeichert werden soll, die Kennung der Aufnahme, zu der der Kommentar hinzugefügt werden soll, sowie den Kommentar. Außerdem müssen Sie die Kennung für die Datenbankverbindung angeben, die durch den SQLConnect-Aufruf zur Datenbank zurückgegeben wird. Beispielsweise fügen die folgenden Anweisungen einen Kommentar für eine Aufnahme (die mit der Vollbildnummer 85 beginnt) zum Aufnahmekatalog 'hotshots' hinzu:
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*/
Sie können die Information, die für eine Aufnahme in einem Aufnahmekatalog gespeichert sind, ändern. Verwenden Sie dazu die API DBvUpdateShot. Stellen Sie die Ersetzungsinformationen in eine Struktur DBvShotType. Sie müssen außerdem Informationen für die übrigen Felder angeben, auch wenn diese unverändert bleiben. Wenn Sie die API DBvUpdateShot verwenden, geben Sie den Namen des Katalogs und einen Zeiger auf die Struktur DBvShotType an. Außerdem müssen Sie die Kennung für die Datenbankverbindung angeben, die durch den SQLConnect-Aufruf zur Datenbank zurückgegeben wird.
Wenn Sie die Informationen für die Aufnahme ändern, haben Sie die Möglichkeit, den Kommentar, der (falls vorhanden) mit den Informationen gespeichert ist, zu ändern. Wenn Sie den Kommentar ändern wollen, geben Sie ihn in der Struktur DBvShotType an. Wenn Sie den alten Kommentar beibehalten wollen, geben Sie einen Nullwert in der Struktur DBvShotType an.
Beispielsweise ändern die folgenden Anweisungen die Informationen, die für eine Aufnahme im Katalog 'hotshots' gespeichert sind; die Aufnahme beginnt bei Vollbildnummer 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*/
Sie können die Informationen, die für zwei Aufnahmen in einem Aufnahmekatalog gespeichert sind, mischen. Wenn Sie Aufnahmeinformationen mischen, geben Sie eine Reihenfolge an, indem Sie eine erste und eine zweite Aufnahme kennzeichnen. Die Anfangsvollbildnummer der ersten Aufnahme wird als Anfangsvollbildnummer der gemischten Aufnahme gespeichert. Die Nummer des größten Vollbilds zwischen der ersten und zweiten Aufnahme wird als Endvollbildnummer der gemischten Aufnahme gespeichert. Beim Mischen werden die Informationen, die für die erste Aufnahme gespeichert sind, durch die Informationen für die gemischte Aufnahme ersetzt. Die Informationen, die für die zweite Aufnahme gespeichert sind, werden aus dem Aufnahmekatalog gelöscht.
Verwenden Sie die API DBvMergeShots, um die Informationen für zwei Aufnahmen in einem Aufnahmekatalog zu mischen. Wenn Sie die API verwenden, geben Sie den Namen des Aufnahmekatalogs, gefolgt von den Kennungen der ersten und zweiten Aufnahme an, die gemischt werden sollen. Außerdem müssen Sie die Kennung für die Datenbankverbindung angeben, die durch den SQLConnect-Aufruf zur Datenbank zurückgegeben wird. Beispielsweise mischen die folgenden Anweisungen die Informationen, die für zwei Aufnahmen im Katalog 'hotshots' gespeichert sind; die erste Aufnahme beginnt bei Vollbildnummer 85, und die zweite Aufnahme beginnt bei Vollbildnummer 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*/
Verwenden Sie die API DBvDeleteShot, um Informationen zu einer Aufnahme aus dem Aufnahmekatalog zu löschen. Wenn Sie die API verwenden, geben Sie den Namen des Aufnahmekatalogs, gefolgt von der Aufnahmekennung an. Außerdem müssen Sie die Kennung für die Datenbankverbindung angeben, die durch den SQLConnect-Aufruf zur Datenbank zurückgegeben wird. Beispielsweise löschen die folgenden Anweisungen die Informationen zu einer Aufnahme (die bei Vollbildnummer 85 beginnt) aus dem Aufnahmekatalog 'hotshots':
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*/
Verwenden Sie die API DBvDeleteShotCatalog, um einen Aufnahmekatalog zu löschen. Wenn Sie die API verwenden, geben Sie den Namen des zu löschenden Aufnahmekatalogs und die Kennung für die Datenbankverbindung an, die durch den SQLConnect-Aufruf zur Datenbank zurückgegeben wird. Beispielsweise löscht die folgende Anweisung den Aufnahmekatalog 'hotshots':
SQLHDBC hdbc; SQLHENV henv; rc=DBvDeleteShotCatalog ( "hotshots", /*shot catalog name*/ hdbc); /*database connection handle*/