手机投屏之WFD简介

news2024/11/26 1:47:06

一、概述

1.1 简介

Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连(Wi-Fi Direct)为基础的无线显示标准。支持此标准的消费性电子产品(又称3C设备)可透过无线方式分享视频画面,例如手机可透过Miracast将影片或照片直接在电视或其他设备播放而无需任何连接线,也不需透过无线热点(AP,Access Point)。

Wi-Fi Display(WFD)经常和Miracast联系在一起, Miracast实际上是Wi-Fi联盟对支持Wi-Fi Display功能的设备的认知名称。通过Miracast认证的设备将在最大程度内保持对Wi-Fi Display功能的支持和兼容。

1.2 架构介绍

74f2c8fb09491a5d99785739a67fe6fb.png

图1.1 Miracst架构及协议栈

Miracast整体架构及协议栈从下到上为整体架构,包括:网络协议栈、流媒体传输协议栈、媒体封装协议栈、媒体加密协议栈、媒体编解码协议栈;从左至右为关键流程,主要包括WifiP2P发现及建连流程、RTSP媒体协商协议及流程、UIBC反控流程、编码打包发送等。

1.3 场景

作为目前主流投屏协议,WFD覆盖TV、PC、PAD、车机、电视盒子等用户投屏场景。按功能划分,支持WFD的设备分为WFD Source、WFD Primary Sink和WFD Second Sink。场景模型如下:

e508a94ba0fbe44de3418d6cf2ab57e7.png

图1.2 音频流

8b5069bb2efee1806528093b836d6a0d.png

图1.3 视频流

cddfac1846c2a22636f22f2f4c7e96a9.png

图1.4 音视频流

341a27ff47c52b3e4da39f98b1bfc059.png

图1.5 多路流(一路视频&一路音频)

二、规格特性

2.1 功能特性

WFD支持的功能特性如下表所示:

420766fa100e8fd705e55240c50d5186.png

7cd7f606bf23174d5167aebcbbd14440.png

注:M 代表Mandatory,O代表Optional

M特性代表WFD必须支持能力,O特性代表WFD可以选择支持的能力,在协商阶段来进行能力界定。

2.2 音频规格

WFD支持的音频编码格式如下表所示:

c9d60d9dfc84f06c81df5c8c6decfe07.png

音频能力默认支持LPCM-2,48ksps 16bit,如果对端支持多种音频格式,可以在代码中设定优先级(AAC > LPCM)来决定使用何种编码方式。

2.3 视频规格

H264 CBP为必选,支持的分辨率范围:

27种 CEA格式,分辨率从640*480到4096*2160,帧率从24到60;

32种VESA格式,分辨率从800*600到2560*1600,帧率从30到60;

12种手持设备格式,分辨率从640*360到960*540,帧率从30到60;

WFD支持的视频规格如下表所示:

988f2ed2e23911c32093b9edcbeec257.png

Sink端在回复M3指令时告诉Source端自身支持的属性及能力,Source端解析收到的信息,选择合适的分辨率、帧率等信息。发送给Source,完成视频格式的协商。

2.4 R2特性

R2是Wi-Fi Display Technical SpecificationV2.0的简称,兼容R1特性以外,增加了部分M&O的新特性,Sink端PC以及部分TV已支持R2部分特性。如下表所示:

174a9dc3740fa55b72326f190011af46.png

三、关键技术

3.1设备搜索发现

WFD设备发现AOSP JAVA层业务逻辑主要步骤如下:

67234e688f8d74f5589017f44b3fcf95.png

图3.1 WFD设备搜索发现

  • WifiDisplayAdapter通过WifiDisplayController发起

  • WifiDisplayController更新scan状态后调用WifiP2pManager的discoverPeers

  • WifiP2pManager通过WifiP2pService调用到Wifi子系统的p2pFind

  • WifiDisplayController逐层收到onSuccess回调后发起requestPeers请求

  • WifiP2pService获取到peers后通过onPeersAvaliable回调调用到WifiDisplayController

  • WifiDisplayController创建wifiDisplay并更新到mDesiredDevice

3.2 能力协商&会话建立流程

7ccf80b4582cc697406db8fed6988d91.png

图3.2 WFD能力协商&会话建立流程

如上图所示,WFD Source端启动后,创建RTSP Server,等待WFD Sink端的连接,连接成功后Source端触发M1-RTSP Options请求,启动RTSP的交互流程

⚪M1~M4是能力协商流程:WFD Source查询WFDSink端的能力和WFD Source的能力进行匹配,选择双方都支持的最优格式,设置到Source编码器和本地播放引擎中,并通知到WFDSource端;协商是否启动UIBC,是否启用链路保护HDCP。协商的主要内容如下:

  • wfd-video-formats:video-format(H264/H265), profile,level,max-hres,max-vres,latency,min-slice-size,slice-enc-params,frame-rate-control-support

  • wfd-audio-codecs:audio-format(LPCM/AAC/AC3),modes(sample-rate/bit-depth/channel), latency

  • wfd-content-protection:hdcp2-spec(HDCP2.0/HDCP2.1)

  • wfd-client-rtp-ports:rtp-port0 RTP端口号

  • wfd_coupled_sink:coupled-sink-cap,sink-address

  • wfd-standby-resume-capability:standby-resume-cap("none"/"supported")

  • wfd2-aux-stream-formats:aux-codecs

  • wfd2-transport-switch:profile, mode=play, TCP/UDP切换

⚪ M5~M7是会话建立流程:能力协商完成后,source端发起Trigger Setup,完成端口协商,建立Socket连接,开始音视频流采集编码打包发送。

⚪ M8是关闭流程:会话建立成功后,source和Sink端都可以发起TEARDOWN流程。

3.3 传屏控制

6d1025f0908afa8b523c8646909bb779.png

图3.3 WFD传屏流程

⚪ Pause/Play流程,会话建立后可以触发

⚪ 音频路由切换流程,RTSP-M10携带的内容

  • wfd-route:destination (primary/secondary),音频可在Primary WFD和Secondary WFD之间切换。

⚪ 连接设备变更流程,RTSP-M11携带的内容

  • wfd-connector-type: connector-type(0:VGA/1:S-Video/2:Composite/5:HDMI)

⚪ Standby流程

  • Source端或Sink端进入Standby时,向对方发送M12消息。发送内容携带 wfd_standby。

⚪ IDR请求流程

  • IDR流程由Sink端发起,可在花屏或卡顿后触发。Source端收到IDR请求之后,将所有的参考帧队列丢弃,重新从I帧开始发送数据。

⚪ 保活流程

  • 收到M7 PLAY请求后,开始启动保活流程,周期性检测Sink端是否在线,每隔5秒检查一次。

3.4 UIBC反控

88af94148f814c5fe7a05366deba4c3d.png

图3.4 WFD UIBC

  • UIBC协商过程由Source端发起,询问Sink端的UIBC能力,收到Sink端回复能力集后,创建UIBCServer进行监听,等待Sink端的UIBC连接,同时发送M4消息等待协商完成。

  • 当Sink端的UIBC能力变更时,如增加接入遥控器/键盘/鼠标,可通过M14-RTSP消息通知source端。

  • source端可以通过M15消息主动打开关闭UIBC。

四、代码示例

4.1 P2P扫描流程

用户点击手机投屏时进入到WiFiDisplaySetting界面,会调用到对应的onCreate和onStart方法,在onStart()方法中,首先注册ACTION_WIFI_DISPLAY_STATUS_CHANGED的receiver,这个broadcast会在WifiDisplayAdapter里面当wifi display的状态发生改变时发送,包括扫描到新的设备、开始连接、连接成功、断开等消息都会被这个receiver接收到。

f6e2eb32a415e9233368c1945d2690eb.png

MediaRouter通过updateDiscoveryRequest去更新是否需要发送Discovery request从而执行startWifiDisplayScan,该函数最终调用到WifiDisplayController中执行updatecanState进行设备扫描。

31ca212cb6fdd142135a01672bef5d4e.png

4.2 P2P连接流程

当扫描到可用的设备后,就会显示在WifiDisplaySettings这个页面上,当我们点击选择其中一个设备后,就会触发connectWifiDisplay开始P2P的建立。参考代码如下:

139fcd5edf2decb8d6e8283704ba80f2.png

connectWifiDisplayInternal通过handler发送处理消息到WifiDisplayController中requestConnect方法,该方法通过updateConnection来发起连接。参考代码如下:

b3c06bf7e80dc9b228f7662527eca0b8.png

onSuccess()并不是表示P2P已经建立成功,而只是表示这个发送命令到wpa_supplicant成功,所以在这里设置了一个连接超时30秒。当连接成功后,会发送WIFI_P2P_CONNECTION_CHANGED_ACTION的广播出来,当WifiDisplayController收到该广播后,会调用handleConnectionChanged来获取当前P2P Group相关的信息,如果获取到的P2P Group信息里面没有连接的设备(mConnectingDevice)或者需要的设备(mDesiredDevice)的信息,则表示连接出错了,直接退出。

如果当前连接信息与前面设置的mConnectingDevice一致,则表示连接P2P成功,这里首先会移除前面设置的连接timeout的callback,然后设置mConnectedDevice为当前连接的设备,并设置mConnectingDevice为空,最后调用updateConnection来更新连接状态信息。

4.3 RTSP连接建立

P2P建立成功后,会走到WIfiDisplayController中的updateConnection方法

在listen方法中会去创建一个RemoteDisplay对象,并调用startListening。参考代码如下:

5e8760852ba301f399f76b137a24cc2c.png

nativelisten通过JNI去到networksession中创建RTSP服务。参考代码如下:

94bede071b2e4227914ee51cdd094b05.png

RTSP服务创建好后,等待client端进行连接,进入媒体能力协商阶段。

4.4 视频流获取

视频流有两种方式获取:

一种方式通过mediacode createInputSurface接口创建surface给virtualdisplay,SurfaceFlinger每次合成一帧时会通知到mediacode进行编码。WFD只需要通过dequeueOutputBuffer来获取编码后的数据即可。参考代码如下:

6fb68a055d72a6c5c8250f9340de0c8b.png

另一种方式WFD创建bufferqueue 将producer传递给virtualdisplay,SurfaceFlinger每次合成一帧的时候通知WFD,WFD 通过consumer取合成后的数据进行编码。通过该方式WFD可自行控制帧率。参考代码如下:

866fae10ae106d18e29504f83b3f0655.png

4.5 音视频打包

在WFD流媒体传输中,编码后的音视频基本码流ES首先打包成PES,在PES包中加入PTS跟DTS等时间戳信息,一个大的PES包拆成一系列188个字节长度的传输包(TS Packet),在传输包中加入定时信息PCR和节目专用信息PSI,最后将TS Packet打包为一个RTP,每个RTP再打包为一个UDP。其中打包RTP的方法就是在MPEG-TS数据前面加上RTP Header,而打包UDP的方法就是在RTP数据前面加上UDP Header。参考代码如下:

bb71bc4edf99dfeaa2dfd68b6d139742.png

五、总结

本文从概念、场景、功能特性、音频规格、视频规格以及关键技术等维度对WFD进行了详细介绍。并且以实际的案例代码对关键流程进行了解读,希望可以帮助大家了解WFD模块。

WFD基础框架的构建只是第一步,帧率、延时、音画同步、卡顿率、花屏率等用户体验指标才是做好WFD关键。由于WFD 涉及Andriod框架多个模块(WMS/DMS/SurfaceFlinger/Audio/Video/WiFi等),需要对各个模块深入挖掘才能持续提升用户体验。

参考文献:

1. AOSP WFD https://android.googlesource.com/platform/frameworks/av/+/android-4.2.2_r1.2/media/libstagefright/wifi-display/source/

2. Wi-Fi Display Technical SpecificationV2.2: https://www.wi-fi.org/discover-wi-fi/miracast

3. https://www.digital-cp.com/sites/default/files/HDCP%20Interface%20Independent%20Adaptation%20Specification%20Rev2_3.pdf

4. AOSP Andriod http://aospxref.com/android-13.0.0_r3/

欢迎赐稿 2023 中国 Linux 内核开发者大会及报名线下参会

一文了解Vulkan在移动端渲染中的带宽与同步

AMD高保真超分算法1.0解密

80efa11204b5d0933f69d54d447a88cc.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章| 精选教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1090385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Semaphore使用以及原理

Semaphore使用以及原理 介绍原理使用场景使用方法Demo 介绍 Semaphore(信号量)是一种用于控制并发访问资源的机制。它可以用于多线程或多进程环境中,用于保护共享资源的访问,避免竞争条件和死锁。 原理 Semaphore维护一个计数器…

c#画五角星

c#画一个五角星,最重要的就是计算哪些坐标点出来,也是最难的一部分,这要涉及到一些数学方面的知识.对数学坐标知识不是很熟的人,如果想学画图,我建议多去看一下数学书,对我们写程序的人来说是没有什么坏处可言的. 想学习的朋友可以一起学习,我觉得分享学习是一种快乐,所以把自…

mysql主从工作原理、搭建

目录 一、mysql为什么要用主从架构? 二、mysql数据库主从复制原理是什么? 详细的主从复制过程如下图: 主从复制过程概述: 三、mysql主从如何搭建? 本次安装的数据库版本为mysql5.7 1、准备两台服务器&#xff08…

C++ 设计模式 —— 组合模式

C 设计模式 —— 组合模式 0. 引用连接 本文主要的思路和代码,来自于对以下连接的学习和实现: 组合模式 1. 引言 1.1 什么是组合模式? 组合模式的定义组合模式的作用 组合模式是一种行为型设计模式,它将对象组合成树形结构以…

解决react使用css module无法重写bootstrap样式的问题

react使用css module虽然能够解决样式污染,但是同时也失去了写css样式的灵活性,特别是:在.module.css文件中当子元素是非变量的静态class类(比如bootstrap), 此时使用css选择器对该子元素的样式不会起作用的 比如下面…

【干货】VS2017简介、编译、启动单项目和启动多项目

1. VS2017简单介绍 解决方案和项目的区别: 一般一个解决方案会有多个项目,一个项目里面一般只有一个main文件,所以需要右键单击某个项目将其设置成启动项目,才可以启动该项目。 2. 编译github的代码仓 一般都会有CMakeLists.t…

《C++ Primer》练习9.43-练习9.46:替换字符串简写和插入前后缀

文章目录 练习9.43练习9.44练习9.45练习9.46总结参考 练习9.43 练习9.43要替换字符串s中所有oldVal为newVal&#xff0c;要求使用迭代器和insert以及erase函数。 #include <iostream> #include <string> #include <vector> using namespace std;string &a…

ubuntu下yolov5 tensorrt模型部署

文章目录 ubuntu下yolov5 tensorrt模型部署一、Ubuntu18.04环境配置1.1 安装工具链和opencv1.2 安装Nvidia相关库1.2.1 安装Nvidia显卡驱动1.2.2 安装 cuda11.31.2.3 安装 cudnn8.21.2.4 下载 tensorrt8.4.2.41.2.5 下载仓库TensorRT-Alpha并设置 二、从yolov5源码中导出onnx文…

【IDEA项目个别类爆红,但是项目可以正常运行】

打开项目时发现idea个别类爆红,但是项目可以正常运行 问题原因&#xff1a;Idea本身的问题&#xff0c;可能是其缓存问题&#xff0c;导致爆红 解决方案&#xff1a;重置Idea 很多时候排查不出代码问题&#xff0c;就尝试一下此操作。 选择目录&#xff1a;File–>Invalida…

前后端分离项目-基于springboot+vue的高校学科竞赛平台的设计与实现(内含代码+文档+报告)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

node.js+NPM包管理器+Webpack打包工具+前端项目搭建

javascript运行环境&#xff08;无需依赖html文件&#xff09; BFF&#xff0c;服务于前端的后端 官网下载安装&#xff0c;node -v查看是否安装成功 ①、创建一个01.js文件 //引入http模块 const httprequire(http)//创建服务器 http.createServer(function(request,respo…

微服务+Java+Spring Cloud +UniApp +MySql智慧工地综合管理云平台源码,SaaS模式

智慧工地围绕工程现场人、机、料、法、环及施工过程中质量、安全、进度、成本等各项数据满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效. 智慧工地综合管理云平台源码&#xff0c;PC监管端、项目端&#xff1b;APP监管端、项目端、数据可视化大屏端源码&#xf…

css案例:取消组件的阴影

点击的时候会出现阴影&#xff0c;取消阴影操作&#xff1a; .el-radio__input.is-checked{.el-radio__inner{box-shadow:0 0 0 0!important;}}有的时候取消阴影的css不起作用是权限问题&#xff0c;加上!important 就好了。

Ps:选区的布尔运算

选区的布尔 Boolean运算指的是选区之间的相加&#xff08;并集&#xff09;、相减&#xff08;差集&#xff09;以及相交&#xff08;交集&#xff09;&#xff0c;从而形成一个新的选区。 ◆ ◆ ◆ 使用工具选项栏 在 Ps 中&#xff0c;几乎所有的选区工具的工具选项栏上都有…

php新手实战:自定义书源下载api

网上有很多第三方小说网站提供小说下载&#xff0c;而下载的过程无非就是搜索书籍&#xff0c;然后找到下载链接点击下载即可。只是类似这种“良心”的小说网站实在是太少。大多数仅支持在线阅读。而如今&#xff0c;我却要利用这种为数不多的“良心”小说站点提供的书源来作为…

Eureka添加@Loadbalanced 报错 No instances available for XXXXX

错误显示为 错误信息是:没有可用的实例 我就比较惊讶 我已经添加了Loadbalanced 同时将RestTemplate注册到spring容器中了 为什么还会出现没有实例.. 下面是代码 仔细检查了代码发现没什么错误之后 检查了一下 xml文件,发现里面的 应用名称与访问时参数一致.这个时候就陷…

Elasticsearch:使用 LangChain 对话链和 OpenAI 的聊天机器人

在此笔记本中&#xff0c;我们将构建一个聊天机器人&#xff0c;它可以回答有关自定义数据的问题&#xff0c;例如雇主的政策。 聊天机器人使用 LangChain 的 ConversationalRetrievalChain&#xff0c;具有以下功能&#xff1a; 用自然语言回答问题在 Elasticsearch 中运行混…

Postman持久化保存/设置断言详解

postman持久化保存 1、点击postman的Collections页签&#xff0c;点击 New Collection创建&#xff08;可以当成项 目并重命名&#xff09; 2、新增后&#xff0c;再点击Collection中的“ ... ” &#xff0c;然后点击“Add Folder”&#xff0c;新建一个文件 夹&#xff08…

是否拥有具身智能,是扫地机器人能否打破“内卷”的关键

如果你关注2023世界人工智能大会等行业峰会&#xff0c;以及英伟达、微软、谷歌、特斯拉和国內科技大厂的最新发布会&#xff0c;除了“大模型”&#xff0c;应该会听到另一个高频词——具身智能。 所谓具身智能Embodied AI &#xff0c;指的是有身体并支持物理交互的智能体。这…

【计网】傻瓜式安装cpolar内网穿透

目录 一、注册账户 二、下载安装包 三、安装 四、查看AuthToken 五、简单使用 如果在本机部署项目外网是访问不到的&#xff0c;通过内网穿透就可以使本机部署的项目可被外网访问 一、注册账户 cpolar - secure introspectable tunnels to localhostcpolar secure intro…