因为进入房间有先后。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键进入后台 听不到 对方的声音了,对方能听到自己的(已开启音频后台模式)