AVI族函數的說明

1AVIBuildFilter
2AVIClearClipboard
3AVIFileAddRef
4AVIFileCreateStream
5AVIFileEndRecord
6AVIFileExit
7AVIFileGetStream
8AVIFileInfo
9AVIFileInit
10AVIFileOpen
11AVIFileReadData
12AVIFileRelease
13AVIFileWriteData
14AVIGetFromClipboard
15AVIMakeCompressedStream
16AVIMakeFileFromStreams
17AVIMakeStreamFromClipboard
18AVIPutFileOnClipboard


19AVISave
20AVISaveOptions
21AVISaveOptionsFree
22AVISaveV


23AVIStreamAddRef
24AVIStreamBeginStreaming
25AVIStreamCreate
26AVIStreamEndStreaming
27AVIStreamFindSample
28AVIStreamGetFrame
29AVIStreamGetFrameClose
30AVIStreamGetFrameOpen
31AVIStreamInfo
32AVIStreamLength
33AVIStreamOpenFromFile
34AVIStreamRead
35AVIStreamReadData
36AVIStreamReadFormat
37AVIStreamRelease
38AVIStreamSampleToTime
39AVIStreamSetFormat
40AVIStreamStart
41AVIStreamTimeToSample
42AVIStreamWrite
43AVIStreamWriteData


44CreateEditableStream

45EditStreamClone
46EditStreamCopy
47EditStreamCut
48EditStreamPaste
49EditStreamSetInfo
50EditStreamSetName

總共50個函數,他們的用途主要有兩類,一個是avi文件的操作,一類是數據流streams的操作。下面分別解析。

1文件操作

1.1打開和關閉文件

  AVIFileOpen AVIFileAddRef

  AVIFileRelease

1.2從文件中讀取文件信息

通過AVIFileInfo可以獲取avi文件的一些信息,這個函數返回一個AVIFILEINFO結構

通過AVIFileReadData可以用來獲取AVIFileInfo函數得不到的信息。這些信息也許不包含在文件的頭部,比如擁有file的公司和個人的名稱。

1.3寫入文件信息

可以通過AVIFileWriteData函數來寫入文件的一些額外信息。

1.4使用粘貼板

  AVIPutFileOnClipboard函數可以將一個avi複製到粘貼板上

  AVIGetFromClipboard函數可以將粘貼板上的avi寫入到內存或者硬盤中。

  AVIClearClipboard用來清除粘貼板

2數據流操作

2.1打開和關閉一個流

 打開一個數據流就跟打開文件一樣,你可以通過 AVIFileGetStream函數來打開一個數據流,這個函數創建了一個流的接口,然後在該接口中保存了一個句柄。

 如果你想操作文件的某一個單獨的流,你可以採用AVIStreamOpenFromFile函數,這個函數綜合了AVIFileOpenAVIFileGetStream函數。

 如果你想操作文件中的多個數據流,你就要首先AVIFileOpen,然後AVIFileGetStream

 

 可以通過AVIStreamAddRef來增加stream接口的引用。

通過AVIStreamRelease函數來關閉數據流。這個函數用來減少streams的引用計數,當計數減少爲0時,刪除。

2.2從流中讀取數據和信息

AVIStreamInfo函數可以獲取數據的一些信息,該函數返回一個AVISTREAMINFO結構,該結構包含了數據的類型壓縮方法,建議的buffersize,回放的rate,以及一些description

   如果數據流還有一些其它的額外的信息,你可以通過AVIStreamReadData函數來獲取。應用程序分配一個內存,傳遞給這個函數,然後這個函數會通過這個內存返回數據流的信息,額外的信息可能包括數據流的壓縮和解壓縮的方法,你可以通過AVIStreamDataSize宏來回去需要申請內存塊的大小。

   可以通過AVIStreamReadFormat函數獲取數據流的格式信息。這個函數通過指定的內存返回數據流的格式信息,比如對於視頻流,這個buffer包含了一個BIMAPINFO結構,對於音頻流,內存塊包含了WAVEFORMATEX或者PCMAVEFORMAT結構。你可以通過給AVIStreamReadFormat傳遞一個空buffer就可以獲取buffer的大小。也可以通過AVIStreamFormatSize宏。

  可以通過AVIStreamRead函數來返回多媒體的數據。這個函數將數據複製到應用程序提供的內存中,對於視頻流,這個函數返回圖像禎,對於音頻流,這個函數返回音頻的sample數據。可以通過給AVIStreamRead傳遞一個NULLbuffer來獲取需要的buffer的大小。也可以通過AVIStreamSampleSize宏來獲取buffer的大小。

  有些AVI數據流句柄可能需要在啓動數據流的前要做一下準備工作,此時,我們可以調用AVIStreamBeginStreaming函數來告知AVI數據流handle來申請分配它需要的一些資源。在完畢後,調用AVIStreamEndStreamming函數來釋放資源。

2.3操作壓縮的視頻數據

  如果你要演示一禎或者幾禎壓縮視頻圖像時,你可以調用AVIStreamRead函數,將獲取的數據傳遞給DrawDib函數來顯示圖像。這些函數可以顯示壓縮和未壓縮的圖像。

  AVIFile也提供了一個函數AVIStreamGetFrameOpen,來獲取未壓縮的視頻禎,這個函數創建了內存來獲取未壓縮的數據。也可以通過AVIStreamGetFrame函數來解壓縮一個單獨的視頻禎。這個函數可以解壓縮某一禎圖像,然後將數據以一個BIMAPINFOHEADER結構返回。當你調用完AVIStreamGetFrame函數後,要調用AVIStreamGetFrameClose函數釋放上一個函數申請的資源。

2.4根據已存在的數據流創建文件

   創建一個包含多個數據流的文件的方法就是整合多個數據流,將其寫入一個新文件。這些數據流可以是內存中的數據,也可以是存在於另一個文件中。

  我們可以用AVISave這個函數來build一個文件。這個函數可以創建一個文件,並且將指定的多個數據流按照指定的順序寫入文件,你也可以通過AVISaveV函數來創建一個新的文件,這個函數的功能和AVISave的功能一樣,主要區別是AVISaveV採用的數據流數組,而AVISave是單個的數據流,多次保存。

  我們可以調用AVISaveOptions函數來顯示一個對話框,可以讓用戶來選擇壓縮方式。

  我們可以在調用AVISaveAVISaveV函數時指定一個回調函數,用來顯示avi文件的生成進度,可以讓用戶隨時地取消生成avi文件。

  我們可以調用GetSaveFileNamePreview函數來顯示保存的對話框讓用戶選擇保存的文件名。

  通過AVIMakeFileFromStreams函數我們可以創建一個虛擬的文件句柄,其他的avi函數可以通過這個虛擬的文件句柄來操作文件中的數據流,操作完畢要記得調用AVIFileRelease釋放。

2.5向文件寫入一個數據流

 我們可以通過AVIFileCreateStream函數來在一個新文件或者已經存在的文件中創建一個數據流。這個函數根據AVISTREAMINFO結構定義了新的數據流,併爲新的數據流創建一個接口,返回接口的指針。

  在寫入新的數據前,一定要指定流的格式信息,通過AVIStreamSetFormat函數,當設置一個視頻流的時候,一定要使用BIMAPINFO結構來設置,音頻就用WAVEFORMAT

  然後我們就可以通過AVIStreamWrite函數將我們的多媒體數據寫入數據流了。這個函數將應用程序提供的內存數據複製到指定的流。缺省的avi handler將數據寫入流的最後。

  如果你有其他額外的信息需要寫入流,你可以調用AVIFileWriteData或者AVIStreamWriteData

 最後記得在完成數據寫入後,要調用AVIStreamRelease

2.6數據流中的禎的位置

 尋找起始禎:

  可以通過AVIStreamStart函數來獲取第一禎包含的sample number。也可以通過AVIStreamInfo函數來獲取這個信息,這個函數的AVISTREAMINFO結構中包含了dwStart,可以通過AVIStreamStartTime宏來獲取第一個sample

  可以通過AVIStreamLength函數來獲取流的長度。這個函數返回流中的sample的數目。也可以通過AVIStreamInfo函數來獲取這些信息,可以通過AVIStreamLengthTime宏來獲取流的長度,毫秒。

  在視頻流中,一個sample對應着一禎圖像,所以,有時這些sample中沒有視頻數據,如果你調用AVIStreamRead函數來數據,可能返回NULL,也可以通過AVIStreamFindSample通過指定FIND_ANY標誌來查找指定的sample

查找關鍵禎

通過AVIStreamFindSample函數查找符合要尋找的sample,然後可以通過下面的宏判斷是否關鍵禎。

timesample間互相切換

 AVIStreamSampleToTime這個函數可以將smaple轉換成毫秒。對於視頻,這個值代表的是這個禎開始播放的時間,

 AVIStreamTimeToSample

2.7 創建臨時的streams

 我們可以通過AVIStreamCreate函數在內存中創建一個臨時數據流,

 我們可以從一個未壓縮的數據流創建一個壓縮的數據流,採用AVIMakeCompressedStream函數,

 當我們使用完 avistreamcreate或者avimakecompressedstream創建的數據流,要一定使用AVIStreamRelease函數來關閉數據流。

2.8對數據流進行編輯

 我們可以通過CreateEditableStream函數來創建一個用於編輯的數據流。這個函數初始化了編輯流的環境,這些包含

 EditStreamCut

EditStreamCopy

EditStreamPaste

EditStreamClone

EditStreamSetInfo

EditStreamSetName

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章