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,如需转载请自行联系原作者

相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1692 4
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
455 1
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
监控 Android开发 数据安全/隐私保护
批量发送短信的平台,安卓群发短信工具插件脚本,批量群发短信软件【autojs版】
这个Auto.js脚本实现了完整的批量短信发送功能,包含联系人管理、短信内容编辑、发送状态监控等功能
|
存储 编解码 监控
Android平台GB28181执法记录仪技术方案与实现
本文介绍了大牛直播SDK的SmartGBD在执法记录仪场景中的应用。GB28181协议作为视频监控联网的国家标准,为设备互联互通提供规范。SmartGBD专为Android平台设计,支持音视频采集、编码与传输,具备自适应算法和多功能扩展优势。文章分析了执法记录仪的需求,如实时音视频传输、设备管理及数据安全,并详细阐述了基于SmartGBD的技术实现方案,包括环境准备、SDK集成、设备注册、音视频处理及功能扩展等步骤。最后展望了SmartGBD在未来智慧物联领域的广阔应用前景。
1094 13
|
存储 编解码 开发工具
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
本文详细探讨了在Android平台上实现HTTP-FLV播放器的过程。首先介绍了FLV格式的基础,包括文件头和标签结构。接着分析了HTTP-FLV传输原理,通过分块传输实现流畅播放。然后重点讲解了播放器的实现步骤,涵盖网络请求、数据解析、音视频解码与渲染,以及播放控制功能的设计。文章还讨论了性能优化和网络异常处理的方法,并总结了HTTP-FLV播放器的技术价值,尤其是在特定场景下的应用意义。
893 11
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
10874 2
|
IDE 开发工具 Android开发
移动应用开发之旅:探索Android和iOS平台
在这篇文章中,我们将深入探讨移动应用开发的两个主要平台——Android和iOS。我们将了解它们的操作系统、开发环境和工具,并通过代码示例展示如何在这两个平台上创建一个简单的“Hello World”应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧,帮助你更好地理解和掌握移动应用开发。
471 17
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
626 31
|
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开发知识可参考相关书籍。
1027 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库

热门文章

最新文章