【Android】EasyClient与EasyCamera的移植学习
最近公司需求搞视频监控视频对讲,但个人对视频这块基本全无了解。在网上翻了一圈之后,使用EasyDarwin家的源码做了基础尝试。
EasyCamera
首先是移植EasyCamera。既然要移植,当然要分析源码。
EasyCamera的主要UI在StreamActivity上,如果是只是想抓一个视频界面来用,只要把这个Activity搬过去就好。不过我的需求是在我自己的项目的界面上进行显示。因此还要拆分啊。
UI方面的暂且不提。
mMediaStream = new MediaStream(getApplicationContext(), surfaceView.getHolder());
mMediaStream.updateResolution(width, height);
mMediaStream.setDgree(getDgree());
以上是初始化一个流媒体
接下来我们看一下它的构造。
public MediaStream(Context context, SurfaceHolder holder) {mApplicationContext = context;mSurfaceHolderRef = new WeakReference(holder);mEasyPusher = new EasyPusher();audioStream = new AudioStream(mEasyPusher, null, EasyApplication.aio, EasyApplication.sMainBus);mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {Log.d(TAG, "kim onReceive: "+intent.getAction());mRequestSnapshot = true;}};IntentFilter filter = new IntentFilter();filter.addAction(MediaStream.ACTION_SNAPSHOT_REQ);LocalBroadcastManager.getInstance(mApplicationContext).registerReceiver(mReceiver, filter);}
其中EasyPusher是直接对接jni方法。对于jni我也全无研究,今后要适当看点资料了。
而AudioStream内提供了一个编码方法。
回到StreamActivity,再看下一步:
mPusherCallBack = new EasyPusher.OnInitPusherCallback() {@Overridepublic void onCallback(int code) {switch (code) {case CODE.EASY_ACTIVATE_INVALID_KEY:sendMessage("无效Key");break;case CODE.EASY_ACTIVATE_SUCCESS:sendMessage("激活成功");break;case CODE.EASY_PUSH_STATE_CONNECTING:sendMessage("连接中");
这个功能是什么就不用多说了吧。
之后注册的一个广播也是核心功能。
mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (CommandService.ACTION_START_STREAM.equals(intent.getAction())) {} else if (CommandService.ACTION_STOP_STREAM.equals(intent.getAction())) {} else if (CommandService.ACTION_COMMOND_RESTART_THREAD.equals(intent.getAction())) {}};
其中ACTION_START_STREAM内便是开始启动视频对接。具体内容请去看源码。
我需要的功能也很简单,就是移植。因此把初始化内的内容照原样搬过去就可以了。不过在搬过去的途中遇到了一个小坑,主要来自于移植所用的SurfaceView
<SurfaceView
android:id="@+id/sv_surfaceview"android:keepScreenOn="true"android:layout_width="match_parent"android:layout_height="match_parent" />
这个SurfaceView在android测试中似乎必须显示,移出视图外也不行,若不显示则在某些机子上会出现对面的Client可以听见声音,但是无法观看视频的现象。具体原因是什么我也不知道,如果有知道的大牛希望可以不吝赐教。
EasyClient中的列表与EasyCamera配对的方式主要是通过Serial,因此如果有需求对指定用户名进行匹配的情况,就把这句修改就好了。
public String getDeviceSerial(){return InfoSharedPreference.getString(this , Config.device_serial_key);
}
EasyCilent
下一步是移植EasyClient。
移植EasyClient的途中没遇上太多坑,还算是比较顺利的。公司需求是点击用户的监视按钮,则对已开启EasyCamera的用户进行监视。
EasyClient中我主要使用的就是
EasyPlayerActivity这个activity。原样搬过去基本就可以了,当然途中若修改了包名,则需要去官方申请一个key值。
- 注意申请时填写的必须是ApplicationID而不是包名。
key替换在这里。
private void startRending(Surface surface) {mStreamRender = new EasyRTSPClient(this, "79393674363536526D3432413254315A7073496D4A655A76636D63755A57467A65575268636E64706269356C59584E35593278705A573530567778576F502B6C34456468646D6C754A6B4A68596D397A595541794D4445325257467A65555268636E6470626C526C5957316C59584E35", surface, mResultReceiver);Log.i("SpeedTalk" , "Url>>>" + mRTSPUrl + ",TCP>>" + RTSPClient.TRANSTYPE_TCP);mStreamRender.start(mRTSPUrl, RTSPClient.TRANSTYPE_TCP, RTSPClient.EASY_SDK_VIDEO_FRAME_FLAG | RTSPClient.EASY_SDK_AUDIO_FRAME_FLAG, "admin", "admin");}
在点击打开这个Activity之前,还需要对已开启EasyCamera的用户进行一个查询。
查询的代码在CameraFragment中,主页的三个碎片都是继承自这个界面的,只需要替换
protected String mType = "ARM_Linux";
就可以进行切换。
MyApplication.asyncGet(url, new CallbackWrapper<DeviceListBody>(DeviceListBody.class) {@Overridepublic void onBefore(Request request) {mSwipeRefreshLayout.setRefreshing(false);activity.showWaitProgress("");}@Overridepublic void onAfter() {activity.hideWaitProgress();}@Overridepublic void onError(Call call, Exception e) {Toast.makeText(mContext, "onError:" + e.toString(), Toast.LENGTH_LONG).show();}@Overridepublic void onResponse(DeviceListBody body) {List<DeviceListBody.Device> devices = body.getDevices();if (devices.size() == 0) {activity.showToadMessage("暂无直播信息");liveVOAdapter = new OnlineCameraAdapter(new ArrayList<DeviceListBody.Device>());} else {liveVOAdapter = new OnlineCameraAdapter(devices);int screenW = mContext.getResources().getDisplayMetrics().widthPixels;int columnum = mGrid_live.getNumColumns();int space = (int) (mContext.getResources().getDimension(R.dimen.gridview_horizontalspacing));int itemWidth = (int) ((screenW - (columnum - 1) * space) / columnum);int itemHeight = getItemHeight(itemWidth);liveVOAdapter.setmSnapshotWidth(itemWidth);liveVOAdapter.setmSnapshotHeight(itemHeight);// int screenW = mContext.getResources().getDisplayMetrics().widthPixels;
// int columnum = mGrid_live.getNumColumns();
// int space = (int)(mContext.getResources().getDimension(R.dimen.gridview_horizontalspacing));
// int itemWidth = (int)((screenW-(columnum-1)*space)/columnum);
// int itemHeight = (int) (itemWidth * 4 / 3.0 + 0.5f);
// liveVOAdapter.setmSnapshotWidth(itemWidth);
// liveVOAdapter.setmSnapshotHeight(itemHeight);}mGrid_live.setAdapter(liveVOAdapter);}});
上面的onResponse就是进行了直播列表查询的相关方法。在使用时只需要原样替换就好。
移植两边之后,就可以进行正常的监视操作了。至于实现对讲,还在继续研究。至少这个案例当两边同时监听的时候,Android端会崩溃。
EasyDarwin这个平台稍微有点不稳定,后续需要调整的部分估计有不少。
上个官网源码。
https://github.com/EasyDarwin
【Android】EasyClient与EasyCamera的移植学习相关推荐
- 深入Android 【二】 —— 架构和学习
原文链接:点击打开链接 摘要: Android架构和特征 千呼万唤始出来,犹抱琵琶半遮. -- <琵琶行> 虽贵为富二代,但Android要是没任何可圈点的地方,开不过70迈,在玲琅满目的 ...
- android touch screen keyboard input移植记录
android touch screen keyboard input移植记录 仅仅是作为记录: Andorid 的 touchscreen 事件必须要有 BTN_TOUCH 才可以. 所以初始化 ...
- android 短信ril移植,将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现...
摘要:本文通过对Android RIL层代码分析,将android RIL层功能在纯LINUX平台上实现,完全脱离了Android系统.为基于LINUX的通用平台实现一套成熟的RIL层代码,并开发出相 ...
- Android 服务类Service 的详细学习
http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有什么 ...
- Android程序员该如何进阶学习以预防35岁中年职场危机?
一.大家都在担心的问题 不只是Android,很多程序员都在担心业界的"35岁危机",担心自己到35岁后就被市场淘汰. 比如最近就经常被大家问到这样的问题,比如这样的: 大佬好,目 ...
- 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植
1.Android 7编程入门经典(第4版) 使用Android Studio 2 PDF 下载 下载地址: http://www.askwinds.com/r-c/down-info-02/579 ...
- LVGL8.2移植学习
** LVGL8.2移植学习 链接: LVGL官网. ** LVGL8.2文件组成 LVGL8.2移植所需的文件 文件 描述 路径 demos 官方的示例(可要可不要) lvgl-release-v8 ...
- Android开发英语听力软件,基于Android平台的大学英语听力学习系统的设计与实现...
摘要: 随着信息技术的飞速发展,移动设备给学习提供了一种全新的学习模式,使学者能够在任何时间.任何地点获得自己想要的知识,实现自主学习.本文对基于Android平台的大学英语听力学习系统展开研究,旨在 ...
- 基于全志A33开发板linux系统移植学习记录(Boot0)
基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...
- android ICS 系统启动之Logo有关学习总结
android ICS 系统启动之Logo相关学习总结 前几天把android init 进程看了一遍,这次回过头来再把android系统启动的Logo相关学习内容做一个梳理和总结.我们知道andro ...
最新文章
- DFT实训教程笔记2(bibili版本)- Scan synthesis practice
- U3D协程Coroutine之WWW与Update()的并行测试
- 如何查看数据库索引的利用率?
- Maven配置nexus
- C#编写程序监测某个文件夹内是否有文件进行了增,删,改的动作?
- 使用Anaconda3安装tensorflow,opencv,使其可以在spyder中运行
- J-CUBE Appears at AVATAR Xprize at Geneva 2019
- PCL之直通滤波--PassThrough
- 用Lucene[1].net对数据库建立索引及搜索+
- pcs7更改项目计算机名时出错,pcs7的C/S模式,从AS下装到OS或客户机项目时出错-工业支持中心-西门子中国...
- 领域知识图谱采坑总结
- 图像特效之LOMO效果
- 最棒的 7 个 Laravel admin 后台管理系统推荐 - 卡拉云
- Android App包瘦身优化
- 优秀课件笔记之计算机网络基础
- 【Launcher开发】Android桌面布局分析
- 阿里cai鸟一二三面+HR面
- DDR 器件高温环境失效分析
- OpenLDAP中如何禁用账户,启用账户
- ASL值的通用计算方法