现在具有wifi遥控功能的照相机已经很多,Canon和Nikon都有。最近两三年发布的新相机几乎都支持WIFI传图和遥控功能。本文介绍用wifi p2p方法实现两台android手机遥控拍摄的方案。
有关wifi直连(p2p)的公开技术资料已经有很多,此处不再赘述有关细节,仅对方案要点作一些说明,实现细节可以参照源代码。

使用两台手机,一台作为相机,安装camera app,在wifi p2p group中,担当group owner。
另一台作为遥控器,安装controller app,在wifi p2p group中,担当group client。

在两台手机间建立wifi直连后,可以进行双向通信,为了实现遥控拍摄,需要通过wifi p2p传递以下信息:

  • 连接状态,在两台手机上显示连接成功与否。当收到对方手机信息时,在己方手机上显示连接成功符号。
  • 相机端向遥控端回传镜头取得的浏览图像,这实际上就是相机端取得的视频流,传送到遥控端用于取景。
  • 遥控端发出的拍摄指令,用来按下相机端的快门。
  • 如果需要,还可以把相机端拍摄的照片回传到遥控端,目前程序中没有实现,应该难度不大。

这些传送信息,用三种形式表示:
第一种是字符串,用于传送连接状态、拍摄指令。
connected表示已经连接
disconnected表示断开连接
capture表示拍摄
第二种是用ByteBufferTransfer类封装的图像数据,包括承载图像的字节数组byte[]、以及从相机端取得图像的各种相关信息。
第三种是文件,可以用于传送已经拍摄的照片。

程序由三部分组成:camera app、controller app和comm lib。系统架构采用mvp官方模板。

一、camera app管理控制相机的打开、关闭、拍摄、预览视频取得、编码压缩等机能,并且以group owner的身份建立wifi p2p连接group。

二、controller app以group client身份同相机端建立wifi p2p连接,取得相机端传送的字节流,解码成视频,显示在遥控端手机上。需要时,通过wifi p2p连接向相机端发出拍摄指令。

三、comm lib是一些共通的类和方法。

由于在程序中使用了一些回调和监听,代码的可读性不太好。为了便于理解,在此简单介绍最核心的部分。

ByteBufferTransfer
该类包含了图像数据的字节数组,以及视频编解码相关的信息MediaCodec.BufferInfo,每一个ByteBufferTransfer的实例,代表视频中的一帧图像。为了能够通过wifi p2p传送,ByteBufferTransfer必须实现Serializable接口。

ByteBufferTransferTask
这是专用于传送ByteBufferTransfer实例的后台异步任务。

DirectBroadcastReceiver
本系统中有关wifi p2p的核心部分是DirectBroadcastReceiver,在相机端和遥控端都要用到,这是一个广播接收器,用于处理系统产生的wifi p2p事件,有以下四种:

  • WIFI_P2P_STATE_CHANGED_ACTION
    Wifi P2P状态变更时发生,用于指示 Wifi P2P 是否可用。
  • WIFI_P2P_PEERS_CHANGED_ACTION
    Wifi P2P节点list变化时发生,此时需要用WifiP2pManager.requestPeers方法请求获取Wifi P2P节点list,请求的结果由onPeersAvailable监听器获得。
  • WIFI_P2P_CONNECTION_CHANGED_ACTION
    WIFI_P2P节点连接状态变化时发生,此时需要用intent.getParcelableExtra方法取得EXTRA_NETWORK_INFO情报,如果处于连接状态,可以进一步取得WifiP2pInfo,WifiP2pInfo包含群组是否建立、谁是群主、群主的地址等信息。
  • WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
    本机设备信息变化时发生,此时需要重新获取本机设备信息。

CameraWifiServerService、ControllerWifiServerService
在相机端和遥控端各有一个IntentService,类名是CameraWifiServerService和ControllerWifiServerService,用来处理通过wifi p2p接受到的信息,分别对字符串、图像字节数组、文件做出相应处理。

mStateCallback
这是在MainPresenter中定义的CameraDevice.StateCallback的实现,是openCamera必须的参数之一。在相机端打开照相机时,执行createCameraPreviewSession方法,在该方法中实现以下动作:

  • 建立相机预览用的Surface
  • 创建作为预览的CaptureRequest.Builder
  • 将textureView的surface作为CaptureRequest.Builder的目标
  • 根据视频编码类型创建编码器
  • 实例化MediaCodecCallback
  • 格式化编码器
  • 启动编码器
  • 创建CameraCaptureSession,该对象负责管理处理预览请求、拍照请求和传输请求。

视频流编解码使用的是H264 Vga(640x480)格式,如果改为H265格式,应该没有什么难度, android体系对于H265视频编解码已经有了成熟的支持,问题是三年前生产的手机大部分不支持H265编码。

MediaCodecCallback
这是在相机端实现的MediaCodec.Callback。当视频编码器完成一帧图像的编码时,通过onOutputBufferAvailable取得ByteBuffer数据,从中提取字节数组,注入ByteBufferTransfer的实例中,然后启动ByteBufferTransferTask,把ByteBufferTransfer的实例通过wifi p2p连接传送到对方。

DecoderCallback
这是在遥控端实现的MediaCodec.Callback。通过onInputBufferAvailable,当视频解码器的输入缓冲区空闲时,把通过wifi p2p接收到的字节数组注入解码器,启动视频解码进程。

MediaCodecCallback和DecoderCallback都是用回调实现的视频编解码器,优点是代码简洁、效率高,缺点是安卓SDK 21以前的版本不支持。

MediaCodecAction
该类用于视频解码器的准备、启动和释放。在准备时用mediaCodec.configure方法把遥控端手机的TextureView的Surface与视频解码器的输出绑定,在遥控端就可以看到相机端取得的图像。

把以上这些模块结合到android架构中,实现手机的遥控拍摄。

需要说明的是,android 8.0 Oreo以上这个程序不能正常运行,原因是android 8.0 Oreo环境下,Wifi P2P节点list的取得,必须有定位权限。在controller app中动态获取定位权限后,程序可以正常工作。请参考android O+的wifi直连(p2p)需要定位权限

camera app可以运行的安卓SDK版本是23-27。
controller app可以运行的安卓SDK版本是21-27。

源程序请参照 用wifi直连(p2p)实现遥控照相的源代码

欢迎指摘、建议、问题。

用wifi直连(p2p)实现遥控照相相关推荐

  1. Wifi直连(p2p)一对多音频传输

    系统由一台播放器(服务器)和多台接收器(客户端)构成一个wifi直连的群组,服务器是群主(GO),客户端是组员(GC).使用Wifi直连(p2p)构造一对多的系统是很方便实现的. 系统构成请参见图:w ...

  2. Android系统wifi之p2p(wifi直连)配置文件权限导致应用不能使用wifi问题

    这个平台的wifip2p也就是wifi Direct(wifi直连)其实是走的hostap功能. 一.问题描述 1.设置->网络->无线网络->,打开wifi开关. 2.在开启无线直 ...

  3. wifi直连(Android)Wifi-Direct

    wifi直连也叫做wifi设备点对点连接(peer-peer),不需要连接热点或者网络,需要打开wifi,就可以查找到附近的设备.大概可以分为以下步骤:1.设置以下权限,并且注意最小sdk=14 2. ...

  4. Android WiFi直连 双向通信

    原文地址:https://blog.csdn.net/VNanyesheshou/article/details/82316436 DEMO下载:http://www.demodashi.com/de ...

  5. android的wifi直连,WLAN 直连  |  Android 开源项目  |  Android Open Source Project

    WLAN 直连功能又称"WLAN 点对点",它允许支持设备直接使用 WLAN 直连协议发现其他设备并与之互连(无需连接到互联网或移动网络).此功能是基于 Wi-Fi 联盟 (WFA ...

  6. [转载]从Android源代码来看WiFi直连

    什么是WiFi直连 通俗点说,它可以不通过网络,也不通过蓝牙,只要两台设备都支持WiFi直连,打开WiFi,不用连接任何WiFi,就可以进行信息的传输(请忽略下面两张图中的WiFi连接标志,因为其与W ...

  7. Android WI-Fi直连实现

    P2P Demo 整个的调用流程已经用编号在代码中编写好,跟随代码即可理顺逻辑 参考至官方文档 链接: WI-FI直连 MainActivity public class MainActivity e ...

  8. 智能家居与SmartConfig技术,WI-FI直连

    -- 百度AI商业化落地的速度与能力:  1.小度智能音箱Pro:2.小度语音车载支架:3.搭载百度DuerOS的华为平板M5青春版: > 智能家居 智能家居,所有的设备都是通过Wifi连接自己 ...

  9. android wifi直连 代码,Android WiFi直连并互发图片(示例代码)

    WiFi直连可以在不通过网络或热点的情况下,直接与周围的设备进行连接并进行信息交换.WiFi直连是在Android 4.0(API level 14)或更高的版本中才加入的新功能.本文主要介绍通过Wi ...

最新文章

  1. day 33(套接字,TCP 与 UDP)
  2. php设置html全局路径_全局:语言包配置
  3. PHP7实战开发简单CMS内容管理系统(8)登录权限控制功能分离
  4. SoapRpcMethodAttribute.OneWay属性
  5. 云炬Android开发笔记 3-2字体图标库集成与封装
  6. inotify监听文件夹的变动
  7. Java探索之旅(6)——对象和类
  8. java学习(50):子类继承会优先调用父类的构造器
  9. VS加快程序编译速度——以VS2013为例
  10. 随机访问介质控制协议
  11. PowerDesigner 表格导出为excel
  12. Vue.js-----轻量高效的MVVM框架(五、计算属性)
  13. 1.Kubernetes 简介
  14. Delphi 10.3.1安装cnpack后,出现错误CnWizards_D103R.dll
  15. Jedis hget连接好久没有反应
  16. iOS逆向:tweak开发教程(iPhone/tool)
  17. 简述igp和egp_igp egp
  18. powerbi服务器打开文件慢,Power BI 优化指南
  19. Vue打包后出现的bug -favicon.ico' because it violates the following Content Security Policy direc
  20. 深度学习入门系列1:多层感知器概述

热门文章

  1. 亚马逊echo中国使用_如何在没有Amazon Echo的情况下使用Alexa
  2. SpringBoot DeferredResult 长轮询实现实现方式?
  3. 小猿圈分享-web报表中电子印章/水印的轻松实现
  4. linux服务器上的matplotlib中文字体设置问题(使用ttf文件)
  5. 最近两篇Nature子刊的经验与教训
  6. 浏览器缓存机制(强制缓存,协商缓存)
  7. 基于AD7606八通道高速数据采集模块
  8. javascript存储_如何使用JavaScript存储Adobe AIR应用程序首选项
  9. 阿拉伯数字转中文数字 数字转换
  10. MapReduce通俗理解