Android平台下通过JNI快速实现音视频通信

简介:

音视频通信

作为独立开发者或想缩短音视频开发周期的公司来说,想要在Android平台下实现音视频通信,最快捷的方法是寻找开源项目或调用其他公司API。之所以这么说是因为音视频通信技术涉及到底层音视频采集、解码、 FFmpeg(音视频处理解决方案)、媒体流传输协议等太多太多相关技术知识点。试了 几个开源项目,视频差强人意,语音与视频不同步等不稳定因素。因此我把目光放到其他公司的API上(点击下载demo程序)。demo程序API提供了一系列纯Java语言的调用接口,通过JNI即可调用内核共享库(.so 类似win32 的dll),根据官方开发文档我很快就实现音视频通信,下面是我在调用其API的经验总结。视频效果图如下:

Android通信平台相关API方法


 
 
  1. // 初始化SDK  
  2.     public native int InitSDK(int osver, int flags);  
  3.     // 连接服务器  
  4.     public native int Connect(String serverip, int port);  
  5.     // 登录系统  
  6.     public native int Login(String username, String password);  
  7.     // 进入房间(房间ID)  
  8.     public native int EnterRoom(int roomid, String password);  
  9.     // 进入房间(房间名称)  
  10.     public native int EnterRoomEx(String roomname, String password);  
  11.     // 退出房间  
  12.     public native int LeaveRoom(int roomid);  
  13.     // 设置视频显示位置  
  14.     public native int SetVideoPos(int userid, Surface surface, int lef,  
  15.             int top, int right, int bottom);  
  16.     /**  
  17.      * 功能: 设置视频显示位置,或是刷新视频显示 返回值:0表示成功,否则为出错代码   
  18.      * 参数:   
  19.      * userid  用户ID   
  20.      * surface 视频显示界面,android客户端只需提供SurfaceView控件,内核自动将视频显示在控件上  
  21.      * lef,top,right,bottom视频显示位置信息  
  22.      */ 
  23.     // 注销登录  
  24.     public native int Logout();  
  25.     // 释放资源  
  26.     public native int Release(); 

一、初始化SDK

初始化SDK是首先要完成的,用于设置SDK的一些行为,包括设置对应的回调函数。代码如下:


 
 
  1. //初始化SDK  
  2.     private void InitialSDK() {  
  3.         if (anychat == null) {  
  4.             anychat = new AnyChatCoreSDK();  
  5.             //设置基本事件回调函数  
  6.             anychat.SetBaseEvent(this);  
  7.             if (configEntity.useARMv6Lib != 0)  
  8.                 anychat.SetSDKOptionInt(AnyChatDefine.  
  9.                         BRAC_SO_CORESDK_USEARMV6LIB, 1);            //使用ARMv6指令集  
  10.             anychat.InitSDK(android.os.Build.VERSION.SDK_INT, 0);   //初始化SDK 的一个参数是android API版本  
  11.             bNeedRelease = true;  
  12.         }  
  13.     } 

二、登录系统

当初始化SDK完成之后,便可以实现连接服务器、验证用户身份、用户登录等。


 
 
  1. //连接服务器  
  2.         anychat.Connect("211.155.25.90"8906);  
  3.         //登录系统  
  4.         anychat.Login("android",""); 

连接服务器和登录系统都是一个异步的过程,调用后会立即返回。在回调函数中根据返回代码判断服务器是否连接成功和登录成功。

三、进入房间

登录成功后就可进入相应的房间,只有在相同房间的用户才能进行音视频通信。代码如下

1、进入房间


 
 
  1. //进入1号房间  
  2. anychat.EnterRoom(1"");    

进入房间后系统会将该房间在线用户发送给客户端,只有在同一个房间用户才能进行音视频互交、文字聊天、文件传输等。当新用户进入房间或用户下线,都会触发异步消息通知上层应用更改状态。

2、文字聊天

成功进入房间后,便可调用API接口向指定用户或房间中所有在线用户发送文字 聊天消息。


 
 
  1. //发送文字聊天消息  
  2.         String message = messageEditText.getText().toString();  
  3.         anychat.SendTextMessage(-10,message); 

其他用户收到文字聊天消息会触发相应的回调函数并将聊天消息显示在界面上。

3、请求其他用户的音视频


 
 
  1. // 请求对方的视频流   
  2.         anychat.UserCameraControl(userID, 1);  
  3.         // 请求对方的音频流   
  4.         anychat.UserSpeakControl(userID, 1); 

4、音视频的显示与播放


 
 
  1. //判断远程用户视频是否已打开  
  2.         if (!bOtherVideoOpened) {  
  3.             if (anychat.GetCameraState(userID) == 2 
  4.                     && anychat.GetUserVideoWidth(userID) != 0) {  
  5.                 SurfaceHolder holder = otherView.getHolder();   //获得SurfaceView控件  
  6.                 holder.setFormat(PixelFormat.RGB_565);          //设置显示格式  
  7.                 holder.setFixedSize(anychat.GetUserVideoWidth(userID),  
  8.                         anychat.GetUserVideoHeight(userID));    //设置视频显示宽高  
  9.                 Surface s = holder.getSurface();                //获得视频画面  
  10.                 anychat.SetVideoPos(userID, s, 0000);     //调用API显示视频画面  
  11.                 bOtherVideoOpened = true;  
  12.             }  
  13.         }  
  14.         //判断本地视频是否已打开  
  15.         if (!bSelfVideoOpened) {  
  16.             if (anychat.GetCameraState(-1) == 2 
  17.                     && anychat.GetUserVideoWidth(-1) != 0) {  
  18.                 SurfaceHolder holder = myView.getHolder();      //获得SurfaceView控件  
  19.                 holder.setFormat(PixelFormat.RGB_565);          //设置显示格式  
  20.                 holder.setFixedSize(anychat.GetUserVideoWidth(-1),  
  21.                         anychat.GetUserVideoHeight(-1));        //设置视频显示宽高  
  22.                 Surface s = holder.getSurface();                //获得视频画面  
  23.                 anychat.SetVideoPos(-1, s, 0000);         //调用API显示视频画面  
  24.                 bSelfVideoOpened = true;  
  25.             }  
  26.         } 

Android程序中,当收到用户的媒体流数据时,Android客户端只需提供一个SurfaceView控件,内核自动将视频媒体流数据显示在该控件上并播放声音。

四、释放资源

与前面讲的连接服务器、登录系统、进入房间对应的的是离开房间、注销系统、释放资源。代码如下:


 
 
  1. protected void onDestroy() {  
  2.     //离开房间  
  3.     anychat.LeaveRoom(-1);  
  4.     //注销登录  
  5.     anychat.Logout();  
  6.     //释放资源 关闭SDK 不再返回登录界面  
  7.     anychat.Release(); 
  8. }

离开房间后可再进入房间,但是注销登录和释放资源后,SDK将不再工作。在Activity生命周期结束的时候可以将占用资源释放,程序退出。

总结:还有其他诸如发送文件、P2P连接、对Android设备设置、获取在线用户等非常实用功能等待你们去挖掘。用java我们也能快速实现音视频通信




本文转自 fanxiaojun 51CTO博客,原文链接:http://blog.51cto.com/2343338/1141245,如需转载请自行联系原作者

相关实践学习
搭建简易多人在线视频会议系统
本场景将介绍使用音视频服务单间一个简易的视频会议室。
相关文章
|
13天前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
51 1
|
29天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
4天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
22 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
1月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
60 6
|
1月前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
1月前
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
198 4
|
1月前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术与科学
在移动应用开发的广阔天地中,安卓与iOS两大平台如同东西方哲学的碰撞,既有共通之处又各具特色。本文将深入探讨这两个平台的设计理念、开发工具和市场定位,旨在为开发者提供一份简明扼要的指南,帮助他们在这场技术与商业的博弈中找到自己的道路。通过比较分析,我们将揭示每个平台的优势与局限,以及它们如何影响应用的性能、用户体验和市场接受度。无论你是初涉江湖的新手,还是经验丰富的老手,这篇文章都将为你的选择提供新的视角和思考。
34 5
|
1月前
|
人工智能 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术
在移动应用开发的广阔天地里,安卓和iOS两大操作系统各占半壁江山。本文将深入探讨这两个平台的开发环境、工具及市场趋势,帮助开发者在选择适合自己项目的平台时做出更明智的决策。通过比较各自的优势与局限,我们不仅能更好地理解每个系统的核心特性,还能洞察未来技术发展的脉络。无论你是刚入行的新手还是资深开发者,这篇文章都将为你提供有价值的参考和启示。
45 5
|
1月前
|
Linux Android开发 iOS开发
探索Android与iOS开发:平台之战还是互补共生?
在移动应用开发的浩瀚宇宙中,Android和iOS这两大星系始终吸引着无数开发者的目光。它们各自拥有独特的引力场,引领着技术潮流的方向。本文将穿梭于这两个平台的星际空间,揭示它们背后的力量对比,以及如何在这两者之间找到平衡点,共同推动移动应用开发的进步。
36 1
|
1月前
|
移动开发 开发框架 Android开发
安卓与iOS开发:平台之战的新篇章
在移动应用开发的广阔天地中,安卓和iOS始终占据着主导地位。本文通过比较这两个平台的发展历程、技术特点及未来趋势,探讨了它们之间的竞争与合作。文章旨在为开发者提供一个清晰的平台选择指南,并预测未来移动开发的可能走向。
45 1