logo头像
Snippet 博客主题

AnyChat

无意间发现 开源中国中有人回复 看见 以前的文章
就想整理下

这是一份 2014年 研究视频通话 时候调研 的 文章 一直在有道笔记

与最新版本 AnyChat SDK 有差异 请谅解 不更新

AnyChat

跨平台的音视频即时通讯解决方案,基于先进的H.264视频编码标准、AAC音频编码标准与P2P技术,
支持高清视频,整合了佰锐科技在音视频编码、多媒体通讯

Android2.3以上版本

音视频即时通讯:提供语音、视频一对一、一对多的实时通讯,支持高清视频和高品质音频效果。

音视频即时通讯:提供语音、视频一对一、一对多的实时通讯,支持高清视频和高品质音频效果。

录像:支持针对单个人的音视频录制、整个视频通话过程内容的合成音视频录制以及集中服务器保存录制

抓拍:可对本地视频和正在视频的对象进行抓拍;

文字聊天:支持多用户之间的文字交流;

透明通道:提供客户端之间、客户端跟服务器之间的数据通讯能力;

文件传输:支持客户端直接、客户端跟服务器之间的文件传输功能,支持断点续传;

动态设置音视频参数:提供音视频参数设置的接口,可以根据需要动态设置分辨率、码率、帧率等视频参数,满足各种应用场景的需求;

外部音视频输入:支持非标准采集设备以外的音视频源输入,满足更多的应用场景;

集成第三方外部音视频编解码器:可集成第三方音视频编解码器,满足特殊环境下面的硬件编解码要求

AnyChatBaseEvent

public void OnAnyChatConnectMessage(boolean bSuccess);
连接服务器消息, bSuccess表示是否连接成功

public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode);
用户登录消息,dwUserId表示自己的用户ID号,dwErrorCode表示登录结果:0 成功,否则为出错代码

public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode);
用户进入房间消息,dwRoomId表示所进入房间的ID号,dwErrorCode表示是否进入房间:0成功进入,否则为出错代码

public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId);
房间在线用户消息,进入房间后触发一次,dwUserNum表示在线用户数(包含自己),dwRoomId表示房间ID

public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter);
用户进入/退出房间消息,dwUserId表示用户ID号,bEnter表示该用户是进入(TRUE)或离开(FALSE)房间

public void OnAnyChatLinkCloseMessage(int dwErrorCode);
网络断开消息,该消息只有在客户端连接服务器成功之后,网络异常中断之时触发,dwErrorCode表示连接断开的原因

功能

1 视频通话
anychatcallcenter —— 上线下线通知 视频通话提醒 视频终端处理

2 认证 - 上传照片 视频
AnyChatSelfRecord—

3 AnyChatFeatures
1 音视频互动 —简单功能实现 ok 详细问题解决 参考anychatcallcenter

2 文字聊天—功能ok 问题 1.消息过滤— OnAnyChatTextMessage获取的是所有的消息 同时接收到多人信息 2.消息记录
// 文字聊天通知接口
public interface AnyChatTextMsgEvent {
// 文字消息通知,dwFromUserid表示消息发送者的用户ID号,dwToUserid表示目标用户ID号,可能为-1,表示对大家说,bSecret表示是否为悄悄话
public void OnAnyChatTextMessage(int dwFromUserid, int dwToUserid, boolean bSecret, String message);
}

3 透明通道 ---文字聊天

// 数据传输通知接口
public interface AnyChatTransDataEvent {
// 文件传输回调函数定义
public void OnAnyChatTransFile(int dwUserid, String FileName, String TempFilePath, int dwFileLength, int wParam, int lParam, int dwTaskId);
// 透明通道数据回调函数定义
public void OnAnyChatTransBuffer(int dwUserid, byte[] lpBuf, int dwLen);
// 扩展透明通道数据回调函数定义
public void OnAnyChatTransBufferEx(int dwUserid, byte[] lpBuf, int dwLen, int wparam, int lparam, int taskid);
// SDK Filter 通信数据回调函数定义
public void OnAnyChatSDKFilterData(byte[] lpBuf, int dwLen);
}
4 文件传输 ---
anyChatSDK.TransFile(mUserID, strFilePath, 0, 0, 0, mAnyChatOutParam);

// 文件传输接受
@Override
public void OnAnyChatTransFile(int dwUserid, String FileName,
String TempFilePath, int dwFileLength, int wParam, int lParam,
int dwTaskId) {}

http://www.anychat.cn/faq/index.php?action=artikel&cat=2&id=175&artlang=zh

关于视频帧率与关键帧间隔的参数设置可参考如下原则:
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)的值,视频码率参数根据需要进行设置。低码率,配置较低的视频质量,高码率就需要配置较高的视频质量。

注:“AnyChat Platform Core SDK” V4.0版本开始支持每个用户单独设置视频采集分辩率,当上层应用程序没有设置视频采集分辨率以及视频质量控制相关参数时,客户端将采用服务器默认配置参数。



http://www.anychat.cn/faq/index.php?action=artikel&cat=2&id=243&artlang=zh



目前常见的网络主要有四种类型:ADSL拨号接入方式、光纤接入方式、3G拨号接入方式、局域网。

ADSL拨号接入方式是一种非对称的网络接入,下行流量通常有2Mbps、4Mbps、6Mbps等,而上行流量通常都是512kbps,即上行速率和下行速率是不对称的。此时如果需要使用AnyChat进行音视频的交互,则上传流量只能用512kbps作为参考值,适合的分辨率有:QVGA(320x240)、CIF(352x288)、VGA(640x480)。

光纤接入方式是一种对称的网络接入,通常上行速率和下行速率相同。光纤接入的网络通常非常稳定,适合传输较高质量的视频,当网络带宽允许的情况下,适合的分辩率有:QVGA(320x240)、CIF(352x288)、VGA(640x480)、SVGA(800x600)、720P(1280x720)。

3G拨号接入方式也是一种非对称的网络接入,不同的网络运营商所提供的网络带宽各不相同,而且和ADSL一样上行网络带宽远远低于下行网络带宽,如联通的3G宣传的7.2Mbps网络带宽便是指下行带宽,而且3G的网络带宽质量与位置相关,如离信号基站越近,质量就越好,同一个基站下使用3G的用户越少,质量也就越好。在这种接入方式下,适合上传的分辨率有:QVGA(320x240)、CIF(352x288)。

局域网,或是专网网络带宽都非常充裕,选择多大的分辨率主要根据PC的性能来决定,通常局域网可以选择CIF(352x288)、VGA(640x480)、SVGA(800x600)、720P(1280x720)等分辨率。

AnyChat质量模式分辨率、码率对应表(单位:kbps) 

Static—静态画面, motion—运动图像峰值, agv—平均码率 

AnyChat的视频质量分为“码率控制模式”和“质量控制模式”,在“码率控制模式”下,视频流的目标码率会在设定码率的上下浮动,而在“质量控制模式”下,目标码率会根据视频图像的运动场景自动进行调节,静态画面时输出较低的码率,而运动画面时,会输出较高的码率,以保障视频的细节得到展现。通常来说,光纤接入方式、局域网等网络带宽比较充裕的场合可使用“质量控制模式”,而ADSL拨号接入和3G拨号接入则采用“码率控制模式”比较合适。

关于视频的帧率,帧率越高,视频越流畅,同时给网络的压力也会增大,输出的码率也会增加,通常来说,光纤接入方式、局域网等网络带宽比较充裕的场合可使用高帧率,如20fps、25fps,而ADSL拨号接入和3G拨号接入则采用低帧率比较合适,如8fps、12fps等

总结
手机用户 网络情况 有wifi 3G 4G 2G

分辨率 建议 QVGA(320x240)、CIF(352x288)
帧率 建议8-12fps

码率
分辩率是176x144典型的取值范围是10kbps ~ 60kbps,---no
分辨率是320x240典型的取值范围是50kbps ~ 120kbps,--no

默认分辨率 320-240 码率在100-500都比较合适---wifi 模式下 实际测试的

视频质量参数
public static final int VIDEO_QUALITY_GOOD = 3; // 中等视频质量
// 设置本地视频编码的质量
AnyChatCoreSDK.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_QUALITYCTRL, configEntity.videoQuality);
关于本地视频编码的质量因子参数:BRAC_SO_LOCALVIDEO_QUALITYCTRL,取值范围为1-6,值越小,画面质量越低,输出码率也越低,值越大,画面质量越高,输出码率也越高。

预设参数:默认3 (3-4)
BRAC_SO_LOCALVIDEO_PRESETCTRL,其取值范围为1-5,主要用来控制CPU资源占用率和画面细节,值越小,编码时的CPU占用率越低,但会损失对画面细节的处理;值越大,编码时的CPU占用率越高,但对画面细节的处理会更细腻,该参数主要针对高码率有效,低码率时由于码率的限制,视频画面细节无法表现出来,所以低码率模式下,可以将该参数调节低一些,以降低CPU的利用率。

支付宝打赏 微信打赏

打赏