Positionierung in Streams
AVIFile bietet mehrere Möglichkeiten, eine Position in einem Datenstrom zu suchen und an diese zu verschieben. Mit den Funktionen und Makros in diesem Abschnitt kann Ihre Anwendung die Anfangsposition, Die Länge und die Keyframes (die ein vollständiges Bild im Beispiel enthalten) innerhalb eines Streams finden. Die Funktionen und Makros ordnen außerdem Zeit Positionen in einem Stream zu, indem sie die verstrichene Zeit berechnen, die für die Wiedergabe eines Streams vom Anfang bis zu einem beliebigen Punkt in einem Stream benötigt wird.
Suchen der Anfangsposition
Sie können die Beispielnummer des ersten Frames in einem Videostream mithilfe der AVIStreamStart-Funktion abrufen. (Die Frames eines Film beginnen je nach Vorliebe des Autors möglicherweise bei Beispiel 0 oder 1.) Sie können diese Informationen auch mithilfe der AVIStreamInfo-Funktion abrufen. Diese Funktion speichert die Beispielnummer im dwStart-Element der AVISTREAMINFO-Struktur. Sie können die Startzeit des ersten Beispiels eines Streams mithilfe des MAKROS AVIStreamStartTime abrufen.
Sie können die Streamlänge mithilfe der FUNKTION AVIStreamLength abrufen. Diese Funktion gibt die Anzahl der Stichproben 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 Makro AVIStreamLengthTime, um die Länge eines Streams in Millisekunden abzurufen.
In einem Videostream entspricht jedes Beispiel in der Regel einem Videoframe. Möglicherweise gibt es jedoch Beispiele, für die keine Videodaten vorhanden sind. Wenn Sie die AVIStreamRead-Funktion aufrufen, die eine dieser Positionen angibt, wird eine Datenlänge von 0 Bytes zurückgegeben. 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 von 22 kHz (Adaptive Differential Pulse Code Codes) haben, entspricht jedes Beispiel für AVIStreamLength einem Block von 256 Bytes komprimierter Audiodaten. Dieser Block mit Audiodaten enthält ungefähr 500 Audiobeispiele, wenn er unkomprimiert ist. 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 Streams, d.&a0;b. die Summe des Streamstartpunkts und seiner Länge. Die Position, die durch die Summe der Anfangsposition und die Länge dargestellt wird, entspricht einer Zeit nach dem Rendern der letzten Daten. es enthält keine Daten. Sie können die Beispielnummer abrufen, die das Ende des Streams darstellt, indem Sie das MAKRO AVIStreamEnd verwenden. Sie können den Zeitwert in Millisekunden abrufen, der das Ende des Streams darstellt, indem Sie das MAKRO AVIStreamEndTime verwenden.
Suchen von Beispiel- und Keyframes
Sie können mithilfe der FUNKTION AVIStreamFindSample nach verschiedenen Arten von Beispielen 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 in einem Stream nach verschiedenen Arten von Beispielen suchen, indem Sie ein Flag in der aufrufenden Sequenz AVIStreamFindSample angeben. Geben Sie das Flag FIND ANY an, um nicht zu viele Beispiele zu suchen oder Beispiele _ ohne Daten zu überspringen. 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 der 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 eine Startposition, die im Stream angegeben werden muss.
| Makro | Beschreibung |
|---|---|
| AVIStreamIsKeyFrame | Gibt an, ob ein Beispiel in einem angegebenen Stream ein Keyframe ist. |
| AVIStreamStreamStreamrestKeyFrame | Sucht den Keyframe an oder vor einer angegebenen Position in einem Stream. |
| AVIStreamStreamStreamRestKeyFrameTime | Bestimmt die Zeit, die dem Anfang des Keyframes entspricht, der einer angegebenen Zeit in einem Stream am nächsten ist (oder vorangehender Zeitpunkt). |
| AVIStreamStreamStreamrestSample | Sucht das nächste nicht entfernte Beispiel an oder vor einer angegebenen Position in einem Stream. |
| AVIStreamStreamStreamRestSampleTime | Bestimmt die Zeit, die dem Anfang eines Beispiels entspricht, das einer angegebenen Zeit in einem Stream am nächsten liegt. |
| 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 abfälsige Beispiel von einer angegebenen Position in einem Stream. |
| AVIStreamNextSampleTime | Gibt die Zeit zurück, zu der ein Beispiel zum nächsten Beispiel im Stream wechselt. |
| AVIStreamPrevKeyFrame | Sucht den Keyframe, der einer angegebenen Position in einem Stream vorausgegangen ist. |
| AVIStreamPrevKeyFrameTime | Gibt die Zeit des vorherigen Keyframes im Stream zurück, beginnend zu einem bestimmten Zeitpunkt. |
| AVIStreamPrevSample | Sucht das nicht abfälsige Beispiel, das einer angegebenen Position in einem Stream vorausgegangen ist. |
| AVIStreamPrevSampleTime | Bestimmt den Zeitpunkt, zu dem das vorherige Beispiel seinen Vorgänger im Stream ersetzt. |
| AVIStreamSampleToSample | Gibt die Stichprobe in einem Stream zurück, der gleichzeitig mit einer Stichprobe auftritt, die in einem zweiten Stream auftritt. |
Wechseln zwischen Beispielen und Zeit
Sie können die verstrichene Zeit vom Anfang eines Streams bis zu einem Beispiel mithilfe der FUNKTION AVIStreamSampleToTime bestimmen. Diese Funktion konvertiert die Beispielnummer in einen Zeitwert in Millisekunden. Bei einem Videoframe (der mehrere Millisekunden umfasst) stellt dieser Wert die Zeit dar, zu der das Beispiel ab dem Beginn der Wiedergabe abspielt, und es wird davon ausgegangen, dass der Videoclip mit normaler Geschwindigkeit abspielt. Bei einem Audiobeispiel (mit mehreren Stichproben in millisekunden) entspricht der Zeitwert der Zeit, zu der das Beispiel abspielt, und es wird davon ausgegangen, dass der Audiostream mit normaler Geschwindigkeit abspielt.
Umgekehrt können Sie die einem Zeitwert zugeordnete Beispielnummer mithilfe der AVIStreamTimeToSample-Funktion finden. Diese Funktion konvertiert den Millisekundenwert in eine Beispielnummer und setzt voraus, dass der Videoclip mit normaler Geschwindigkeit abspielt.
Da AVIStreamSampleToTime den Zeitpunkt zurückgibt, zu dem ein Frame abspielt, ist die Beziehung zwischen AVIStreamSampleToTime und AVIStreamTimeToSample nicht wirklich umgekehrt. Sie bestimmen die Position in einer Datei akursiver als die Zeit. Beispielsweise können zwei aufeinander folgende Audiobeispiele in derselben Millisekunde abspielt 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.