当前位置: 首页 > news >正文

Miracast/WifiDisplay开发相关的深入调研分析-android投屏实战开发

Miracast/WifiDisplay概念介绍

在这里插入图片描述

Miracast

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

Wi-Fi Direct

Wi-Fi直连(英语:Wi-Fi Direct),之前曾被称为Wi-Fi点对点(Wi-Fi Peer-to-Peer),是一套无线网络互连协议,让wifi设备可以不必透过无线网络接入点(Access Point),以点对点的方式,直接与另一个wifi设备连线,进行高速数据传输。这个协议由Wi-Fi联盟发展、支持与授与认证,通过认证的产品将可获得Wi-Fi CERTIFIED Wi-Fi Direct®标志。

Wi-Fi Display

Wi-Fi Display是Wi-Fi联盟制定的一个标准协议,它结合了Wi-Fi标准和H.264视频编码技术。利用这种技术,消费者可以从一个移动设备将音视频内容实时镜像到大型屏幕,随时、随地、在各种设备之间可靠地传输和观看内容。

Miracast实际上就是Wi-Fi联盟对支持WiFi Display功能的设备的认证名称,产品通过认证后会打上Miracast标签。

使用场景图
在这里插入图片描述
最经典场景那就是:
手机投屏到电视或者显示器端,即可以把小屏幕设备画面声音投屏到 大屏端,上图还有提到一个Source和Sink概念。

Sink & Source
如下图所示
在这里插入图片描述

Miracast可分为发送端与接收端。Source端为Miracast音视频数据发送端,负责音视频数据的采集、编码及发送。而Sink端为Miracast业务的接收端,负责接收Source端的音视频码流并解码显示,其中通过Wi-Fi Direct技术进行连接。

WiFiDisplay实现核心技术图

如果实现一个最简单的WiFiDisplay核心部分会涉及如下部分:
在这里插入图片描述其实WiFiDisplay和投屏本质没啥差别,主要就是把音视频数据传递给对方,对方接收后解码显示,但是WifiDisplay不是一直简单的私有协议,而是一种认证公共协议,即sink端和source端可能不是自己公司产品设备,但是也可以实现投屏。

1、设备链接部分–使用WIFI P2P,即可以不需要依赖热点

2、视频部分–使用一个类似虚拟屏幕WiFiDisplay,对这个屏幕画面进行编码成h264数据

3、声音部分–使用内录接口REMOTE_SUBMIX,录制系统自带发出声音,可以编码aac也可以直接pcm

4、传输协议-使用标准rtsp协议进行传输,音视频数据包装到rtp中发送

视频验证部分

dumpsys display后可以看到对应的display
在这里插入图片描述
同时从perfetto上vsync进行present时候也可以看到两个display
在这里插入图片描述

声音部分验证

采用 dumpsys media.audio_flinger命令,查看输出的音频情况

系统播放的声音都被输入到了AUDIO_DEVICE_OUT_REMOTE_SUBMIX设备
在这里插入图片描述负责录制系统声音的输入设备就是AUDIO_DEVICE_IN_REMOTE_SUBMIX
在这里插入图片描述

协议部分验证

抓包wireshark工具安装

ubuntu环境wireshark安装

则使用如下命令安装

sudo apt update
sudo apt install wireshark

安装后运行wireshark:

sudo wireshark

注意这里要使用sudo,不使用则很多网卡设备和lo都看不到
在这里插入图片描述但是因为WiFiDisplay开发调研的话,我们主要对手机设备,所以不是在ubuntu电脑上进行的抓包,而是需要到手机上抓包后,使用ubuntu的wireshark打开分析而已。

手机抓包方式

首先需要root权限。
以下是基本的操作步骤:

    安装tcpdump工具:可以从网上下载对应Android设备架构(如armeabi, arm64-v8a, x86等)的tcpdump二进制文件。将其放置在设备的/system/xbin/或者其他已经在PATH环境变量中的目录下。获取root权限:使用已经root过的设备或者使用adb root命令来获取root权限。使用tcpdump命令抓包:通过adb shell进入设备的shell环境。adb shell ifconfig
lo        Link encap:Local Loopback  inet addr:127.0.0.1  Mask:255.0.0.0 inet6 addr: ::1/128 Scope: HostUP LOOPBACK RUNNING  MTU:65536  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 TX bytes:0 dummy0    Link encap:Ethernet  HWaddr 16:13:15:9b:8a:94inet6 addr: fe80::1413:15ff:fe9b:8a94/64 Scope: LinkUP BROADCAST RUNNING NOARP  MTU:1500  Metric:1RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:157 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 TX bytes:10990 wlan0     Link encap:Ethernet  HWaddr f6:ed:b6:e6:93:26  Driver icnssUP BROADCAST MULTICAST  MTU:1500  Metric:1RX packets:380411 errors:0 dropped:6 overruns:0 frame:0 TX packets:651256 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:19939920 TX bytes:687241648 rmnet_data0 Link encap:UNSPEC  inet6 addr: fe80::e09a:e739:4a14:c7f0/64 Scope: LinkUP RUNNING  MTU:2000  Metric:1RX packets:384 errors:0 dropped:0 overruns:0 frame:0 TX packets:367 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:43754 TX bytes:30654 rmnet_ipa0 Link encap:UNSPEC  UP RUNNING  MTU:2000  Metric:1RX packets:363 errors:0 dropped:0 overruns:0 frame:0 TX packets:367 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:48362 TX bytes:30654 p2p0      Link encap:Ethernet  HWaddr 5e:e4:4f:be:f3:d4  Driver icnssinet addr:192.168.49.1  Bcast:192.168.49.255  Mask:255.255.255.0 inet6 addr: fe80::5ce4:4fff:febe:f3d4/64 Scope: LinkUP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:142 errors:0 dropped:0 overruns:0 frame:0 TX packets:64114 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:41602 TX bytes:73275825 选着合适网卡
adb shell tcpdump -i p2p0 -w /sdcard/capture.pcap

请注意,抓包可能会影响设备的正常网络性能,谨慎使用。此外,不同版本的Android和设备硬件可能需要不同的tcpdump版本和参数。

抓包分析WiFiDisplay数据传输rtsp协议

可以看到整个WiFiDisplay的数据传递流程如下:

1、rtsp进行会话描述协议
2、rtp传输megp-ts流,megp-ts流包裹了相关音视频数据
在这里插入图片描述

更多framework详细代码和资料参考如下链接
投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg
hal+perfetto+surfaceflinger

https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PMP--一模--解题--111-120
  • 数据结构-链表
  • 【Java集合】ArrayList
  • Java HashMap 总结
  • LeetCode-160.相交链表
  • C#学习笔记(三)Visual Studio安装与使用
  • 第十一章 【后端】商品分类管理微服务(11.1)——创建父工程
  • linux 操作系统下dd 命令介绍和使用案例
  • 【有啥问啥】对比学习(Contrastive Learning,CL)的原理与前沿应用详解
  • 【目标检测数据集】锯子数据集1107张VOC+YOLO格式
  • 【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出
  • MATLAB入门教程
  • (k8s)Kubernetes 从0到1容器编排之旅
  • linux网络编程——UDP编程
  • 【深度学习】神经网络-怎么分清DNN、CNN、RNN?
  • crontab执行失败的多种原因
  • k8s 面向应用开发者的基础命令
  • React-生命周期杂记
  • SegmentFault 2015 Top Rank
  • 关于extract.autodesk.io的一些说明
  • 关于使用markdown的方法(引自CSDN教程)
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # Maven错误Error executing Maven
  • # Redis 入门到精通(七)-- redis 删除策略
  • #ifdef 的技巧用法
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)STL算法之遍历容器
  • (3)nginx 配置(nginx.conf)
  • (30)数组元素和与数字和的绝对差
  • (4)(4.6) Triducer
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (三分钟)速览传统边缘检测算子
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一) storm的集群安装与配置
  • (转)c++ std::pair 与 std::make
  • (转)fock函数详解
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net MySql
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 表达式计算:Expression Evaluator
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET性能优化(文摘)