因為進入房間有先后。1、對方是先進入房間的。2、對方是后進入房間的、所以自動打開對方攝像頭需要在2處回調那里進行打開。
1、
~~~
// 用戶進入(離開)房間,dwUserId表示用戶ID號,bEnterRoom表示該用戶是進入(1)或離開(0)房間
function OnAnyChatUserAtRoom(dwUserId, bEnterRoom) {
AddLog("OnAnyChatUserAtRoom(userid=" + dwUserId + ", benter=" + bEnterRoom + ")", LOG_TYPE_EVENT);
RoomUserListControl(dwUserId, bEnterRoom ? true : false);
if (bEnterRoom == 1) {
RequestVideoByUserId(dwUserId);
ShowNotifyMessage(BRAC_GetUserName(dwUserId) +" enter room!", NOTIFY_TYPE_NORMAL);
}
else {
ShowNotifyMessage(BRAC_GetUserName(dwUserId) +" leave room!", NOTIFY_TYPE_NORMAL);
for(var i=0;i<list_videouser.length;i++)
{
if(list_videouser[i]==dwUserId)
{
BRAC_UserCameraControl(dwUserId, 0); // 打開對方視頻
BRAC_UserSpeakControl(dwUserId, 0); // 打開對方音頻
list_videouser[i]=0;
list_videosite[i]=0;
GetID("div_username"+i).innerHTML="當前沒有人";
break;
}
}
}
DisplayScroll("room_div_userlist");
}
~~~
2、
~~~
// 收到當前房間的在線用戶信息,進入房間后觸發一次,dwUserCount表示在線用戶數(包含自己),dwRoomId表示房間ID
function OnAnyChatRoomOnlineUser(dwUserCount, dwRoomId) {
AddLog("OnAnyChatRoomOnlineUser(count=" + dwUserCount + ", roomid=" + dwRoomId + ")", LOG_TYPE_EVENT);
var useridlist = BRAC_GetOnlineUser();
for (var i = 0; i < useridlist.length; i++) {
RoomUserListControl(useridlist[i], true);
}
onVideoScreenChange(); //調用打開攝像頭并顯示。
}
~~~
~~~
function onVideoScreenChange()
{
//alert("hello select");
var div = GetID("AnyChatRemoteVideoDiv");
while(div.hasChildNodes()) //當div下還存在子節點時 循環繼續
{
div.removeChild(div.firstChild);
}
var objectDiv=GetID("videoscreensetting");
var videoCount=parseInt(objectDiv.options[(objectDiv.selectedIndex)].value);
list_videouser=new Array();
list_videosite=new Array();
//創建分屏所需要的div
for(var i=0;i<videoCount;i++)
{
// 創建用戶視頻面板的div
var div_videosite = document.createElement("div");
div_videosite.id="div_videosite"+i;
div_videosite.className = "CLASS_VIDEOSCREEN"+videoCount;
// 創建視頻用戶姓名的div
var div_username = document.createElement("div");
div_username.id="div_username"+i;
div_username.className = "CLASS_VIDEOSCREEN_USERNAME"+videoCount;
div_videosite.appendChild(div_username);
// 創建用戶視頻區域的div
var div_videoarea = document.createElement("div");
div_videoarea.id="div_videoarea"+i;
div_videoarea.className = "CLASS_VIDEOSCREEN_VIDEOAREA"+videoCount;
div_videosite.appendChild(div_videoarea);
div.appendChild(div_videosite);
list_videosite[i]=0;
list_videouser[i]=0;
}
//顯示視頻
var useridlist = BRAC_GetOnlineUser();
var count=0;
for(var i=0;i<useridlist.length;i++){
if(count>=videoCount)
break;
BRAC_SetVideoPos(useridlist[i], GetID("div_videoarea"+i), "ANYCHAT_VIDEO_REMOTE"+i);// 設置視頻顯示位置
BRAC_UserCameraControl(useridlist[i], 1); // 打開對方視頻
BRAC_UserSpeakControl(useridlist[i], 1); // 打開對方音頻
GetID("div_username"+i).innerHTML=BRAC_GetUserName(useridlist[i]);
list_videouser[i]=useridlist[i];
list_videosite[i]=1;
count++;
}
if(count<videoCount){
for(var i=0;i<videoCount-count;i++){
BRAC_SetVideoPos(0, GetID("div_videoarea"+(i+count)), "ANYCHAT_VIDEO_REMOTE"+(i+count));// 設置視頻顯示位置
GetID("div_username"+(i+count)).innerHTML="當前沒有人";
}
}
}
~~~
涉及相關function處理方式
~~~
function RequestVideoByUserId(dwUserId)
{
var site=-1;
for(var i=0;i<list_videosite.length;i++)
{
if(list_videosite[i]==0)
{
site=i;
break;
}
}
if(site<0)
return;
var bHashed=false;
for(var i=0;i<list_videouser.length;i++)
{
if(list_videouser[i]==dwUserId)
{
bHashed=true;
break;
}
}
if(!bHashed)
{
BRAC_SetVideoPos(dwUserId, GetID("div_videoarea"+site), "ANYCHAT_VIDEO_REMOTE"+site);// 設置視頻顯示位置
BRAC_UserCameraControl(dwUserId, 1); // 打開對方視頻
BRAC_UserSpeakControl(dwUserId, 1); // 打開對方音頻
GetID("div_username"+site).innerHTML=BRAC_GetUserName(dwUserId);
list_videouser[site]=dwUserId;
list_videosite[site]=1;
}
}
~~~
- 一、系統概述
- 1.1系統介紹
- 1.2系統特性
- 1.2.1 視頻技術
- 1.2.2 音頻技術
- 1.2.3 P2P技術
- 二、開發指南
- 2.1 客戶端SDK概述
- 2.1.1 Web
- 2.1.2 Android
- 2.1.3 iOS
- 2.1.4 Windows
- 2.1.5 Linux
- 2.1.6 Mac
- 2.2 客戶端SDK的引用及升級
- 2.3 函數調用順序
- 2.4 初始化
- 2.4.1 Web
- 2.4.2 Android
- 2.4.3 iOS
- 2.4.4 Windows
- 2.4.5 Linux
- 2.4.6 Mac
- 2.5 鏈接與登陸
- 2.5.1 Web
- 2.5.2 Android
- 2.5.3 iOS
- 2.5.4 Windows
- 2.5.5 Linux
- 2.5.6 Mac
- 2.6 進入房間
- 2.6.1 Web
- 2.6.2 Android
- 2.6.3 iOS
- 2.6.4 Windows
- 2.6.5 Linux
- 2.6.6 Mac
- 2.7 音視頻操作
- 2.7.1 用戶視頻控制
- 2.7.2 用戶語音控制
- 2.7.3 設置視頻顯示位置
- 2.7.4 設置指定用戶音視頻流相關參數
- 2.7.5 設置外部輸入視頻格式
- 2.7.6 外部視頻數據輸入
- 2.7.7 設置外部輸入音頻格式
- 2.7.8 外部音頻數據輸入
- 2.8 查詢狀態
- 2.8.1 查詢攝像頭的狀態
- 2.8.2 查詢用戶音頻設備采集狀態
- 2.8.3 查詢用戶昵稱
- 2.8.4 查詢用戶狀態
- 2.9 普通功能
- 2.9.1 獲取SDK版本信息
- 2.9.2 獲取當前房間在線用戶列表
- 2.9.3 獲取指定房間在線用戶列表
- 2.9.4 傳送文本消息
- 2.9.5 透明通道傳送緩沖區
- 2.9.6 傳送文件
- 2.9.7 查詢傳輸任務相關信息
- 2.9.8 取消傳輸任務
- 2.9.9 發送SDK Filter通信數據
- 2.9.10 音視頻錄制
- 2.9.11 圖像抓拍(拍照)
- 2.9.12 組播功能控制
- 2.9.13 虛擬背景
- 2.10 離開房間
- 2.11 注銷系統
- 2.12 系統設置
- 2.12.1 枚舉本地采集設備
- 2.12.2 選擇指定采集設備
- 2.12.3 獲取當前采集設備
- 2.12.4 獲取音頻設備當前音量
- 2.12.5 設置指定音頻設備音量
- 2.12.6 查詢SDK內核參數
- 2.12.7 SDK內核參數設置
- 2.13 媒體播放
- 2.13.1 流媒體播放初始化
- 2.13.2 流媒體播放控制
- 2.13.3 設置流媒體播放視頻顯示位置
- 2.13.4 流媒體播放獲取參數信息
- 2.13.5 流媒體播放釋放資源
- 三、參數設置與說明
- 3.1 基礎視頻概念
- 3.1.1 分辨率與碼率
- 3.1.2 幀率
- 3.1.3 H.264編解碼
- 3.1.4 分辨率、幀率、碼率之間的關系
- 3.2 基礎音頻概念
- 3.2.1 音頻采樣率及大小
- 3.2.2 音頻聲道
- 3.2.3 AAC編解碼
- 3.3 視頻質量調優
- 3.4 視頻通話對帶寬的需求
- 3.4.1 帶寬的影響因素
- 3.4.2 視頻場景的帶寬要求
- 四、音視頻交互示例代碼
- 4.1 修改視頻參數
- 4.2 如何自動打開對方的視頻
- 4.3 打開多路音視頻
- 五、常見問題
- 1、視頻模糊有馬賽克
- 2、視頻卡頓
- 3、攝像頭亮燈但本地視頻無顯示
- 4、雙向視頻,聽不見對方聲音
- 5、雙向視頻,看不見對方視頻
- 6、內網正常,外網無法音視頻
- 7、聲音有嘯叫和雜音
- 8、同網段正常、不同網段無法音視頻
- 9、進入房間失敗,返回錯誤代碼-1
- 10、本地視頻方向不正確
- 11、手機本地正常,Web看手機端有裁剪
- 12、雙方視頻出現綠屏、花屏
- 13、閃屏
- 14、IP攝像頭的支持
- 15、服務器日志采集自定義文件夾不生效
- 16、特殊3D攝像頭無法打開
- 17、音視頻不同步
- 18、簽名服務器部署后點登陸拋空指針異常
- 19、iOS 按HOME鍵進入后臺 聽不到 對方的聲音了,對方能聽到自己的(已開啟音頻后臺模式)