國立台灣大學電機工程學系
網路與多媒體實驗

影音函式庫介紹

Video Capture函式庫

Video Capture主要提供下列功能:

1. 連結驅動程式。
2. 擷取影像、聲音資料顯示在螢幕上或者是存成 audio-video interleaved(AVI)檔案。
3. 擷取單張影像顯示在螢幕上、拷貝至剪貼簿、或者是存成 device-independent bitmap(DIB)檔案。

Video Capture函式庫亦有擷取聲音資料的功能,不過本實驗只利用這個函式庫擷取影像資料。

這個函式庫主要 使用下列資料結構:

1. CAPTUREPARAMS:這個資料結構主要包含了一些擷取影像的參數。以下列出幾個比較重要的成員:

(1) DWORD dwRequestMicroSecPerFrame :代表相鄰兩個frame的擷取時間間隔,其單位為microsecond。若值為66667則代表frame rate為15。
(2) BOOL fYield :若其值為TRUE,則表示Windows會以另一個thread來捕捉影像,因此使用者可以在捕捉影像時仍然可以繼續使用程式;若其值為FALSE,則程式會在捕捉影像後顯示忙碌狀態(滑鼠游標為漏斗圖示),因此使用者無法再對程式下命令。
(3) BOOL fCaptureAudio :其 值代表示否 要同時擷取聲音資料。本實驗設其為FALSE。

2. BITMAPINFO:這個資料結構和點陣圖息息相關,主要定義了影像擷取下來之後顯示在螢幕上、儲存在記憶體及檔案的格式。其中包含了兩個成員:

(1) BITMAPINFOHEADER bmiHeader :這是一個描述影像性質的資料結構,其中成員記載了影像的大小、color depth、以及壓縮的方式。在Video Capture、Video Compression Manager、 DrawDib函式庫 ,甚至是只要有關於點陣圖的應用都會使用到, 可以說是本 實驗video部分最重要的資料結構。
(2) RGBQUAD bmiColors :指向color table第一個元素的位址。Color table主要記錄這個圖形所使用的顏色表示法中每一種顏色對應到RGB表示法的值。

以下便簡單介紹本實驗主要使用的函式及巨集 :

1. capCreateCaptureWindow : capture windows在概念上滿類似Windows標準控制項(如Button、Check Box、Radio Button等),使用者對capture windows下命令,再由capture windows負責和硬體driver溝通以完成影像擷取工作。因此第一步便必需執行此函式來建立 capture windows並得到其handle。
2. capDriverConnect :這個巨集主要是將建立好的 capture windows和硬體driver連結。
3. capCaptureGetSetup 及 capCaptureSetSetup :前者主要是取得 capture windows的CAPTUREPARAMS,在將其修改之後,再利用後者來設定。
4. capGetVideoFormat 及 capSetVideoFormat :前者主要是取得 capture windows的BITMAPINFO,在將其修改之後,再利用後者來設定。
5. capSetCallbackOnVideoStream :這個函式主要是輸入一個 callback函式的位 址,使得當Windows每擷取到一個frame時會呼叫這一個函式,並將frame內容當作函式的輸入 參數。本實驗便是在這一個函式中執行 壓縮的工作,並將壓縮好的frame以Windows Sockets函式送出。
6. capCaptureSequenceNoFile :這個巨集主要是命令 capture windows開始擷取影像。
7. capCaptureStop :這個巨集主要是命令 capture windows停止擷取影像。
8. capDriverDisConnect :這個巨集主要是將 capture windows和硬解除連結。有一點必需注意,在執行此巨集之前必需先執行 capSetCallbackOnVideoStream ,其中函式的位 址填入NULL。

Video Compression Manager函式庫

Video Compression Manager(VCM)為介於應用程式以及compressor/ decompressor 的一個媒介,其最大優點就是使用者可以透過其很方便地控制任何已向Windows註冊的codecs 。可以在控制台 / 多媒體 / 裝置 / 視訊壓縮 codecs 得知目前 VCM 可使用的 codecs。

這個函式庫主要 使用下列資料結構:

1. COMPVARS:這個資料結構主要是記錄所有和壓縮相關的資訊,以下列出幾個比較重要的成員:

(1) DWORD fccHandler :compressor名稱
(2) LPBITMAPINFO lpbiIn :指向待壓縮影像之BITMAPINFO的指標
(3) LPBITMAPINFO lpbiOut :指向壓縮完影像之BITMAPINFO的指標
(4) LONG lKey :代表key-frame rate。所謂key frame是指此frame在解壓縮時不需依賴前面的frame。
(5) LONG lQ :代表影像壓縮後的品質,為介於1至10000的一個整數

以下便簡單介紹本實驗主要使用的函式及巨集 :

1. ICLocate :輸入指向壓縮前後 BITMAPINFO的指標,以及欲使用之 codecs 。
2. ICCompressorChoose :此函式會呼叫 一個系統內建的對話盒,其中包含所有可以使用的 codecs 以及其相關參數;使用此函式的優點 在於對話盒結束時系統會自動將 COMPVARS資料結構 初使化 ,程式設計者便不用費心在於參數值之設計。
3. ICCompressQuery :此函式主要在詢問 compressor是否支援某種壓縮方式。輸入參數為compressor handle及指向壓縮前後BITMAPINFO的指標,此函式會傳回 詢問結果。
4. ICCompressBegin :此函式要求系統準備相關資源以供壓縮之用。
5. ICCompress :此函式壓縮某一個 frame。
6. ICCompressEnd :此函式歸還相關資源給系統。
7. ICDecompressQuery :此函式主要在詢問 decompressor 是否支援某種解壓縮方式。
8. ICDecompressBegin :此函式要求系統準備相關資源 以供解壓縮之用
9. ICDecompress :此函式解壓縮某一個 frame。
10. ICDecompressEnd :此函式歸還相關資源給系統。
11. ICCompressorFree :此函式歸還 COMPVARS所佔用之資源。

DrawDib函式庫

DrawDib 主要提供將 Device-independent bitmaps(DIB)畫在螢幕上的功能。因此本實驗利用這個函式庫將解壓縮完畢的影像在螢幕上繪出。

DrawDib函式庫所 使用的資料結構主要是 BITMAPINFO,已在先前介紹過。以下便介紹本實驗主要使用到的函式以及巨集:

1. DrawDibOpen :此函式主要在開啟 DrawDib 動態連結函式庫 、建立一個 DrawDib DC、及準備相關的系統資源。
2. DrawDibBegin :此函式主要在初始化 DrawDib DC,輸入參數為影像大小以及影像的BITMAPINFO資料結構。
3. DrawDibDraw :此函式將影像在螢幕上繪出。
4. DrawDibEnd :此函式主要在將 DrawDib DC相關設定還原。
5. DrawDibClose :此函式會關閉 DrawDib DC並歸還相關資源。

Waveform Audio函式庫

Waveform Audio主要提供聲音的錄製和播放的功能。

以下簡單介紹其主要的資料結構:

1. WAVEFORMATEX:這個資料結構定義了聲音資料的相關參數,以下列出其重要成員:
(1) WORD wFormatTag :聲音的格式。例如WAVE_FORMAT_PCM便代表使用PCM格式。
(2) WORD nChannels :使用的聲道數。其值為1代表為單聲道,為2代表為立體聲道。
(3) DWORD nSamplesPerSec :聲音的取樣頻率,其值為每秒的取樣數。
(4) DWORD nAvgBytesPerSec :資料的data rate,單位為每秒鐘產生的bytes數。
(5) WORD wBitsPerSample :每個取樣需以多少個位元來表示。

2. WAVEHDR:前面提到的Video for Windows函式庫中 用來儲存影像的記憶體系統會自行準備,但在Waveform Audio函式庫中程式設計者必需自行準備記憶體以供系統使用。WAVEHDR便是用來描述每一塊記憶體的資料結構,以下列其重要成員:
(1) LPSTR lpData :程式設計者必需準備一塊記憶體,然後以此指標指向記憶體的位址。
(2) DWORD dwBufferLength :上一參數所指記憶體的大小,單位為位元組。

在開始錄音之後,系統當填滿一塊記憶體之後會送出 MM_WIM_DATA訊息,在本實驗中收到此訊息之後便要將記憶體資料以Windows Sockets函式送出。因此在設計程式時必需準備多塊記憶體,使得當應用程式將一塊記憶體送出時,仍然可以繼續將聲音資料存至其他記憶體。

以下便介紹錄音時本實驗主要使用到的函式以及巨集:

1. waveInOpen :此函式輸入 WAVEFORMATEX資料結構以選擇適當的錄音設備,並告訴系統當填滿一塊記憶體時是要送出MM_WIM_DATA訊息還是要呼叫一個callback函式。
2. waveInPrepareHeader 及 waveInAddBuffer :此兩函式是用來準備記憶體。
3. waveInStart :此函式告知系統開始錄音。
4. waveInStop :此函式告知系統停止錄音。
5. waveInUnprepareHeader :此函式用來歸還在 waveInPrepareHeader 所準備的記憶體。
6. waveInClose :此函式用來關閉錄音設備。

以下便介紹放音時本實驗主要使用到的函式以及巨集:

1. waveOutOpen :此函式輸入 WAVEFORMATEX資料結構以選擇適當的放音設備。
2. waveOutPrepareHeader :此函式用來準備記憶體。
3. waveOutWrite :此函式告知系統開始播放某塊記憶體所儲存的資料。
4. waveOutReset :此函式告知系統停止播放並將此塊記憶體視為已播放。
5. waveOutClose :此函式用來關閉放音設備。


參考文獻


1. Microsoft Developer Network (MSDN) Library

* keywords: DrawDib , Video Capture, Video Compression Manager, Video for Windows, Waveform Audio.

 

 

©2010 網路與多媒體實驗室@國立台灣大學
Last Modified by Shih-Lung Chao, 2010/9/7