如何設置AnyChat視頻質量?
AnyChat SDK視頻質量主要是通過服務器的“AnyChatCoreServer.ini”配置文件來控制,該配置是整個系統所有房間的默認配置,早期的版本無法實現由上層應用來控制不同的用戶採用不同的視頻質量參數,自“AnyChat Platform Core SDK V2.8”版本開始,AnyChat便提供了本地視頻質量控制接口,可以由上層應用控制本地視頻的編碼質量,爲某些特定的應用提供了基礎,例如:可以實現主持人發言時採用高質量的視頻參數,而普通用戶採集一般的視頻參數,從而達到發言者的視頻效果優於普通用戶的特定效果。(如果採集的視頻信號有“橫條”干擾。
AnyChat SDK的本地視頻質量控制接口可以調節的參數包括“視頻採集分辯率”、“視頻幀率”、“視頻碼率”、“視頻質量”、“關鍵幀間隔”以及“預設參數”的控制,參數定義如下:
01.///< 本地視頻編碼碼率設置(參數爲int型,同服務器配置:VideoBitrate)
02.#defineBRAC_SO_LOCALVIDEO_BITRATECTRL 30
03.///< 本地視頻編碼質量因子控制(參數爲int型,同服務器配置:VideoQuality)
04.#defineBRAC_SO_LOCALVIDEO_QUALITYCTRL 31
05.///< 本地視頻編碼關鍵幀間隔控制(參數爲int型,同服務器配置:VideoGOPSize)
06.#defineBRAC_SO_LOCALVIDEO_GOPCTRL 32
07.///< 本地視頻編碼幀率控制(參數爲int型,同服務器配置:VideoFps)
08.#define BRAC_SO_LOCALVIDEO_FPSCTRL 33
09.///< 本地視頻編碼預設參數控制(參數爲int型,1-5)
10.#defineBRAC_SO_LOCALVIDEO_PRESETCTRL 34
11.///< 本地視頻採集分辨率寬度控制(參數爲int型,同服務器配置:VideoWidth)
12.#defineBRAC_SO_LOCALVIDEO_WIDTHCTRL 38
13.///< 本地視頻採集分辨率高度控制(參數爲int型,同服務器配置:VideoHeight)
14.#defineBRAC_SO_LOCALVIDEO_HEIGHTCTRL 39
其中視頻質量控制有兩種模式“平均碼率模式”(默認設置)和“質量因子模式”,當設置的碼率大於0時,啓動“平均碼率模式”,當設置的碼率爲0時,啓動“質量因子模式”。
典型的設置“平均碼率模式”參數代碼如下:
01.DWORD dwValue = 0;
02.// 設置本地視頻編碼的碼率
03.dwValue = 60 *1000; // 60 kbps
04.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_BITRATECTRL,(constchar*)&dwValue,sizeof(DWORD));
05.// 設置本地視頻編碼的關鍵幀間隔
06.dwValue = 20;
07.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_GOPCTRL,(constchar*)&dwValue,sizeof(DWORD));
08.// 設置本地視頻編碼的幀率
09.dwValue = 8;
10.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_FPSCTRL,(constchar*)&dwValue,sizeof(DWORD));
11.// 設置本地視頻編碼的預設參數
12.dwValue = 3;
13.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_PRESETCTRL,(constchar*)&dwValue,sizeof(DWORD));
14.// 使參數設置生效
15.BOOL bUseAppParam = TRUE;
16.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_APPLYPARAM,(constchar*)&bUseAppParam,sizeof(DWORD));
典型的設置“質量因子模式”參數代碼如下:
01.DWORD dwValue = 0;
02.// 設置本地視頻編碼的碼率
03.dwValue = 0;
04.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_BITRATECTRL,(constchar*)&dwValue,sizeof(DWORD));
05.// 設置本地視頻編碼的質量因子
06.dwValue = 4;
07.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_QUALITYCTRL,(constchar*)&dwValue,sizeof(DWORD));
08.// 設置本地視頻編碼的關鍵幀間隔
09.dwValue = 20;
10.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_GOPCTRL,(constchar*)&dwValue,sizeof(DWORD));
11.// 設置本地視頻編碼的幀率
12.dwValue = 8;
13.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_FPSCTRL,(constchar*)&dwValue,sizeof(DWORD));
14.// 設置本地視頻編碼的預設參數
15.dwValue = 3;
16.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_PRESETCTRL,(constchar*)&dwValue,sizeof(DWORD));
17.// 使參數設置生效
18.BOOL bUseAppParam = TRUE;
19.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_APPLYPARAM,(constchar*)&bUseAppParam,sizeof(DWORD));
當啓動“平均碼率模式”時,質量因子的參數設置仍然有效,只是系統會限制輸出的最高碼率。另外要使設置的參數生效,需要調用“BRAC_SetSDKOption”接口並使用“BRAC_SO_LOCALVIDEO_APPLYPARAM”標誌啓用所設置的參數,同時也可利用該標誌恢復服務器配置的默認視頻質量參數。
關於視頻幀率與關鍵幀間隔的參數設置可參考如下原則:
1、幀率越高,視頻越流暢(最大值爲25fps),同時幀率也會對碼率和CPU資源佔用產生一定的影響,通常的建議是互聯網應用(8-12fps),局域網應用(18-25fps);
2、關鍵幀間隔是指在編碼的過程中,兩個關鍵幀之間非關鍵幀的數量,值越大,碼率越小,但會降低視頻的質量,值越小,碼率越大,視頻質量較好,但不宜過小,通常的建議是互聯網應用(幀率的3、4倍),局域網應用(等於幀率),不要小於幀率;
關於本地視頻編碼的預設參數:BRAC_SO_LOCALVIDEO_PRESETCTRL,其取值範圍爲1-5,主要用來控制CPU資源佔用率和畫面細節,值越小,編碼時的CPU佔用率越低,但會損失對畫面細節的處理;值越大,編碼時的CPU佔用率越高,但對畫面細節的處理會更細膩,該參數主要針對高碼率有效,低碼率時由於碼率的限制,視頻畫面細節無法表現出來,所以低碼率模式下,可以將該參數調節低一些,以降低CPU的利用率。
關於本地視頻編碼的碼率參數:BRAC_SO_LOCALVIDEO_BITRATECTRL,單位爲bps,碼率越小,視頻質量越差;碼率越高,視頻質量越好,同時該參數還與視頻畫面的分辯率有關,不同的分辨率有不同的取值範圍,如在互聯網應用狀態下,分辯率是176x144典型的取值範圍是(10kbps ~ 60kbps),分辨率是320x240典型的取值範圍是50kbps ~ 120kbps,如果是局域網應用,則碼率可適當提高。
關於本地視頻編碼的質量因子參數:BRAC_SO_LOCALVIDEO_QUALITYCTRL,取值範圍爲1-6,值越小,畫面質量越低,輸出碼率也越低,值越大,畫面質量越高,輸出碼率也越高。
關於“平均碼率模式”和“質量因子模式”兩種視頻質量控制模式的區別和應用,可參考如下原則:
1、“平均碼率模式”:視頻編碼時以輸出碼率爲優先考慮條件,當畫面靜止時,輸出的碼率較低,動態畫面碼率會較高,瞬時碼率可能會超過設置的參數(最高不會超過10%),但是其輸出的視頻數據平均碼率將會維持在設置的參數附近,當畫面運動量過大時,編碼器爲了維持平均碼率,將會損失畫面的質量,通常互聯網應用可採用該模式;
2、“質量因子模式”:當碼率參數設置爲0時,該模式生效,視頻編碼時以視頻質量爲優先考慮條件,靜止的畫面和動態畫面將會用不同的量化因子進行編碼,維持在一個固定的畫面質量下,當畫面靜止時,碼率較低,當畫面運動時,碼率較高,通常局域網應用可採用該模式。由於該模式下沒有限制碼率,所以大運動量畫面時,爲了保持固定的畫面質量,碼率的變化將會比較大,所以該模式不適合於互聯網應用。
3、如果希望在互聯網的環境下獲得較高質量的視頻效果(在網絡帶寬許可的情況下),建議採用“平均碼率模式”,只是可以適當提高視頻質量參數(VideoQuality)的值,視頻碼率參數根據需要進行設置。低碼率,配置較低的視頻質量,高碼率就需要配置較高的視頻質量。
注:“AnyChatPlatform Core SDK” V4.0版本開始支持每個用戶單獨設置視頻採集分辯率,當上層應用程序沒有設置視頻採集分辨率以及視頻質量控制相關參數時,客戶端將採用服務器默認配置參數,而早期的版本只支持視頻質量相關參數的設置,不支持視頻採集分辯率的設置,典型的設置本地視頻採集分辯率的代碼如下:
01.DWORD dwValue = 0;
02.// 設置本地視頻採集的寬度
03.dwValue = 320;
04.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_WIDTHCTRL,(constchar*)&dwValue,sizeof(DWORD));
05.// 設置本地視頻採集的高度
06.dwValue = 240;
07.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_HEIGHTCTRL,(constchar*)&dwValue,sizeof(DWORD));
08.// 使參數設置生效
09.BOOL bUseAppParam = TRUE;
10.BRAC_SetSDKOption(BRAC_SO_LOCALVIDEO_APPLYPARAM,(constchar*)&bUseAppParam,sizeof(DWORD));