最近公司需求搞视频监控视频对讲,但个人对视频这块基本全无了解。在网上翻了一圈之后,使用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的移植学习相关推荐

  1. 深入Android 【二】 —— 架构和学习

    原文链接:点击打开链接 摘要: Android架构和特征 千呼万唤始出来,犹抱琵琶半遮. -- <琵琶行> 虽贵为富二代,但Android要是没任何可圈点的地方,开不过70迈,在玲琅满目的 ...

  2. android touch screen keyboard input移植记录

    android touch screen keyboard input移植记录  仅仅是作为记录: Andorid 的 touchscreen 事件必须要有  BTN_TOUCH 才可以. 所以初始化 ...

  3. android 短信ril移植,将Android平台的RIL层移植到基于LINUX的通用平台的研究与实现...

    摘要:本文通过对Android RIL层代码分析,将android RIL层功能在纯LINUX平台上实现,完全脱离了Android系统.为基于LINUX的通用平台实现一套成熟的RIL层代码,并开发出相 ...

  4. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有什么 ...

  5. Android程序员该如何进阶学习以预防35岁中年职场危机?

    一.大家都在担心的问题 不只是Android,很多程序员都在担心业界的"35岁危机",担心自己到35岁后就被市场淘汰. 比如最近就经常被大家问到这样的问题,比如这样的: 大佬好,目 ...

  6. 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植

    1.Android 7编程入门经典(第4版) 使用Android Studio 2  PDF 下载 下载地址: http://www.askwinds.com/r-c/down-info-02/579 ...

  7. LVGL8.2移植学习

    ** LVGL8.2移植学习 链接: LVGL官网. ** LVGL8.2文件组成 LVGL8.2移植所需的文件 文件 描述 路径 demos 官方的示例(可要可不要) lvgl-release-v8 ...

  8. Android开发英语听力软件,基于Android平台的大学英语听力学习系统的设计与实现...

    摘要: 随着信息技术的飞速发展,移动设备给学习提供了一种全新的学习模式,使学者能够在任何时间.任何地点获得自己想要的知识,实现自主学习.本文对基于Android平台的大学英语听力学习系统展开研究,旨在 ...

  9. 基于全志A33开发板linux系统移植学习记录(Boot0)

    基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...

  10. android ICS 系统启动之Logo有关学习总结

    android ICS 系统启动之Logo相关学习总结 前几天把android init 进程看了一遍,这次回过头来再把android系统启动的Logo相关学习内容做一个梳理和总结.我们知道andro ...

最新文章

  1. DFT实训教程笔记2(bibili版本)- Scan synthesis practice
  2. U3D协程Coroutine之WWW与Update()的并行测试
  3. 如何查看数据库索引的利用率?
  4. Maven配置nexus
  5. C#编写程序监测某个文件夹内是否有文件进行了增,删,改的动作?
  6. 使用Anaconda3安装tensorflow,opencv,使其可以在spyder中运行
  7. J-CUBE Appears at AVATAR Xprize at Geneva 2019
  8. PCL之直通滤波--PassThrough
  9. 用Lucene[1].net对数据库建立索引及搜索+
  10. pcs7更改项目计算机名时出错,pcs7的C/S模式,从AS下装到OS或客户机项目时出错-工业支持中心-西门子中国...
  11. 领域知识图谱采坑总结
  12. 图像特效之LOMO效果
  13. 最棒的 7 个 Laravel admin 后台管理系统推荐 - 卡拉云
  14. Android App包瘦身优化
  15. 优秀课件笔记之计算机网络基础
  16. 【Launcher开发】Android桌面布局分析
  17. 阿里cai鸟一二三面+HR面
  18. DDR 器件高温环境失效分析
  19. OpenLDAP中如何禁用账户,启用账户
  20. ASL值的通用计算方法

热门文章

  1. 视频接口的种类及数据类型
  2. 升降压型电感电容计算
  3. iOS逆向专栏总目录(持续更新)
  4. 15个网页数据采集中最常遇到的问题(干货)
  5. 【人工智能】动物、植物、车型、菜品、LOGO识别示例代码
  6. 【滤波跟踪】基于多源信息融合算法实现多旋翼无人机组合导航系统含Matlab源码
  7. 中国计算机省份排名,大变局开启!2019全国各省GDP排名出炉,哪些省份掉队了?...
  8. icem合并面网格_ICEM CFD中合并多个网格
  9. ARGB颜色转16进制颜色
  10. 华为手机上的网上邻居怎么用_华为手机网络邻居功能