‘壹’ WebRtc实现网页和原生P2P视频聊天,视频通话
Webrtc已经成为视频及时互动的标配,日常业务系统中,很多需要web打开就能视频通话,实现类似微信视频聊天裂卜游的功能,但实施是在web上,由于还有业务app集成,同时也要在app原生端实现。
经过多次分析和参考google的官方demo,开发总结了一下:
1,webrtc库尽量肆销要匹配,如现在主流浏览器支持的是webrtc,m79,原生端尽量用这个原生库打包。
2,web的全平台兼容挺难的,特别是ios上只支弊晌持safari内置版本,api和chrome稍有差异。
3,实施上视频摄像头对chrome 64位兼容不不是太好,建议自行封装成chrome内核的客户端
4,webrtc如只是p2p不需要特别服务器,自已开发信令服务就可以啦,当要安装turn server 国内常有打洞不成功需要转发。
效果:
测试:https://m.ovmeet.com:5001/login.html
‘贰’ h5怎么实现视频聊天
视频聊天软件是非常受人欢迎的软件,也是开发起来工序十分复杂的软件,视频聊天软件开发中常常会遇到这样那样的问题,以下是小编整理的十五个常见小问题,不知大家是否也会遇到呢,如果你也会遇到类似问题的话,欢迎和小编进行讨论哦!
1、 服务器该怎么配置
在我的视频聊天软件开发生涯中,曾被无数次问到这个问题,很多人希望我能给她一个明确的性价比高且固定的解释,最好这个配置方案可以用一辈子。比如:2核服务器即可,每月五十元,再过十年也不需要更换……这当然是不可能的。
正经的回答是:视频聊天软件开发完以后,在初期测试阶段及刚开始运营的阶段,由于用户量低,只要普通配置即可,后期再随着用户量的增加,逐渐升级配置。
"普通配置"是指什么呢?假设我们最开始,平台的用户只有2000人,那我们用个8核16g内存的服务器,每月20m的带宽也就差不多了。当然这个配置是要不断升级的,等你平台用户超100万的时候,配置自然也会随之升级。
2、 美颜SDK如何做到离线使用?
视频聊天软件开发中,不可避免的要使用到美颜SDK,有些人希望,这些美颜特效,是可以做到离线使用的(比如在视频聊天软件的动态发布功能中有短视频发布的功能,如果用户希望能够在没网的情况下拍摄一个短视频等有网络的时候发布,这时就会用到离线的美颜),这个要求是可以实现的,只是要做一个key,并且在每次SDK更新时都要重新打包更新这个Key,只是稍微麻烦雹段一点而已。
3、 播放端发生dns劫持怎么办?
有时候,一些黑客会将黑手下到小直播平台上,试图对用户播放器进行dns劫持,以实现自己的目的,中招的用户在打开被劫持的播放器时,页面会跳转到黑客想让他们看到的页面上,如此一样来,必然会导致网络及其他搜索引擎对平台站点的降权,同时也会导致平台用户的流失。
当管理员被用户反映该问题时,只需打开域名注册商网站,找到好肆斗域名的选项,修改DNS即可。通常,视频聊天网站容易遇到这种事情,而视频聊天软件开发中极少遇到。
4、 视频聊友磨天间的小游戏是原生开发的吗?
通常来说,我们会比较推崇原生开发的软件,因为用原生语言进行视频聊天软件开发,最终效果会比混合开发和H5开发的效果要好,但有一个地方不是这样的,那就是聊天室小游戏,这些小游戏通常使用H5页面制成,在这里,H5页面在流畅性上的表现更好。
更多与视频聊天软件开发行业相关的资讯和分析会在以后逐渐放出,敬请期待,需要的朋友请关注我。
文章由驱动号作者:云豹直播系统 原创,转载请注明出处
‘叁’ android 开发中如何实现视频通话功能 !求大神指点!功能实现的思路,及用到的知识点!!感激不尽!!
/**
* Android视频聊天
* 1、初始化SDK 2、连接服务器、 3、用户登录;4、进入房间;5、打开本地视频;6、请求对方视频
*/
public class VideoChatActivity extends Activity implements AnyChatBaseEvent
{
private AnyChatCoreSDK anychat; // 核心SDK
private SurfaceView remoteSurfaceView; // 对方视频
private SurfaceView localSurfaceView; // 本地视频
private ConfigEntity configEntity;
private boolean bSelfVideoOpened = false; // 本地视频是否已打开
private boolean bOtherVideoOpened = false; // 对方视频是否已打开
private TimerTask mTimerTask; // 定时器
private Timer mTimer = new Timer(true);
private Handler handler; // 用Handler来不间断刷新即时视频
private List<String> userlist = new ArrayList<String>();//保存在线用户列表
private int userid; // 用户ID
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_video_chat);
remoteSurfaceView = (SurfaceView) findViewById(R.id.surface_remote);
localSurfaceView = (SurfaceView) findViewById(R.id.surface_local);
configEntity = ConfigService.LoadConfig(this);//加载视频通话设置
loginSystem();// 初始化SDK 连接服务器
mTimerTask = new TimerTask(){
public void run(){
Message mesasge = new Message();
handler.sendMessage(mesasge);
}
};
mTimer.schele(mTimerTask, 1000, 100);
handler = new Handler(){
@Override
public void handleMessage(Message msg){
VideoChat();// 不间断显示即时视频通话画面
super.handleMessage(msg);
}
};
}
// 初始化SDK 连接服务器
private void loginSystem(){
if (anychat == null){
anychat = new AnyChatCoreSDK();
anychat.SetBaseEvent(this); // 设置基本事件回调函数
if (configEntity.useARMv6Lib != 0) // 使用ARMv6指令集
anychat.SetSDKOptionInt(AnyChatDefine.
BRAC_SO_CORESDK_USEARMV6LIB, 1);
anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0); // 初始化SDK
}
anychat.Connect("demo.anychat.cn", 8906);// 连接服务器
}
// 显示即时视频通话画面
public void VideoChat(){
if (!bOtherVideoOpened){
if (anychat.GetCameraState(userid) == 2
&& anychat.GetUserVideoWidth(userid) != 0){
SurfaceHolder holder = remoteSurfaceView.getHolder();
holder.setFormat(PixelFormat.RGB_565);
holder.setFixedSize(anychat.GetUserVideoWidth(userid),
anychat.GetUserVideoHeight(userid));
Surface s = holder.getSurface(); // 获得视频画面
anychat.SetVideoPos(userid, s, 0, 0, 0, 0); // 调用API显示视频画面
bOtherVideoOpened = true;
}
if (!bSelfVideoOpened){
if (anychat.GetCameraState(-1) == 2
&& anychat.GetUserVideoWidth(-1) != 0){
SurfaceHolder holder = localSurfaceView.getHolder();
holder.setFormat(PixelFormat.RGB_565);
holder.setFixedSize(anychat.GetUserVideoWidth(-1),
anychat.GetUserVideoHeight(-1));
Surface s = holder.getSurface();
anychat.SetVideoPos(-1, s, 0, 0, 0, 0);
bSelfVideoOpened = true;
}
}
}
public void OnAnyChatConnectMessage(boolean bSuccess){
if (!bSuccess){
Toast.makeText(VideoChatActivity.this, "连接服务器失败,自动重连,请稍后...", Toast.LENGTH_SHORT).show();
}
anychat.Login("android", ""); // 服务器连接成功 用户登录
}
public void OnAnyChatLoginMessage(int dwUserId, int dwErrorCode){
if (dwErrorCode == 0) {
Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
anychat.EnterRoom(1, ""); // 用户登录成功 进入房间
ApplyVideoConfig();
} else {
Toast.makeText(this, "登录失败,错误代码:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
}
public void OnAnyChatEnterRoomMessage(int dwRoomId, int dwErrorCode){
if (dwErrorCode == 0) { // 进入房间成功 打开本地音视频
Toast.makeText(this, "进入房间成功", Toast.LENGTH_SHORT).show();
anychat.UserCameraControl(-1, 1); // 打开本地视频
anychat.UserSpeakControl(-1, 1); // 打开本地音频
} else {
Toast.makeText(this, "进入房间失败,错误代码:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
}
public void OnAnyChatOnlineUserMessage(int dwUserNum, int dwRoomId){
if (dwRoomId == 1){
int user[] = anychat.GetOnlineUser();
if (user.length != 0){
for (int i = 0; i < user.length; i++){
userlist.add(user[i]+"");
. }
String temp =userlist.get(0);
userid = Integer.parseInt(temp);
anychat.UserCameraControl(userid, 1);// 请求用户视频
anychat.UserSpeakControl(userid, 1); // 请求用户音频
}
else {
Toast.makeText(VideoChatActivity.this, "当前没有在线用户", Toast.LENGTH_SHORT).show();
}
}
}
public void OnAnyChatUserAtRoomMessage(int dwUserId, boolean bEnter){
if (bEnter) {//新用户进入房间
userlist.add(dwUserId+"");
}
else { //用户离开房间
if (dwUserId == userid)
{
Toast.makeText(VideoChatActivity.this, "视频用户已下线", Toast.LENGTH_SHORT).show();
anychat.UserCameraControl(userid, 0);// 关闭用户视频
anychat.UserSpeakControl(userid, 0); // 关闭用户音频
userlist.remove(userid+""); //移除该用户
if (userlist.size() != 0)
{
String temp =userlist.get(0);
userid = Integer.parseInt(temp);
anychat.UserCameraControl(userid, 1);// 请求其他用户视频
anychat.UserSpeakControl(userid, 1); // 请求其他用户音频
}
}
141. else {
userlist.remove(dwUserId+""); //移除该用户
}
}
}
public void OnAnyChatLinkCloseMessage(int dwErrorCode){
Toast.makeText(VideoChatActivity.this, "连接关闭,error:" + dwErrorCode, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy(){ //程序退出
anychat.LeaveRoom(-1); //离开房间
anychat.Logout(); //注销登录
anychat.Release(); //释放资源
mTimer.cancel();
super.onDestroy();
}
// 根据配置文件配置视频参数
private void ApplyVideoConfig(){
if (configEntity.configMode == 1) // 自定义视频参数配置
{
// 设置本地视频编码的码率(如果码率为0,则表示使用质量优先模式)
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_BITRATECTRL,configEntity.videoBitrate);
if (configEntity.videoBitrate == 0)
{
// 设置本地视频编码的质量
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_QUALITYCTRL,configEntity.videoQuality);
}
// 设置本地视频编码的帧率
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FPSCTRL,configEntity.videoFps);
// 设置本地视频编码的关键帧间隔
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_GOPCTRL,configEntity.videoFps * 4);
// 设置本地视频采集分辨率
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_WIDTHCTRL,configEntity.resolution_width);
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_HEIGHTCTRL,configEntity.resolution_height);
// 设置视频编码预设参数(值越大,编码质量越高,占用CPU资源也会越高)
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_PRESETCTRL,configEntity.videoPreset);
}
// 让视频参数生效
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_APPLYPARAM,configEntity.configMode);
// P2P设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_NETWORK_P2PPOLITIC,configEntity.enableP2P);
// 本地视频Overlay模式设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_OVERLAY,configEntity.videoOverlay);
// 回音消除设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_AUDIO_ECHOCTRL,configEntity.enableAEC);
// 平台硬件编码设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_CORESDK_USEHWCODEC,configEntity.useHWCodec);
// 视频旋转模式设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_ROTATECTRL,configEntity.videorotatemode);
// 视频平滑播放模式设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_STREAM_SMOOTHPLAYMODE,configEntity.smoothPlayMode);
// 视频采集驱动设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_CAPDRIVER,configEntity.videoCapDriver);
// 本地视频采集偏色修正设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_LOCALVIDEO_FIXCOLORDEVIA,configEntity.fixcolordeviation);
// 视频显示驱动设置
anychat.SetSDKOptionInt(AnyChatDefine.BRAC_SO_VIDEOSHOW_DRIVERCTRL,configEntity.videoShowDriver);
}
}
‘肆’ 如何利用网络视频服务器搭建视频会议
该视频会议系统利用普通的PC机、标准的视频采集设备、耳机和麦克风,实现基于Internet或者局域网的虚拟会议。它与传统的基于硬件的解决方案不同,V2 Conference视频会议系统是纯软件解决方案,我们无须投入高昂的成本,只要利用现有的局域网络,就能够实现高质量、高可靠性的音视频通讯、协同工作、文档共享、远程会议管理等多种会议功能,有效地节约时间和经费,提高企业的工作效率。这对于一些中小型企业尤为适用! 步骤一 设定服务器,搭建会议室 首先我们要明确的是,服务器不一定要有音视频设备,它设定也比较简单。因为在该平台上,服务器的功能相当于一个中转站,其作用是作为局域网内视频会议的一个“中转站”,而不是大家通常所了解的向局域网发送视频的“源头”。 选定局域网内的某一台电脑作为服务器,这台电脑的配置相对要求会比较高一点,因为它要负担整个局域网视频会议的数据交换。因此建议为PⅢ800/10GB/256MB内存这样的配置以上。在该电脑上安装V2 Conference的服务器端软件,安装完成后桌面上会出现一个“会议监控服务器”的程序图标。双击该图标即可运行V2 Conference服务器端程序了。 在V2 Conference的启动窗口中单击“启动服务器”按钮,将会弹出“会议管理模式”对话框。为简单起见,我们选择“无数据库管理”,然后在下方的设置面板中选择好最大视频数、视频类型、带宽、音频模式等音视频会议的相关参数后,单击“OK”按钮即可启动视频服务器了 提示:单击V2 Conference服务器控制面板上的“高级设置”按钮,可以设定监控服务器的内部IP和外部IP。
‘伍’ 各位大神用Android Studio开发app上视频通话功能,应该怎么做啊,能不能讲一下具体的步骤,真的很急啊!
先考虑登录验证鉴权这些
首先,需要一个服务器做数据中转。你不会用个APP端来做服务器吧,这是肯定的。这就涉及到了服务端SESSION的控制和数据转发控制等一系列问题。
其次APP端需要发起建立SOCKET连接的请求。两个APP都需要先主动建立。发起视频通话的流程的时候,只是再服务端中建立两个SOCKET的映射关系。
然后就是APP段调取摄像头数据和音频数据转换为二进制格式实时传输到服务器,由服务器传送到另外一端APP对二进制数据进行解码。图像和音频都有很多编码方式可以自己选择编解码的库。解码完成后播放音频和展示图片到APP容器即可。当然这个工作是两方APP同时需要做的。
服务器只需要做好SOCKET的维护和数据转发就ok,不用编解码数据,当然也可以编解码来存放。
‘陆’ 局域网内的视频通话,服务器如何设定
首先除了具备即时通讯软件所具备的基础功能点之外,还必须有可扩展性和可统一性!
可扩展是说具备二次开发的功能,这样才会更加适合自身的企业网络使用状况
可统一性是说能作为一个统一通讯平台,集合其他的办公软件
举例:
企业即时通讯软件Active Messenger其特点:
1)系统提供独立的企业即时通讯服务器给企业;
可以在局域网内布置,用户在不上外网的情况下实现局域网内的交流
若有同事需要异地使用,只需要将即时通讯服务器的IP地址映射到外网就可以
2)所有的用户都是由系统管理员按照企业组织架构统一建立的,支持AD域集成;
控制了只有同事或有业务联系的人员才能登录企业即时通讯系统
3)所有交流都经过即时通讯服务器中转;
这样可以在服务器备查历史消息,企业内部交流需要信息的可追溯性
这样的架构使得系统具有企业邮箱的大部分功能
4)系统提供与OA、ERP软件集成的开发接口;
当OA、ERP系统有事务发生时,可以通过AM对相关人员进行提醒
5)其它功能
支持大容量文件及目录的发送,内网速度可以到6M
支持消息的签收,跟踪管理(可以查对方是打开过消息)
支持对离线人员的消息发送(支持带附件带目录,支持对几千人员的群发)
支持多服务器互连(可以建立分布式的企业构架)
支持屏幕截取,并进行批注后发送 (有的时候,文字不能表达清楚,必须通过图片加批注文字才能表达。)
支持语音及视频通讯
支持事务申请
支持会议功能(就某一主题开个会议,结束后可以产生会议记录)
支持历史文档管理
支持客户端历史消息备份管理
除了即时通讯功能外,系统可扩展有用的增值方案;
1、AM短信扩展模块;
2、AM传真扩展模块;
3、AM邮件集成模块;
4、AM网络会议系统(支持多方语音及PPT同步播放)
5、AM企业网络硬盘及文档管理方案;