在資料流程中的位置
AVIFile 提供數種方式來尋找並移至資料流程中的位置。 本節中的函式和宏可讓您的應用程式尋找開始位置、長度和主要畫面格, (包含資料流程內範例) 的完整影像。 函式和宏也會藉由計算從資料流程開始到資料流程中任何點所耗用的時間,將時間與資料流程中的位置產生關聯。
尋找起始位置
您可以使用 AVIStreamStart 函式,擷取影片串流中第一個畫面的範例編號。 (視 author.) 您也可以使用 AVIStreamInfo 函式取得此資訊,影片的畫面可能從範例 0 或 1 開始。 此函式會將範例編號儲存在AVISTREAMINFO結構的dwStart成員中。 您可以使用 AVIStreamStartTime 宏來擷取資料流程第一個範例的開始時間。
您可以使用 AVIStreamLength 函式來擷取資料流程長度。 此函式會傳回資料流程中的樣本數目。 您也可以使用 AVIStreamInfo 函式來取得此資訊。 此函式會將資料流程長度儲存在AVISTREAMINFO結構的dwLength成員中。 若要以毫秒為單位擷取資料流程的長度,請使用 AVIStreamLengthTime 宏。
在視訊資料流程中,每個範例通常會對應到影片框架。 不過,可能有沒有視訊資料的範例。 如果您呼叫指定其中一個位置的 AVIStreamRead 函式,它會傳回 0 個位元組的資料長度。 您可以使用 AVIStreamFindSample 函式並指定FIND_ANY旗標來尋找包含資料的範例。
在音訊資料流程中,每個範例都會對應至音訊資料的一個資料區塊。 例如,如果音訊資料具有 22 kHz ADPCM (調適性差異脈衝訊號) 格式, 則 AVIStreamLength 的每個範例都會對應至壓縮音訊資料的 256 個位元組區塊。 未壓縮時,此音訊資料區塊包含大約 500 個音訊樣本。 不過,AVIFile 的函式和宏會將每個 256 位元組區塊視為單一範例。
注意
資料流程範圍從開頭到資料流程結尾的有效位置,也就是資料流程起點及其長度的總和。 由開始位置的總和所代表的位置,而長度會對應到最後一個資料轉譯之後的時間;不包含任何資料。 您可以使用 AVIStreamEnd 宏來擷取代表資料流程結尾的範例編號。 您可以使用 AVIStreamEndTime 宏,以毫秒為單位擷取代表資料流程結尾的時間值。
尋找範例和主要畫面格
您可以使用 AVIStreamFindSample 函式,在資料流程中搜尋不同類型的樣本。 此函式會向後搜尋或向前搜尋適當類型的樣本,從您指定的樣本編號開始。 您可以藉由在 AVIStreamFindSample 呼叫序列中指定旗標,在資料流程中搜尋不同類型的樣本。 指定FIND_ANY旗標來找出無空樣本,或略過缺少資料的樣本。 指定FIND_KEY旗標,以搜尋包含要呈現完整影像之資料的主要畫面格,而不需要參考先前的畫面格。 指定要搜尋格式變更的FIND_FORMAT旗標。 AVIStreamFindSample 主要用於視訊串流。
使用 AVIFile 函式的數個宏會補充串流搜尋功能。 下列清單提供每個宏的簡短描述。 搜尋特定位置或資料類型的宏需要在資料流程中指定起始位置。
巨集 | 描述 |
---|---|
AVIStreamIsKeyFrame | 指出指定資料流程中的範例是否為主要畫面格。 |
AVIStreamNearestKeyFrame | 找出資料流程中指定位置之前的主要畫面格。 |
AVIStreamNearestKeyFrameTime | 決定對應至主要畫面格開頭的時間,該時間最接近 (或之前) 資料流程中的指定時間。 |
AVIStreamNearestSample | 找出資料流程中指定位置或前面最接近的無空樣本。 |
AVIStreamNearestSampleTime | 決定對應至資料流程中最接近指定時間之樣本開頭的時間。 |
AVIStreamNextKeyFrame | 找出在資料流程中指定位置之後的下一個主要畫面格。 |
AVIStreamNextKeyFrameTime | 傳回資料流程中下一個主要畫面格的時間,從指定時間開始。 |
AVIStreamNextSample | 從資料流程中指定的位置找出下一個無空樣本。 |
AVIStreamNextSampleTime | 傳回範例變更至資料流程中下一個範例的時間。 |
AVIStreamPrevKeyFrame | 找出在資料流程中指定位置之前的主要畫面格。 |
AVIStreamPrevKeyFrameTime | 傳回資料流程中上一個主要畫面格的時間,從指定時間開始。 |
AVIStreamPrevSample | 找出在資料流程中指定位置之前的無空範例。 |
AVIStreamPrevSampleTime | 決定前一個範例在資料流程中取代其前置任務的時間。 |
AVIStreamSampleToSample | 傳回與第二個數據流中所發生的樣本同時發生的資料流程中的範例。 |
在範例與時間之間切換
您可以使用 AVIStreamSampleToTime 函式,判斷從資料流程開頭到樣本經過的時間。 此函式會將樣本編號轉換為以毫碼錶示的時間值。 對於跨越數毫秒) 的視訊畫面 (,此值代表範例開始播放的時間,並假設視訊剪輯以正常速度播放。 對於音訊範例 (,其數個樣本以毫秒為單位) ,時間值會對應至範例開始播放的時間,並假設音訊串流以正常速度播放。
相反地,您可以使用 AVIStreamTimeToSample 函式來尋找與時間值相關聯的樣本編號。 此函式會將毫秒值轉換為樣本編號,並假設影片剪輯以正常速度播放。
因為 AVIStreamSampleToTime 會傳回畫面開始播放的時間, 所以 AVIStreamSampleToTime 與 AVIStreamTimeToSample 之間的關聯性不是真正的反轉。 它們會比判斷時間更遞迴地判斷檔案中的位置。 例如,兩個連續的音訊樣本可能會以相同的毫秒播放。 使用 AVIStreamSampleToTime 轉換樣本數會導致相同的時間值。 如果您使用 AVIStreamTimeToSample將時間值轉換回樣本編號,則會參考單一樣本。