Android手机投屏方案实现方式对比

文章目录

  • 1.概述
  • 2.术语解释
    • 2.1 miracast
    • 2.2 scrcpy
    • 2.4 Wifi Direct
    • 2.5 app_process
  • 3.技术实现对比
    • 3.1 Miracast
      • 3.1.1 Miracast介绍
      • 3.1.2 Miracast原理
      • 3.1.3 Miracast优缺点分析
    • 3.2 Scrcpy
      • 3.2.1 scrcpy 介绍
      • 3.2.2 scrcpy的实现原理
      • 3.2.3 scrcpy的优缺点分析
    • 3.3 Google cast
      • 3.3.1 Google cast 介绍
      • 3.3.2 Google cast 的实现原理
      • 3.3.3 优缺点分析
  • 总结

1.概述

手机投屏是目前市场上常见的一个功能,在车机娱乐场景,辅助驾驶场景比如苹果的carplay,VR 场景都很常见,目前市场上的投屏分为三类:
第一类: 镜像模式,直接把手机上整个界面原封不动进行投射。这类投屏通常是对手机进行录屏,然后编码成视频流数据的方式给到接受端,接收端再解码播放,以此完成投屏功能。比如AirPlay的镜像模式、MiraCast、乐播投屏等;
第二类: 推送模式,播视频的场景比较常见。即A把一个视频链接传给B,B自己进行播放,后学A可以传输一些简单控制指令。比如DLNA协议等;
第三类: 基于特殊协议投射部分应用或部分功能,车载领域居多。比如苹果的CarPlay、华为HiCar、百度CarLife等。

这里还有一种投屏方式比较新颖,将手机上的画面投到车机上,然后手机上可以操作自己的功能,车机上也可以操作手机的功能,而且两者互不干涉,具体可以参考蔚来手机和车机的投屏:蔚来手机的投屏视频 今天的主要内容是介绍实现投屏的各种技术方式,主要介绍Miracast、scrcpy、以及Google cast的实现方式以及优缺点局限性。

2.术语解释

2.1 miracast

Miracast是一种以WiFi直连为基础的无线显示标准,它允许用户通过无线方式分享视频画面。这种技术支持用户将智能手机、平板电脑、笔记本电脑等设备上的内容投射到大屏幕电视或其他显示设备上,而无需使用线缆连接。

2.2 scrcpy

Scrcpy是一种开源的命令行工具,允许用户通过USB数据线或Android ADB(Android调试桥)来控制他们的Android设备,包括手机和平板电脑。使用Scrcpy,用户可以在电脑上实时查看和控制他们的Android设备,就像使用一个远程屏幕一样。
2.3 DLNA投屏
DLNA投屏是一种通过网络将多媒体内容从一台设备传输到另一台设备的技术。它允许用户将智能手机、平板电脑或电脑上的视频、音频和图片等内容投射到支持DLNA的电视、音响系统或其他显示设备上。DLNA投屏基于设备之间的WiFi连接,无需额外的物理连接或设置,使用户能够轻松地将手机上的媒体内容投屏到大屏幕上并实现双向控制。

2.4 Wifi Direct

WiFi Direct是一种允许设备通过WiFi直接相互连接的技术,无需通过路由器或中继点。这种技术使得设备之间的连接更加直接和便捷,常用于文件共享、打印服务和Miracast投屏等场景。

2.5 app_process

是Android原生的一个可执行程序,位于/system/bin目录下,zygote进程便是由这个执行文件启动的。

3.技术实现对比

3.1 Miracast

3.1.1 Miracast介绍

Miracast是一种无线技术,用于将屏幕无线连接到我们的计算机。它是由WiFi联盟制定,以WiFi-Direct、IEEE802.11为无线传输标准,允许手机向电视或其他接收设备进行无线投送视频、图片。和Miracast类似的投屏协议,还有Airplay、DLNA、chromecast等,Miracast是点对点网络,用于类似蓝牙的方式(比蓝牙更高效)无线发送由Wi-Fi Direct连接组成的截屏视频。大多数最新一代的设备(例如笔记本电脑、智能电视和智能手机)都可以支持该技术,Miracast还支持高达1080p(全高清)的分辨率和5.1环绕声。它还支持4k分辨率。通过无线连接,视频数据以H.264格式发送,这是当今最常见的高清视频编码标准。Miracast在诞生之初就以跨平台标准而设计,这意味着它能在多种平台间使用。

3.1.2 Miracast原理

Miracast基于WiFi P2P,或TDLS,或Infrastructure进行设备发现,位于OSI模型的数据链路层。而媒体传输控制使用RTSP协议,还有远程I2C数据读写、UIBC用户输入反向信道、HDCP高带宽内容保护等,位于OSI模型的TCP/IP传输控制层与网络层。其中,由音视频数据封装成PES包,经过HDCP内容保护,再封装成TS包,接着封装成RTP包,使用RTSP协议发送。如下图所示
在这里插入图片描述

3.1.3 Miracast优缺点分析

优点:投屏画质清晰,兼容性好。Android手机集成了Mircast投屏,如果想要二次开发可以从AOSP源码中找到对应的实现,网上的开发文档多
缺点: Miracast正常工作时,Wi-Fi工作在P2P模式,源端与接收端建立一对一的联接。也即当一个设备与一个接收端建立连接后,其它设备不可见该接收端,也就不能投屏。只有当该设备退出连接后,其它设备才能投屏。所以无法实现抢占功能。Miracast底层封装了UDP传输协议,没有严谨的问答机制。所以在实际使用过程中,当遇到干扰时,容易造成丢帧花屏现象。而传输过程中,一旦出现花屏,给客人的感觉就非常糟糕,现在市面上,哪些无线投屏设备之所以经常出现花屏、马赛克就是这个原因。另外,Miracast是操作系统供应商提供,一般都是在安卓系统上使用,但是安卓协议导致手机投屏没有声音,所以大多数用户在安卓手机无线投屏的时候,需要开启蓝牙,以便于把声音投屏过去。如果我们需要使用Mircast,需要对ROM进行二次开发。下面是一个投屏技术公司的关于Miracast的技术文档,描述了目前Mircast存在的问题。Mircast目前存在的问题 若要实现双向控制,需要加一个控制的通道和事件转换和注入

3.2 Scrcpy

3.2.1 scrcpy 介绍

scrcpy通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),使用adb的无线连接后投屏,而且不需要任何root权限,不需要在手机里安装任何程序。scrcpy同时适用于GNU / Linux,Windows和macOS。Scrcpy 显示的每帧画面的大小达到1920x1080或者更高,帧率在30~60fps,延迟很低(大约35~70ms),启动快,第一帧画面显示出来的时间大约为1秒,并且不需要安装任何apk。并且代码完全开源,源码地址:https://github.com/Genymobile/scrcpy.git

3.2.2 scrcpy的实现原理

Scrcpy的基本原理是通过ADB(Android Debug Bridge)将电脑和手机连接到一起后,推送一个jar文件到手机/data/local/tmp的目录下,然后通过adb shell 执行app_process 程序将jar文件运行起来,这个jar文件相当于是手机上运行的一个服务器,它的作用是处理来自电脑端的的数据请求。它的免root原理主要基于两个关键点:

  1. 利用AIDL (Android Interface Definition Language):Scrcpy通过ADB(Android Debug Bridge)连接手机,AIDL允许非系统应用(如scrcpy)与系统服务交互。尽管root可以访问更多的底层功能,但是像显示屏幕这样的操作通常是安全的,并且无需获得root权限。
  2. 屏幕录制协议:Scrcpy设计了一个简单的UDP(User Datagram Protocol)服务器,在手机上运行,这个服务器只处理来自客户端(如电脑上的scrcpy软件)的数据请求,而不是系统级别的控制命令。这种方式避免了直接修改系统的文件系统或设置。
    简单总结scrcpy的原理就是电脑端和手机端建立连接后通过3个socke通道分别传输音频,录频,控制信号去实现手机和电脑的数据共享,录屏和音频都可以通过aidl和系统的服务交互拿到对应的显示屏ID然后创建虚拟屏录制,然后再编码给到客户端(电脑端)解码显示。控制指令通过socket传输到手机端后,通过手机端的服务(shell 通过app_process启动的那个程序) 反射调用Android的事件注入接口实现的。下面是scrcpy的源码中关于事件注入的部分。
    在这里插入图片描述

3.2.3 scrcpy的优缺点分析

优点:Scrcpy的优点是显示的画质好,延迟低(大约3570ms),帧率3060fps,非常流畅,而且代码完全开源并有很详细的文档,并且不需要安装任何apk和root权限。能自定义控制的行为,比如显示音频和视频,只播放音频,只显示视频,只投屏(不接受电脑端的控制,类似于投屏中的镜像)
缺点:需要用户打开开发者模式中的USB调试模式,否则很多的操作都无法进行了。这点会导致产品无法用于正式的生产环境中,因为用户一般都不会打开开发者选项中的USB调试模式。如果通过修改源码的方式,则无法实现事件注入的功能,因为事件注入需要依赖adb shell。

3.3 Google cast

3.3.1 Google cast 介绍

Google Cast类似于DLNA,AirPlayer,Miracast,就是一种投屏技术。Google Cast的作用在于把小屏幕(诸如手机、平板、笔记本)的内容通过无线(WIFI)方式发送到大屏设备(google TV、chromeCast)进行播放。Google Cast所做的便在于基于不同的平台提供提供为应用开支这种功能的SDK,这些平台即有发送端的也有接收端的,发送端的有IOS、android、chrome浏览器,接收端的有google TV, chromeCast等,可以说这一套解决方案是比较大而全的(就其涵盖的平台)。

3.3.2 Google cast 的实现原理

发送端 app(sender app)使用 SDK,将需要播放的媒体的信息发送到 Google 的服务器,服务器再通知接收端播放(所以发送端和接收端必须都可以访问 Google 的服务器才行)。接收端运行的是一个浏览器,它会根据发送端的app ID和媒体信息,去载入对应的一个网页,这个网页(receiver app)也是由发送端 app 的开发者提供的,的将会负责播放相应的媒体内容。即使接收端是 Chromecast Audio 之类只能播放音频的硬件,这个网页也是会载入并渲染的。Google Cast 和 DLNA 或者苹果的 AirPlay 不同之处,一是依赖 Google 的服务器,也就是说必须连接到 Internet 才可以用,如果只有一个局域网是不行的。二是前两个的接收端播放器接收端本身提供的,开发者只需要提供要播放的内容就可以,但是 Google Cast 则是需要提供自己的receiver app,这样的好处是开发者可以高度定制(比如可以定制UI,或者加入弹幕、歌词滚动、音乐可视化之类复杂功能),虽然接收端往往运行的并不是Android这样的开放操作系统,但是因为receiver app的本质是网页,所以开发难度并不高。

3.3.3 优缺点分析

优点:就是高度可定制,有官方成熟的SDK可接入,从宣传视频中看到手机可以投屏到大屏后,然后就可以随意操作其他应用而不会影响到大屏的显示内容了。
缺点:平台依赖性强,必须可以访问Google服务器,而由于国情的原因,必须可访问Google服务器这个缺点就可以宣告这个方案不合适了

总结

本文主要介绍了各种Android手机投屏的实现方式以及优缺点,手机投屏经常会涉及到投屏端和接收端端相互操作以及音频的播放。所以在建立了投屏需要建立好几个连接通道,分别传输音频、控制指令和录屏的视频流。scrcpy就是这样实现的,如果我们能获取到权限,目前决定scrcpy是最好的投屏实现方式。由于没有权限,现在的大多数控制都是通过Android手机的无障碍模式实现的。这就是我对手机投屏的一些调研总结,希望能帮到有需要的读者

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在IDEA中构建Jar包,安装Jar包到Maven仓库并在Maven项目中使用

文章目录 0. 关于本文1. IDEA构建Jar包1.1 准备一份Java代码(就是你要构建工件的代码)1.2 进行如下步骤构建工件 2. 关于Maven3. 将Jar包安装到Maven仓库4. 使用安装的Jar包依赖 0. 关于本文 本文内容: 借助IDEA构建Jar包将Jar包安装到Mave…

青动CRM V3.2.1

全面解决企业销售团队的全流程客户服务难题旨在助力企业销售全流程精细化、数字化管理,全面解决企业销售团队的全流程客户服务难题,帮助企业有效盘活客户资源、量化销售行为,合理配置资源、建立科学销售体系,提升销售业绩。标准授…

shell脚本使用==判断相等报错

文章目录 方法 1:使用 比较符方法 2:强制使用 bash 这个错误的原因是你使用了 比较符,而 /bin/sh (或一些系统的默认 sh 解释器) 可能不支持它。对于 POSIX 兼容的 shell(如 /bin/sh),应该使用单个等号…

LeetCode[简单] 136. 只出现一次的数字

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 思路 当 A 与 B 不同时,按…

2024CSCO 芦康沙妥珠单抗创造晚期TNBC二线治疗新高度

前言 “魔法子弹”的概念从上世纪初提出,经过一百多年的不断探索,抗体药物偶联物(ADC)从理想照进现实,达到今天百舸争流的盛况,被认为是极具前景的创新疗法,全球范围内已有十余款产品被批准用于…

友元运算符重载函数

目录 1.定义友元运算符重载函数的语法形式 2.双目运算符重载 3.单目运算符重载 1.定义友元运算符重载函数的语法形式 (1)在类的内部,定义友元运算符重载函数的格式如下: friend 函数类型 operator 运算符(形参表&a…

开源标注工具

DoTAT https://github.com/FXLP/MarkTool 后端代码未开放,可能有数据泄露风险 Chinese-Annotator https://github.com/deepwel/Chinese-Annotator 安装非常麻烦,github更新频率比较低,支持功能和doccano类似 IEPY https://github.com/ma…

国庆假节高速免费通行全攻略

关注▲洋洋科创星球▲一起成长! 国庆节假期全国收费公路继续对7座以下(含7座)小型客车免收车辆通行费。 具体免费时段从 10月1日00:00开始 10月7日24:00结束 01 提前出发,免费离开: 如果你在…

Win10系统使用mstsc远程电脑的时候发现隔一段时间就无法使用剪贴板_rdpclip---Windows运维工作笔记055

最近在使用温湿系统的远程桌面功能的时候发现,每当使用一段时间的时候,这个时候远程桌面功能的粘贴板就没办法使用了。 正常情况下,不管我一个电脑远程了多少台电脑,那么这些电脑之间都是可以使用粘贴板的,可以用来从一个电脑中截了图,然后粘贴到另一个电脑中。 但是现…

HuggingChat macOS 版现已发布

Hugging Face 的开源聊天应用程序 Hugging Chat,现已推出适用于 macOS 的版本。 主要特点 Hugging Chat macOS 版本具有以下亮点: 强大的模型支持: 用户可以一键访问多个顶尖的开源大语言模型,包括 Qwen 2.5 72B、Command R、Phi 3.5、Mistral 12B 等等&…

Mathematica线性优化-单纯形/改善单纯形/内点法

引言 Mathematica提供了多种工具和函数来实现线性优化,这些工具可以处理从简单的线性规划问题到复杂的多变量优化问题,最近运筹学作业要熟悉线性优化的编程方法,我们就使用mathematica进行:所有运行代码都在文章上面的资源中&…

【线程】线程池

线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现,线程池中的线程可以从阻塞队列中获取任务进行任务处理,当线程都处于繁忙状态时可以将任务加入阻塞队列中,等到其它的线程空闲后进行处理。 线程池作用: 1.降…

MySQL 中的 FOREIGN KEY 约束:确保数据完整性的关键

在 MySQL 数据库中,FOREIGN KEY(外键)约束是一种非常重要的机制,它可以帮助我们确保数据的完整性和一致性。那么,FOREIGN KEY 约束究竟是什么呢?让我们一起来深入了解一下。 一、什么是 FOREIGN KEY 约束&…

帆软通过JavaScript注入sql,实现数据动态查询

将sql语句设置为参数 新建数据库查询 设置数据库查询的sql语句 添加控件 JavaScript实现sql注入 添加事件 编写JavaScript代码 //获取评价人id var pjrid this.options.form.getWidgetByName("id").getValue();//显示评价人id alert("评价人:&…

设计模式之策略设计模式

一、状态设计模式概念 策略模式(Strategy) 是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 适用场景 当你想使用对象中各种不同的算法变体, …

Vue|插件

在 Vue.js 中,插件是用来扩展 Vue 功能的一种方式,能够帮助开发者扩展和复用功能。通过合理使用插件,可以提高代码的组织性和可维护性 目录 如何使用插件?插件的定义创建及使用插件插件的参数插件的扩展 总结 如何使用插件? 插件的定义 插…

iOS OC 底层原理之 category、load、initialize

文章目录 category底层结构runtime 执行 category 底层原理添加成员变量 load调用形式系统调用形式的内部原理源码实现逻辑 initialize调用形式源码核心函数(由上到下依次调用)如果分类实现了 initialize category 底层结构 本质是结构体。struct _cat…

Goweb---Gorm操作数据库(二)

Gorm允许用户自己自定义钩子操作,使用这些钩子操作,可以在增删改查操作前进行相关的操作和检验,它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误,GORM 将停止后续的操作并回滚事务。 自定义钩子函数 package ma…

爬虫入门 Selenium使用

爬虫入门 & Selenium使用 特别声明📢:本教程只用于教学,大家在使用爬虫过程中需要遵守相关法律法规,否则后果自负!!! 项目代码:https://github.com/ziyifast/ziyifast-code_inst…

828华为云征文 | 解锁高效项目管理,Zentao在华为云Flexusx容器化部署与应用指南

前言 在当今快速迭代的商业环境中,高效且灵活的项目管理成为企业竞争力的关键。华为云Flexusx实例,以其灵活的vCPU内存配比、热变配功能及按需计费模式,为项目管理软件如Zentao的部署提供了理想平台。Flexusx实例采用按需计费的灵活定价模式&…