標籤:style http color 使用 os strong io 資料
1、如何顯示本地視頻,或是其它電腦上的視頻?
a)AnyChat的用戶端必須初始化、登入系統、進入房間成功之後,才能顯示本地視頻或是其它使用者的視頻,詳細的流程可參考:193. AnyChat開發流程指南;
b)AnyChat有兩種方式來顯示視頻,分別是:自動顯示(BRAC_FUNC_VIDEO_AUTODISP)、回調視頻資料(BRAC_FUNC_VIDEO_CBDATA),應用程式需要在初始化(BRAC_InitSDK)時設定相關的標誌來告訴AnyChat如何處理視頻的顯示。
當設定了自動顯示(BRAC_FUNC_VIDEO_AUTODISP)時,應用程式需要設定視頻顯示位置(BRAC_SetVideoPos),當開啟本機使用者的視頻,或是請求遠端使用者的視頻時,AnyChat內部會自動將視頻顯示在指定的位置;
如果沒有設定自動顯示標誌,而只設定了回調視頻資料(BRAC_FUNC_VIDEO_CBDATA)標誌時,AnyChat內部不會顯示視頻,而是將視頻資料通過回調的方式(130. 視頻資料回呼函數)提交給應用程式,由應用程式自己來繪製;
c)當使用者使用API介面(BRAC_UserCameraControl)開啟本地網路攝影機後,本機電腦的視頻即可顯示出來;
d)當使用者使用API介面(BRAC_UserCameraControl)請求其它使用者的視頻資料時,只有該使用者開啟自己的網路攝影機之後,本機電腦才能收到對方使用者的視頻;
2、什麼是視頻顯示驅動,如何選擇?
Windows平台有多種方式來實現視頻的顯示,常見的有GDI繪圖和DirectShow兩種模式。當設定AnyChat自動顯示視頻標誌時,應用程式可以在這兩種模式之間進行選擇,視頻顯示驅動的選擇需要在初始化(BRAC_InitSDK)成功之後設定,下面的代碼示範了選擇DirectShow顯示驅動:
1.
// 選擇AnyChat顯示驅動
2.
DWORD
dwVideoDriver = BRAC_VSD_DIRECTSHOW;
3.
BRAC_SetSDKOption(BRAC_SO_VIDEOSHOW_DRIVERCTRL,(
const
char
*)&dwVideoDriver,
sizeof
(
DWORD
));
AnyChat為了簡化應用程式開發流程,同時也為了相容更早期的版本,預設採用GDI繪圖方式來顯示視頻;GDI繪圖方式適合分辯率不大於CIF(352x288),同時幀率低於20FPS的視頻顯示;DirectShow顯示模式適合高解析度、高幀率的視頻顯示。
DirectShow顯示模式在高視頻品質下更節約資源;
(*註:視頻顯示驅動選擇功能為AnyChat Platform Core SDK V4.0版本新增功能)
3、顯示的視頻為何有些變形,如何設定?
當視頻顯示地區的大小與視頻的原始大小不成比例時,所顯示的視頻將會變形,所以要保證顯示的視頻不變形,則必須保證視頻顯示地區與視頻的原始大小成正比關係;
通過WM_GV_VIDEOSIZECHG訊息(V4.0版本新增)可以知道每一個使用者當前原始視頻的大小,應用程式可以根據原始視頻的大小來確定視頻顯示地區的大小,也可以通過API(BRAC_QueryUserState)來擷取使用者當前的視頻大小;
當使用者進入房間時,AnyChat內部會每一個線上使用者觸發一次WM_GV_VIDEOSIZECHG訊息;
當使用者修改視頻採集解析度時,房間內所有使用者都將收到該使用者的WM_GV_VIDEOSIZECHG訊息;
4、為何有時視頻被其它視窗覆蓋,或是最小化後視頻被遮擋,不能自動重新整理?
這主要出現在DirectShow顯示模式下,主要原因是應用程式介面重繪之後,底層的DirectShow沒有獲得重繪的訊息通知,所以導致視頻被遮擋,解決方案是響應視窗的WM_PAINT訊息,在訊息處理函數中調用BRAC_RepaintVideo進行視頻的重繪。
AnyChat預設的GDI繪圖模式下,不存在該問題。
AnyChat底層的DirectShow是採用VMR的Windowless模式進行視頻顯示,有關該問題的詳細資料可參考微軟官方的開發文檔:http://msdn.microsoft.com/en-us/library/dd407299