现代手机更新换代如此之快,以至于家中往往有闲置不用的手机。本APP用一部闲置手机作为监控相机,在另一部手机上实现远程监控。

作为监控摄像机的手机称为服务器端,观看监控视频的手机称为客户端

对于使用环境的要求是服务器端通过无线路由器WIFI接入互联网,客户端通过互联网远程访问服务器端。
路由器需要进行简单设置:

  • DHCP静态IP分配,使服务端在局域网内的地址固定下来。
  • 端口转发,将路由器的指定端口与服务器端的内网IP地址绑定,使客户端可以从外部访问服务器端。


使用时,需要在客户端输入路由器的外网IP地址,家庭用户路由器的IP地址通常是电信运营商动态分配的,时时会发生变化,客户端获取路由器IP地址的方法有两种:

  • 在客户端安装路由器管理APP,路由器厂商通常都会提供路由器管理APP。通过路由器管理APP可以实时查看路由器的IP地址。
  • 在花生壳上用内网计算机注册私有域名,私有域名与路由器绑定。在客户端安装花生壳管理APP,通过APP可以实时查看私有域名的IP地址,这个IP地址就是路由器的地址。如果不使用花生壳,其他域名解析提供者也有类似工具。

由于服务器端和客户端都需要发送信息到对方,因此用TCP协议实现服务器端和客户端的双工通信。

服务器端构成


图中所示为构成服务器端的主要类:

  • MainActivity 用户交互主页面
  • SettingsActivity 参数设置页面,可以设置编码器的图像分辨率和视频编码标准。
  • AutoFitTextureView 服务器端的视频显示组件
  • MainViewModel Android官方推荐使用MVVM架构,ViewModel是MVVM架构的重要组件,它负责为UI/View准备数据,它与外部通信通过LiveData进行。
  • CameraIntentService 提供与客户端的通信服务,接收客户端的通信请求。通信连接成功后,建立服务器通信线程。
  • ServerThread 服务器通信线程,发送编码后的视频数据流,接收客户端的字符信息。
  • MediaCodecCallback 编码器采用异步工作模式,必须对编码器的各个回调函数重载,以实现本系统所需视频编码功能。
  • ByteBufferTransfer 承载视频编码后得到的数据以及解码器需要的相关情报,它的每个实例代表一帧图像,经过通信连接,以数据流发送到客户端。

服务器端将镜头拍摄的视频信号经编码后逐帧传送给客户端,由于视频拍摄和信号传输各自具有不同的时序,因此使用异步方式实现协同动作。

服务器端的技术要点

  • 视频编码数据获取
    在android camera2的基础上,使用所推荐的流程控制相机。
    为了取得相机帧数据,以下代码把编码器的InputSurface添加到CameraRequest的targets列表中,
    在预览过程中,CameraDevice返回的帧数据就能够送到编码器中。

    val encoderInputSurface = MediaCodec.createPersistentInputSurface()
    mediaCodec.setInputSurface(encoderInputSurface)
    mediaCodec.start()
    previewRequestBuilder.addTarget(encoderInputSurface)
    
  • 视频编码器参数

    视频编码器需要设置的参数如下:

  • videoCodecMime(编码格式) 可以在SettingsActivity中选择,本系统仅有H264和H265可以选择,注意!老的手机往往不支持H265。
  • videoCodecSize(采样分辨率) 可以在SettingsActivity中选择,是手机常用的分辨率。
  • KEY_FRAME_RATE(帧率) 这个参数在程序中固定为30。
  • KEY_COLOR_FORMAT(颜色格式) 这个参数在程序中固定为MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface。
  • KEY_I_FRAME_INTERVAL(关键帧间隔) 单位是秒,这个参数用于指定帧间预测所需关键帧在码流中的间隔,间隔越大,数据压缩率越高。但为了画面流畅,设为零,也就是没有用帧间预测。
  • KEY_BIT_RATE(比特率) 比特率 = 分辨率宽 x 分辨率高 x 比特率系数。比特率系数是固定值,H264为14,H265为10,因为H265有更高的压缩率。
  • 双工通信

    收到客户端的请求后,建立服务器通信线程。在线程中建立并行的两个循环,一个用Loop+Handler实现,Handler负责接收视频编码器的输出,送入objectOutputStream,发送到客户端。
    另一个用While实现,从objectInputStream中读取来自客户端的数据,根据数据的类别进行相应处理。

客户器端构成


图中所示为构成客户端的主要类:

  • MainActivity 主页面容器
  • SettingsActivity参数设置页面,仅用来设置服务器端的IP地址。
  • MainFragment 用户交互主页面
  • MainViewModel 是MVVM架构的重要组件,它负责为UI/View准备数据,它与外部通信通过LiveData进行。
  • ClientThread 通信用客户端线程
  • MonitorTextureView 客户端的视频显示组件
  • MediaCodecAction 包装了解码器的静态操作方法
  • DecoderCallback 解码器的回调函数
  • ByteBufferTransfer 服务器端发送过来的实例,解码后得到帧图像。

接收到服务器端发送的视频码流,经解码后把视频信号交给视频显示组件。

客户端的技术要点

  • 指定解码器输出

    取得显示View的surface,

val surface = Surface(super@MonitorTextureView.getSurfaceTexture())

设置解码器时,把surface作为参数传给mediaCodec.configure()方法即可。

  • 视频解码器参数
  • mime(编码格式) 服务器发送过来的ByteBufferTransfer的实例中,包含此参数,不需单独设置。
  • size(采样分辨率) 服务器发送过来的ByteBufferTransfer的实例中,包含此参数,不需单独设置。
  • csd(Codec-specific数据) 服务器端编码时产生该数据,包含在ByteBufferTransfer的实例中。
  • 双工通信

    与服务器端相似,在线程中建立并行的两个循环,一个用来接收,另一个用来发送。

在测试中,服务器端和客户端均使用联通的网络时,视频传输比较流畅。
但是服务器端使用联通网络,客户端使用移动网络时,卡顿非常严重,原因不得而知,也许运营商之间有壁垒。

源程序代码公开,欢迎同行的指摘、建议,如有需要改进之处,我当尽力为之。
有任何问题,请联系。邮箱:wxson@126.com

用安卓手机实现视频监控相关推荐

  1. android 录制视频模糊,安卓手机录制视频不清晰是什么原因?_科技数码通

    你好,很高兴回答你的问题!安卓手机录制视频不清晰的问题是多方面的,可以从以下角度进行检查: 一.手机的像素配置低 其实以现在主流的手机来讲,录制视频并不应该会不清晰,如果存在不清晰的情况,大概就是手机 ...

  2. 手机移动视频监控系统方案

    1.引言 随着社会的发展, 视频监控技术在各行各业得到了广泛的应用.如何让用户实现随时随地进行监控,手机移动监控系统提供了一个很好的解决方案 .通过无线网络与互联网的结合,手机移动监控系统把监控设备的 ...

  3. 视频监控系统app服务器如何设置,手机app视频监控服务器配置

    手机app视频监控服务器配置 内容精选 换一换 网站的访问与云服务器的网络配置.端口通信.防火墙配置.安全组配置等多个环节相关联.任意一个环节出现问题,都会导致网站无法访问.本节操作介绍网站无法访问时 ...

  4. 【转载】简单几步用手机打造视频监控

    家里有老人.小孩的朋友们一定有过这样的体验,工作繁忙压力大,对家庭的照料难免疏忽,小孩老人更是让人担心不已,加上最近频发的老人或小孩一个人留在家中,结果出现意外情况而自己却不知道的情况屡见不鲜.而为此 ...

  5. android控制手机强制手机横竖方向,使用android IOIO和安卓手机制作视频遥控小车(控制灯的开关、实时视频传输、方向控制)...

    android IOIO是通过安卓手机的USB接口控制的电路板,通过android IOIO可以不需要太多的硬件知识,通过安卓手机转接的IOIO板控制外围设备,配件有纸盒.L298N电机驱动模块.旧手 ...

  6. android 视频做背景图片,视频后面怎么加背景图片?安卓手机给视频添加背景图片的方法...

    狸窝是帮助用户解决问题 提供教程解决方案 在这个过程中有使用我们自己开发的软件 也有网上找的工具 只要帮助用户解决问题就好!同意则往下继续了解学习 ... 注意此教程方案是:『安卓手机端教程方案』.很 ...

  7. 用户吐槽不能给安卓手机发视频,库克:“给你妈妈买台 iPhone !”

    多年以来,苹果和谷歌之间就iOS和Android系统之间的信息互传存在着"蓝绿气泡之争". 本周三,苹果CEO蒂姆·库克在发布了一系列新产品后参加了Vox Media的Code 2 ...

  8. android滚动广告图片素材,安卓手机宣传视频制作软件如何在视频底部添加一行滚动的广告语?视频加滚动水印...

    窝是帮助用户解决问题 提供教程解决方案 在这个过程中有我们.... 『安卓手机端教程方案』上周,小编介绍了手机视频片尾滚动字幕制作的方法,今天要介绍的是在视频底部加一行滚动水印的方法,适合到不限于制作 ...

  9. Android手机实现视频监控

    基本原理:主要是通过WiFi不断传输电脑端摄像头抓取的图像给Android手机端进行刷新显示,达到视频监控的效果. 实现方案:电脑端作为服务器端,通过Python编写代码:手机端作为客户端,通过Jav ...

最新文章

  1. openstack havana块存储Cinder磁盘加密方法研究
  2. 苏宁智能 BU大数据中心数据治理团队负责人韦真:数据治理“三字经”,超实用!...
  3. 目标检测论文阅读:Multi-scale Location-aware Kernel Representation for Object Detection(CVPR2018)
  4. 分子排列不同会导致_武汉理工《Matter》:构筑晶体内跨尺度分子筛单晶反应器...
  5. java布尔值_Java中的布尔值与布尔值
  6. linux如何关闭oracle数据库,linux关闭oracle数据库命令
  7. Eclipse debug 的 drop to frame 的技巧
  8. php表格双实线边框代码,23款表格边框代码
  9. IExplore.exe应用程序错误解决方法
  10. 【3本精挑细选的书籍】网络爬虫推荐书籍(Python)【从0到实践】
  11. linux系统支持ntfs吗,Linux支持NTFS格式文件的方法
  12. 人生需有三心境,你有吗?
  13. 微服务拆分时机与原则
  14. MT4-EA自动化交易研究笔记(2022-06-24)
  15. 使用initial-letter实现首字下沉效果,感兴趣的同学欢迎猛击:
  16. Git中文件夹灰色无法打开问题解决
  17. 华为笔试4.6回文排列数量
  18. 一加7P刷写Edxposed模块
  19. 【沪江日语电台】Love Love J-popVol.2
  20. 计算机图形学在线考试,《计算机图形学》试题-A卷及参考答案

热门文章

  1. Long类型转为String类型
  2. TP与laravel简介
  3. 使用GEOquery 下载并读取数据
  4. 大都会人寿培训第二天
  5. CentOS7安装Stegsolve不报错
  6. 深入理解 Flink 容错机制
  7. PostgreSQL 技术文档
  8. #父与子的编程之旅#第十三章
  9. 从外包到拿下阿里 offer,这 2 年 5 个月 13 天到底发生了什么?
  10. 正益工作能担起PaaS+SaaS的未来探索吗?