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

news2025/1/10 16:12:20

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: Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX 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:94
          inet6 addr: fe80::1413:15ff:fe9b:8a94/64 Scope: Link
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX 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 icnss
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX 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: Link
          UP RUNNING  MTU:2000  Metric:1
          RX 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:1
          RX 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 icnss
          inet addr:192.168.49.1  Bcast:192.168.49.255  Mask:255.255.255.0 
          inet6 addr: fe80::5ce4:4fff:febe:f3d4/64 Scope: Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX 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

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

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

相关文章

Linux和C语言(Day09)

一、学习内容 指针 指针的概念 什么是内存 内存是计算必不可少的硬件设备,一般说到内存常会说TA多大——M、G、T 内存单位:bit【位,最小单位】 Byte【字节,基本单位】 KB MB GB TB CPU如何从内存取数据 通过内存地址去取 将内存…

全球主流单片机制造商

欧美地区 1、FreescaleNXP(飞思卡尔恩智浦):荷兰,主要提供16位、32位MCU。应用范围:汽车电子、LED和普通照明、医疗保健、多媒体融合、家电和电动工具、楼宇自动化技术电机控制、电源和功率转换器、能源和智能电网、自…

数据资产入表(二)|数据要素资产化与数据资产入表路线框架,一文说清“入表”实现步骤

前言 小兵的数据资产入表系列文章第一篇为大家介绍了国内外关于“数据要素市场化”的探索现状以及推进“数据资产入表”的相关政策。想必大家读完第一篇后,已经认识到数据要素市场化是大势所趋,但是数据的特殊性使得其市场化之路比其他生产要素要更加复杂…

Vue3+Django5+REST Framework开发电脑管理系统

前端:Vue3TypeScript 后端:Django5REST Framework 功能介绍 用户管理角色管理菜单管理配件管理仓库管理类型管理电脑管理入库管理出库管理库存管理收发明细管理 界面预览 源码地址:managesystem: 电脑管理系统

亚信安全出席第五届国际反病毒大会 探究AI现代网络勒索治理

近日,第二届网络空间安全(天津)论坛正式开幕。本届论坛由天津市政府主办,国家计算机病毒应急处理中心、天津市公安局、天津市滨海新区政府承办,国家网络与信息安全信息通报中心协办,围绕“共建网络安全 共治…

MySQL表操作及约束

修改表 重命名: mysql> alter table user1 rename to user; 新增一列 mysql> alter table user add image_path varchar(128) comment 路径 after birthday; mysql> alter table user add image_path varchar(128) comment 路径 after birthday; Query…

火山引擎VeDI核心产品DataTester再进化,A/B大模型应用评测功能上线

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 近日,火山引擎A/B测试产品DataTester上线了A/B大模型应用评测功能。此次升级不仅强化了模型上线前的基础能力评测,还新增了针对线上使用场景…

基本数据结构:“树”的简单介绍

树是一种重要的非线性数据结构,它模拟了树这种自然结构,由结点(Node)和边(Edge)组成,常用于表示分层关系(如文件系统、组织结构等)。以下是树的一些基本概念和特性&#…

对浏览器事件循环机制的理解

目录 事件循环宏观理解事件循环异步任务细分宏任务与微任务后的理解结合流程图与代码理解览器事件循环 首先来介绍一些谷歌浏览器的进程与线程。 谷歌浏览器包含五个进程:浏览器主进程、渲染进程、GPU进程、网络进程、插件进程。 其中最重要的渲染进程包含五个线程…

java多线程笔记2

一.线程和进程的区别 为什么要进行并发编程:CPU多核心 通过多进程可以实现并发编程,但是进程太重量了,因此引入了多线程. 线程是轻量级的进程,创建和销毁的开销更小,进程是包含线程的,同一进程的若干线程公用同一份系统资源(内存,硬盘等). 二.Thread类重要的属性 三.线程等…

Chainlit集成LlamaIndex并使用通义千问模型实现AI知识库检索网页对话应用

前言 之前使用Chainlit集成Langchain并使用通义千问大语言模型的API接口,实现一个基于文档文档的网页对话应用。 可以点击我的上一篇文章《Chainlit集成Langchain并使用通义千问和智谱AI实现AI知识库检索网页对话应用》 查看。 本次将Langchain框架更改为LlamaInde…

初识php库管理工具composer的体验【爽】使用phpword模板功能替换里面的字符串文本

需求: 做了一个租赁的项目,里面要求签署个人授权协议,里面要填写姓名,手机号,身份证号,签署日期等参数,格式如下图 格式: 如上图,word中的字符串模板变量使用${varname…

Linux的历史,版本,Linux的环境安装、简单学习4个基本的Linux指令、创建普通用户等的介绍

文章目录 前言一、Linux的历史二、版本三、Linux的环境安装1. 腾讯云服务器的申请2. xshell的安装与使用 四、 简单学习4个基本的Linux指令1. ls2. pwd3. mkdir4. cd 五、创建普通用户总结 前言 Linux的历史,版本,Linux的环境安装、简单学习4个基本的Li…

公司电脑屏幕监控软件大战摸鱼怪!五个好用的实时屏幕监控软件,第一款Get了吗?

在繁忙的办公室里,总有一些“摸鱼怪”在不经意间悄然出现,他们或许在浏览无关网页,或许在偷偷聊天,甚至可能在上班时间玩起了游戏。 一、企业面临的问题详情 小李是公司的一名程序员,每天的工作任务繁重且紧急。 然而…

seafaring靶场漏洞测试攻略

打开网页 一.sql注入漏洞 1.输入框测试回显点 -1 union select 1,2,3# 2.查看数据库名 -1 union select 1,2,database()# 3.查看表名 -1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schematest# 4.查看admin表中列名 -1 unio…

千兆工业交换机最重要的是什么?

在现代工业环境中,千兆交换机扮演着至关重要的角色,支持着企业的信息流动和数据传输。然而,当我们探讨千兆工业交换机的各个方面时,最为重要的则是其稳定性和可靠性。首先,千兆工业交换机通常被应用在苛刻的工作环境中…

[网络]http/https的简单认识

文章目录 一. 什么是http二. http协议工作过程三. http协议格式1. 抓包工具fiddler2. http请求报文3. http响应报文 一. 什么是http HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的 应⽤层协议 HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议 HTTP 往…

docker 多服务只暴露一个客户端

业务场景 docker部署多个服务时候,当为了安全考虑 部署了多个服务,数据库,缓存库,文件服务器啥的,如果全都暴露的话可能会增加资源侵入的风险,所以只需要挂载一个客户端端口给外部访问即可,其他服务均在内网,保障资源安全 docker 网络 可以把容器们都放在同一网络下,由于docke…

Redis——常用数据类型List

目录 List列表常用命令lpushlpushxrpushrpushlrangelpoprpoplindexlinsertllenlremltrim key start stoplset 阻塞版本命令blpopbrpop list的编码方式list的应用 List列表 Redis中的list相当于数组,或者 顺序表,一些常用的操作可以通过下面这张图来理解…

JAVA中线程池的详解

1.概念 顾名思义,线程池就是管理一系列线程的资源池,其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息,例如已完成任务的数量。 这里借用《Java 并发编程的艺术》书中的部分内容来总结一下使用线程池的好处&#x…