實驗內容
目的
本實驗主要是學習利用攝影機、麥克風來作影像與聲音的即時擷取、傳送和播放。進而瞭解影像擷取、壓縮、繪圖等相關函式庫的使用方法,以及熟悉UDP網路傳送,和相關的Windows Sockets函式庫。
設備
網路與多媒體實驗室將提供下列硬體供同學作實驗使用:
1.個人電腦(附網路卡)
2.數位攝影機(USB Camera)
3.耳機(附麥克風)
軟體部分:
原則上允許同學使用任何視窗程式發展軟體。實驗室另有提供 Microsoft Developer Network (MSDN) Library讓同學使用。
原理
本實驗是利用電腦週邊設備(攝影機、麥克風),來獲得影像和聲音的資訊後,再利用Microsoft所提供的VFW函式庫(Microsoft Video for Windows),來作影像擷取(Video Capture)、影像壓縮(Video Compression Manager),以及影像播放(DrawDib)的功能。聲音部分使用的是Waveform Audio函式庫。
在影像部分,主要是利用Video Capture函式庫擷取影像。攝影機所拍攝到的畫面,事實上是由許多張連續的圖片所構成。每一張圖片,稱為一個frame。每當本機擷取到一個frame之後,便使用Video Compression Manager 函式庫來對這個frame做壓縮,再利用文字聊天室實驗所學的Windows Sockets函式庫,將壓縮後的frame傳輸到遠端電腦上。遠端電腦接收到資訊後,同樣利用Video Compression Manager 函式庫將這一個frame解壓縮,然後利用DrawDib函式庫將影像即時播放在螢幕上。
而聲音部分的步驟也十分類似,不過不進行壓縮、解壓縮的程序。本實驗使用Waveform Audio函式庫擷取一段聲音,然後利用Windows Sockets函式庫將其送出;當收到一段聲音時再利用Waveform Audio函式庫將其播放出來。
影音函式庫簡介
Peer-to-Peer程式架構&程式流程提示
實驗要求
預報
本實驗無須撰寫預報。但請使用Windows中的NetMeeting或MSN視訊軟體,與同組人員相互測試瞭解其功能,體認影音資料的即時傳送、播放及相關功能。
程式
本實驗的程式主要依照下列三部分來做評分。
聲音部分:
- 本機電腦可以很清楚的聽到對方的聲音。
- 設定有一組聲音控制按鈕,可以動態的調整聲音狀態(聲音啟動、耳機音量、麥克風音量、﹍)。
影像部分:
- 存錄影像。
- 壓縮影像。
- 傳送影像。
- 還原影像。
- 當中,影像的壓縮程式可以顯現出影像品質的好壞,而網路的頻寬扮演著相當重要的角色,請同組同學互相討論並確實的解決此議題。
影像聲音同步部分:
- 在影像與聲音都可以傳輸了之後,同步化便是本實驗程式另一項的挑戰。
- 由於同步化的方法有很多種,請同組同學互相討論並決定出一個適用演算法。
程式的評比(需demo):
- 界面功能完整性的部分:
- C-以上:可以擷取聲音及影像並本機播放。
- C 以上:可以傳輸原始聲音(不需壓縮)。
- C+以上:可以傳輸原始影像(Frame Based)。
- B-以上:可以傳輸壓縮影像(Codec Based,需支援一種以上的Codec,完成Codec Based者不需展示Frame Based)。
- B 以上:可以傳輸壓縮聲音(參考MSDN Library中的Audio Compression Manager)。
- B+以上:可以動態調整傳輸品質(手動即可)。
- A-以上:任何特殊的程式功能(需是明確而具體的功能,如影音側錄等)。
- A 以上:影音同步化的效果(需說明確切實作演算法,若以Codec封裝實作且即時性高者直接A+)。
- A+以上:進階的特殊程式功能(如三方以上視訊通話等)。
結報
每組一份、打字。
結報問題(合寫一份)
- 本實驗利用 UDP傳送即時多媒體資料,其與文字聊天室實驗利用TCP傳送資料的方式有什麼差別?為何不使用TCP?使用UDP可能會發生什麼問題?該如何解決?
- 壓縮有分為 intra-frame compression和inter-frame compression兩種,試描述兩者的不同。請問你使用的壓縮方法是哪一種?要如何觀察其是否支援inter-frame compression?
- 請描述你的程式如何同步視訊和音訊資料,如何管理傳送端和接收端的buffer?
在本實驗的過程中,絕大多數的組別都是採取分工的模式,很多同學也遇到了相當多的bug。每位同學請個別說明:
- 在影音聊天室的設計與規劃中,你(妳)負責的部分為何?如何完成?
- 在影音聊天室的程式撰寫中,你(妳)學到了些什麼?困難為何?如何解決?
- 你到底為了你(妳)的組貢獻了些什麼?
請簡單分析此實驗(簡述你(妳)認為重要的部份)。
請每人附上約半頁的實驗感想與心得(作為日後的建議與修正)。
最後,也是最重要的,你的參考資料為何?如果是前人的作品加以改良?請詳細說明來源(請記得參考不是罪惡,但必須有自己的東西或貢獻)。
參考資料
JAVA版1/JAVA版2
BCB版
C++版1/C++版2