Share via


Positionierung in Streams

AVIFile bietet mehrere Möglichkeiten zum Suchen und Verschieben einer Position in einem Datenstrom. Mit den Funktionen und Makros in diesem Abschnitt können Ihre Anwendung die Startposition, Länge und Keyframes (mit einem vollständigen Bild im Beispiel) in einem Stream finden. Die Funktionen und Makros ordnen die Zeit auch Positionen in einem Stream zu, indem sie die verstrichene Zeit berechnen, die zum Wiedergeben eines Datenstroms von seinem Anfang bis zu einem beliebigen Punkt in einem Stream erforderlich ist.

Suchen der Startposition

Sie können die Beispielnummer des ersten Frames in einem Videostream abrufen, indem Sie die AVIStreamStart-Funktion verwenden. (Die Frames eines Films können je nach Vorliebe des Autors bei Beispiel 0 oder 1 beginnen.) Sie können diese Informationen auch mithilfe der AVIStreamInfo-Funktion abrufen. Diese Funktion speichert die Beispielnummer im dwStart-Member der AVISTREAMINFO-Struktur . Sie können die Startzeit des ersten Beispiels eines Datenstroms mithilfe des AVIStreamStartTime-Makros abrufen.

Sie können die Streamlänge mithilfe der FUNKTION AVIStreamLength abrufen. Diese Funktion gibt die Anzahl der Beispiele im Stream zurück. Sie können diese Informationen auch mithilfe der AVIStreamInfo-Funktion abrufen. Diese Funktion speichert die Streamlänge im dwLength-Member der AVISTREAMINFO-Struktur . Verwenden Sie das AVIStreamLengthTime-Makro , um die Länge eines Datenstroms in Millisekunden abzurufen.

In einem Videostream entspricht jedes Beispiel in der Regel einem Videoframe. Es kann jedoch Beispiele geben, für die keine Videodaten vorhanden sind. Wenn Sie die AVIStreamRead-Funktion aufrufen, die eine dieser Positionen angibt, gibt sie eine Datenlänge von 0 Bytes zurück. Sie können Beispiele finden, die Daten enthalten, indem Sie die FUNKTION AVIStreamFindSample verwenden und das flag FIND_ANY angeben.

In einem Audiostream entspricht jedes Beispiel einem Datenblock mit Audiodaten. Wenn die Audiodaten beispielsweise ein ADPCM-Format (Adaptive Differential Pulse Code Modulation) von 22 kHz aufweisen, entspricht jedes Beispiel für AVIStreamLength einem Block von 256 Bytes komprimierter Audiodaten. Dieser Audiodatenblock enthält etwa 500 Audiobeispiele, wenn er nicht komprimiert wird. Die Funktionen und Makros von AVIFile behandeln jedoch jeden 256-Byte-Block als einzelnes Beispiel.

Hinweis

Gültige Positionen innerhalb eines Datenstrombereichs vom Anfang bis zum Ende des Datenstroms. Dies ist die Summe des Streamstartpunkts und seiner Länge. Die Position, die durch die Summe der Startposition und der Länge dargestellt wird, entspricht einer Zeit nach dem Rendern der letzten Daten; Sie enthält keine Daten. Sie können die Beispielnummer abrufen, die das Ende des Datenstroms darstellt, indem Sie das AVIStreamEnd-Makro verwenden. Sie können den Zeitwert in Millisekunden abrufen, der das Ende des Datenstroms darstellt, indem Sie das AVIStreamEndTime-Makro verwenden.

 

Suchen nach Beispielen und Keyframes

Sie können mit der FUNKTION AVIStreamFindSample nach verschiedenen Beispieltypen in einem Stream suchen. Diese Funktion durchsucht einen Stream rückwärts oder vorwärts nach einem Beispiel des entsprechenden Typs, beginnend mit der von Ihnen angegebenen Beispielnummer. Sie können nach verschiedenen Beispieltypen in einem Stream suchen, indem Sie ein Flag in der AUFRUFSEQUENZ AVIStreamFindSample angeben. Geben Sie das Flag FIND_ANY an, um nicht ernenkliche Beispiele zu suchen oder Um Beispiele zu überspringen, für die keine Daten fehlen. Geben Sie das Flag FIND_KEY an, um nach Keyframes zu suchen, die die Daten enthalten, um ein vollständiges Bild zu rendern, ohne auf vorherige Frames verweisen zu müssen. Geben Sie das flag FIND_FORMAT an, um nach Änderungen am Format zu suchen. AVIStreamFindSample wird hauptsächlich mit Videostreams verwendet.

Mehrere Makros, die AVIFile-Funktionen verwenden, ergänzen die Funktionen für die Streamsuche. Die folgende Liste enthält eine kurze Beschreibung der einzelnen Makros. Die Makros, die nach einer bestimmten Position oder einem bestimmten Datentyp suchen, erfordern die Angabe eines Startstandorts im Stream.

Makro Beschreibung
AVIStreamIsKeyFrame Gibt an, ob ein Beispiel in einem angegebenen Stream ein Keyframe ist.
AVIStreamNearestKeyFrame Sucht den Keyframe an oder vor einer angegebenen Position in einem Stream.
AVIStreamNearestKeyFrameTime Bestimmt die Zeit, die dem Beginn des Keyframes entspricht, der (zu oder vor) einer angegebenen Zeit in einem Stream am nächsten ist.
AVIStreamNearestSample Sucht die nächste nicht erlösende Stichprobe an oder vor einer angegebenen Position in einem Stream.
AVIStreamNearestSampleTime Bestimmt die Zeit, die dem Anfang eines Beispiels entspricht, das einer angegebenen Zeit in einem Stream am nächsten ist.
AVIStreamNextKeyFrame Sucht den nächsten Keyframe nach einer angegebenen Position in einem Stream.
AVIStreamNextKeyFrameTime Gibt die Zeit des nächsten Keyframes in einem Stream zurück, beginnend zu einem bestimmten Zeitpunkt.
AVIStreamNextSample Sucht das nächste nicht erlösende Beispiel an einer angegebenen Position in einem Stream.
AVIStreamNextSampleTime Gibt die Zeit zurück, zu der ein Beispiel in das nächste Beispiel im Stream wechselt.
AVIStreamPrevKeyFrame Sucht den Schlüsselrahmen, der einer angegebenen Position in einem Stream vorangestellt ist.
AVIStreamPrevKeyFrameTime Gibt die Zeit des vorherigen Keyframes im Stream zurück, beginnend zu einem bestimmten Zeitpunkt.
AVIStreamPrevSample Sucht das nicht ernutzte Beispiel, das einer angegebenen Position in einem Stream vorangeht.
AVIStreamPrevSampleTime Bestimmt den Zeitpunkt, zu dem das vorherige Beispiel seinen Vorgänger im Stream ersetzt.
AVIStreamSampleToSample Gibt das Beispiel in einem Stream zurück, der gleichzeitig mit einem Beispiel auftritt, das in einem zweiten Datenstrom auftritt.

 

Wechseln zwischen Stichproben und Zeit

Sie können die verstrichene Zeit vom Anfang eines Datenstroms bis zu einem Beispiel mithilfe der AVIStreamSampleToTime-Funktion ermitteln. Diese Funktion konvertiert die Beispielnummer in einen In Millisekunden ausgedrückten Zeitwert. Für einen Videoframe (der sich über mehrere Millisekunden erstreckt) stellt dieser Wert die Zeit dar, zu der das Beispiel seit Beginn der Wiedergabe beginnt, und setzt voraus, dass der Videoclip mit normaler Geschwindigkeit wiedergegeben wird. Bei einem Audiobeispiel (mit mehreren Beispielen in einer Millisekunde) entspricht der Zeitwert dem Zeitpunkt, zu dem das Sample mit der Wiedergabe beginnt, und geht davon aus, dass der Audiodatenstrom mit normaler Geschwindigkeit wiedergegeben wird.

Umgekehrt können Sie die Beispielnummer ermitteln, die einem Zeitwert zugeordnet ist, indem Sie die FUNKTION AVIStreamTimeToSample verwenden. Diese Funktion konvertiert den Millisekundenwert in eine Beispielnummer und setzt voraus, dass der Videoclip mit normaler Geschwindigkeit wiedergegeben wird.

Da AVIStreamSampleToTime die Zeit zurückgibt, zu der ein Frame abgespielt wird, ist die Beziehung zwischen AVIStreamSampleToTime und AVIStreamTimeToSample nicht wirklich umgekehrt. Sie bestimmen die Position in einer Datei mehr als die Zeit. Beispielsweise können zwei aufeinander folgende Audiobeispiele in derselben Millisekunde wiedergegeben werden. Die Verwendung von AVIStreamSampleToTime zum Konvertieren der Beispielnummern würde zu identischen Zeitwerten führen. Wenn Sie den Zeitwert mithilfe von AVIStreamTimeToSample zurück in eine Beispielnummer konvertieren, wird auf ein einzelnes Beispiel verwiesen.