Miracast投屏反控原理
Miracast投屏反控
一、 Miracast介绍
Miracast是对支持Wi-Fi Display功能设备的认证名称,也就是通过Miracast认证的设备应该都支持Wi-Fi Display功能。
二、 缩略词以及定义
- Source 端:支持通过WiFi链路将多媒体内容流式输入到接收端的设备,即发送端。
- Sink 端:从source端通过WiFi链路接收多媒体内容并进行渲染的设备,即接收端。
- WFD : Wi-Fi Display
- UIBC: User Input Back Channel 用户输入反向通道,将用户输入的操作传输到Sink端和- Source端。
- HIDC:Human Interface Device Class
- HID: Human Interface Device
三、 Miracast会话过程
- Device discovery
发现设备,通过WiFi P2P查找附近支持WiFi P2P的设备。前提是两个设备都支持P2P功能,现在大部分手机能连WiFi都支持P2P,在ScreenBox项目中,Source端即笔记本电脑,Sink端为ScreenBox盒子,将笔记本投屏到ScreenBox上,Sink端不断向外广播,Source端不断扫描,扫描就是发现设备的过程。 - Service discovery
服务发现。在两个设备连接之前发现彼此的服务功能。 - Device selection
设备A发现设备B,用户选择是否与设备B进行配对。 - Connection setup
Source端和Sink端建立P2P连接,此时建立连接之后,两个设备会协商出谁来当Group Owner(Group Owner中的DHCP服务进程分配IP),至于如何协商,比较两者的Intent参数,在ScreenBox项目中,手动把盒子的Intent值设为最高,盒子即成为Group Owner。此时盒子会为投屏设备分配一个IP,现在还缺一个端口,端口是默认的7236。TCP连接建立,该端口也用于下一步RTSP会话的管理和控制。 - Capability negotiation
能力协商阶段。在成功建立了WFD连接以及TCP连接后,开始WFD协商阶段,该阶段主要是Source端和Sink端两者交互它们支持的一些rtsp编码格式以及后续用到的参数等等。具体看下图M1、M2、M3、M4四个阶段。
图 基于RTSP的Capability Negotiation
- M1 消息:Source端发送一条RTSP Options请求给Sink端, Sink端响应给Source端,确定了Sink端支持的一些RTSP methods。
- M2 消息:与M1消息类似,Sink端发送一条RTSP Options请求给Source端,Source端响应给Sink端,确定了Source端支持的一些RTSP methods。
- M3 消息:双方交换信息完成后,Source端发送RTST GET_PARAMETER 请求给Sink端,指明了后续交互中需要的一系列参数,Sink端做出响应。
- M4 消息: Source端确定了需要的参数,并通过RTST SET_PARAMETER 请求发送给Sink端
该过程中,Source端询问Sink端是否支持反控,若它回复支持反控,则Source端会发送自己的端口号50000过去,此时一个用于发送鼠标消息的TCP连接也将被建立,具体的鼠标消息如何发送请看第8条User Input Back Channel Setup。
- Content protection setup
内容保护设置。在音视频传输过程中,对于需要保护的内容,Source端应该建立HDCP,起到一个数据加密的作用。 - Session establishment and streaming
会话建立。在完成第四步rtsp的能力协商之后,建立WFD会话,并且将Source端的音视频发送到Sink端,在两者完成RTSP M7的请求和响应之后,会话才是真正的建立。Source端的视音频数据将由(H264,AAC)编码,复用成MPEG2TS流后通过RTP协议由UDP传给Sink端,Sink端将解码收到的数据,并最终显示出来。(打包成ts包,封装给RTP,由UDP发送给sink端)具体会话的建立过程见下图。
图 会话建立时间线
- M5 消息:Source端发送一条RTSP 触发器设置的请求,Sink端作出响应。
- M6 消息:成功交换M5消息之后,Sink端向Source端发送RTSP SETUP请求,Source端作出响应,此时如果状态代码为RTSP OK,那么说明会话建立成功了。
- M7 消息:Sink端向Source端发送RTSP PLAY请求,此时Sink端已经准备好接收RTP流
- M8 消息:消息中包含一个RTSP TEARDOWN请求,用于Source端终止RTSP程序,停止音/视频流,终止相应的RTP。
- M9 消息:Sink端向Source端发送RTSP PAUSE请求
- 还有其他一系列消息都是用于两者间音视频的传输,这里不在赘述,详细请看《Wi-Fi Display Specification_v1.1》。
- User input back channel setup
用户输入通道。UIBC用于将用户的操作传输到Sink端和Source端,通过TCP传输,这里用户输入类别有两种:generic和HIDC。
1)Generic:硬件无关型,如鼠标点击、按键点击、touch点击、放大缩小等。
2)HIDC人机接口设备控制:包括红外线、USB、蓝牙、WIFI、游戏杆、遥控器等,用于由HID生成的用户输入。
这里笔记本支持的大多数都是HIDC类型,因此通过TCP传输过去的数据需要用到HID报告描述符。HID报告描述符描述其是什么设备,以及后续控制数据的解析格式。例如Sink端发送过去的a1,a2,a3,a4,但是Source端并不认识这些数据,HID描述符告知其a1,a2表示X坐标,a3,a4表示Y坐标。 - Payload control
负载控制。在数据流建立之后,需要有控制管道负载的能力,包含以下功能: 1)时间同步 如果有2个sink设备,二者音视频必须同步,实现保真。2)编码速率控制:因信道条件和电源管理优化控制管道负载。 - Display session teardown
会话终止。
记录学习过程,仅供参考,有错误希望多多指正,感谢ldl同学的大力支持
Miracast投屏反控原理相关推荐
- Miracast投屏反控
Miracast介绍 Miracast是对支持Wi-Fi Display功能设备的认证名称,也就是通过Miracast认证的设备应该都支持Wi-Fi Display功能. 缩略词以及定义 Source ...
- 安卓开发投屏反控实现方式
在安卓开发中,可以通过MediaProjection API来实现屏幕投屏的功能,同时也可以通过Socket通信实现反控功能.下面将详细介绍实现步骤和注意事项. 1. 创建MediaProjectio ...
- [转] Android Miracast投屏入门
原文:https://www.codetd.com/article/12138544 哇,打开新世界了. SOS--遇到问题查看资料,中英文该看的都不落下. 官配1. AOSP源码: Miracast ...
- 镜像miracast投屏软件_什么是Miracast投屏,Miracast是怎么投屏的?
原标题:什么是Miracast投屏,Miracast是怎么投屏的? 什么是Miracast投屏,Miracast是怎么投屏的? 我经常说手机.电脑.电视利用Miracast投屏,那么有人了解Mirac ...
- android miracast投屏,MIRACAST投屏功能
MIRACAST投屏功能 MIRACAST投屏功能是无线HDMI高清传输,将智能手机(操作系统是安卓4.2及以上)里的全部操作界面.游戏状态.视频状态等在智能电视的屏幕上显示,就是我们期待的无线投屏功 ...
- Android Miracast投屏入门
哇,打开新世界了. SOS--遇到问题查看资料,中英文该看的都不落下. 官配1. AOSP源码: Miracast Sink端源码最早出现在Android 4.2.2上,通过googlesource可 ...
- Android Miracast 投屏
从事Connectivity模块几年时间了,Team负责集成包括WiFi/Bluetooth(A2DP Source/Sink,HID[key/Audio],OPP,SPP)投屏类[Miracast, ...
- miracast投屏软件下载_手机画面如何投屏到电视?
投屏方法详解,拆解步骤,视频演示,讲到你会用为止! 安卓手机Miracast镜像 安卓手机Miracast镜像可谓刚需,这种镜像方式的一大优点就是手机端不用再另装其他软件,电视端有"爱投屏& ...
- 海信电视power android,海信智能电视投屏之安卓手机miracast投屏教程
最近把手机游戏投屏到几十寸的大屏电视上玩,似乎成了一个趋势,像王者荣耀.吃鸡等游戏,在电视大屏幕上玩,确实比在手机上玩要得劲!于是,我就试着给家里的海信智能电视投屏,我用的是安卓手机,型号是华为荣耀系 ...
最新文章
- vue 结合 echarts
- 若所有的参数皆需要类型转换——请为此采用non-member函数
- 原型设计真的对用户体验那么重要吗?
- 不用数组 java输出杨辉三角_不用数组实现杨辉三角(巴斯卡三角形)
- CentOS 7 防火墙开启了哪些服务和端口?
- ACwing 245. 你能回答这些问题吗(线段树区间子段最大值+单点修改)
- C++描述杭电OJ 2023.求平均成绩 ||
- swift怎么调用Java,Swift完成UIAlertController的调用
- 全局安装gulp 报错问题解决
- 公众服务常用电话号码大全
- Baxter实战 (一)ubuntu14.04安装ROS-Indigo
- 学习笔记:unity自带寻路(导航)系统:Nav Mesh导航网格
- 快讯分类_如何掌握Google快讯
- VMware ESXi-虚拟化平台的搭建
- 简单的下拉导航条代码
- 【Tensorflow】报错:FailedPreconditionError: Attempting to use uninitialized value keep_prob_7
- 我想起个公司名字,招投标行业的,快速搜索标讯的,科技公司,蓝色logo的
- js实现图片裁剪功能
- 学好计算机的用途,学电脑的用途是什么
- 调用麦克风列阵进行录音