音视频通信
作为独立开发者或想缩短音视频开发周期的公司来说,想要在Android平台下实现音视频通信,最快捷的方法是寻找开源项目或调用其他公司API。之所以这么说是因为音视频通信技术涉及到底层音视频采集、解码、 FFmpeg(音视频处理解决方案)、媒体流传输协议等太多太多相关技术知识点。试了 几个开源项目,视频差强人意,语音与视频不同步等不稳定因素。因此我把目光放到其他公司的API上()。demo程序API提供了一系列纯Java语言的调用接口,通过JNI即可调用内核共享库(.so 类似win32 的dll),根据官方开发文档我很快就实现音视频通信,下面是我在调用其API的经验总结。视频效果图如下:
Android通信平台相关API方法
-
- public native int InitSDK(int osver, int flags);
-
- public native int Connect(String serverip, int port);
-
- public native int Login(String username, String password);
-
- public native int EnterRoom(int roomid, String password);
-
- public native int EnterRoomEx(String roomname, String password);
-
- public native int LeaveRoom(int roomid);
-
- public native int SetVideoPos(int userid, Surface surface, int lef,
- int top, int right, int bottom);
-
-
-
-
-
-
-
-
- public native int Logout();
-
- public native int Release();
一、初始化SDK
初始化SDK是首先要完成的,用于设置SDK的一些行为,包括设置对应的回调函数。代码如下:
-
- private void InitialSDK() {
- if (anychat == null) {
- anychat = new AnyChatCoreSDK();
-
- anychat.SetBaseEvent(this);
- if (configEntity.useARMv6Lib != 0)
- anychat.SetSDKOptionInt(AnyChatDefine.
- BRAC_SO_CORESDK_USEARMV6LIB, 1);
- anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0);
- bNeedRelease = true;
- }
- }
二、登录系统
当初始化SDK完成之后,便可以实现连接服务器、验证用户身份、用户登录等。
-
- anychat.Connect("211.155.25.90", 8906);
-
- anychat.Login("android","");
连接服务器和登录系统都是一个异步的过程,调用后会立即返回。在回调函数中根据返回代码判断服务器是否连接成功和登录成功。
三、进入房间
登录成功后就可进入相应的房间,只有在相同房间的用户才能进行音视频通信。代码如下
1、进入房间
-
- anychat.EnterRoom(1, "");
进入房间后系统会将该房间在线用户发送给客户端,只有在同一个房间用户才能进行音视频互交、文字聊天、文件传输等。当新用户进入房间或用户下线,都会触发异步消息通知上层应用更改状态。
2、文字聊天
成功进入房间后,便可调用API接口向指定用户或房间中所有在线用户发送文字 聊天消息。
-
- String message = messageEditText.getText().toString();
- anychat.SendTextMessage(-1, 0,message);
其他用户收到文字聊天消息会触发相应的回调函数并将聊天消息显示在界面上。
3、请求其他用户的音视频
-
- anychat.UserCameraControl(userID, 1);
-
- anychat.UserSpeakControl(userID, 1);
4、音视频的显示与播放
-
- if (!bOtherVideoOpened) {
- if (anychat.GetCameraState(userID) == 2
- && anychat.GetUserVideoWidth(userID) != 0) {
- SurfaceHolder holder = otherView.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);
- bOtherVideoOpened = true;
- }
- }
-
- if (!bSelfVideoOpened) {
- if (anychat.GetCameraState(-1) == 2
- && anychat.GetUserVideoWidth(-1) != 0) {
- SurfaceHolder holder = myView.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;
- }
- }
Android程序中,当收到用户的媒体流数据时,Android客户端只需提供一个SurfaceView控件,内核自动将视频媒体流数据显示在该控件上并播放声音。
四、释放资源
与前面讲的连接服务器、登录系统、进入房间对应的的是离开房间、注销系统、释放资源。代码如下:
- protected void onDestroy() {
-
- anychat.LeaveRoom(-1);
-
- anychat.Logout();
-
- anychat.Release();
- }
离开房间后可再进入房间,但是注销登录和释放资源后,SDK将不再工作。在Activity生命周期结束的时候可以将占用资源释放,程序退出。
总结:还有其他诸如发送文件、P2P连接、对Android设备设置、获取在线用户等非常实用功能等待你们去挖掘。用java我们也能快速实现音视频通信
本文转自 fanxiaojun 51CTO博客,原文链接:http://blog.51cto.com/2343338/1141245,如需转载请自行联系原作者