Media | Android手机投屏方案Mircast、Scrcpy、DLNA实现方式对比

Media | Android手机投屏方案Mircast、Scrcpy、DLNA实现方式对比

1. 概述

手机投屏是目前市场上常见的功能,广泛应用于车机娱乐场景、辅助驾驶场景(如苹果的 CarPlay)和 VR 场景。市场上的投屏方式主要分为三类:

  1. 镜像模式:直接将手机界面完整投射到大屏幕上。此类投屏通常通过录屏技术,将视频流数据编码并传输到接收端,接收端再进行解码播放。例如,AirPlay 的镜像模式、Miracast 和乐播投屏等。

  2. 推送模式:常用于视频播放场景。用户将视频链接传递给接收端,接收端自行播放,发送端可以传输简单的控制指令。例如,DLNA 协议等。

  3. 特殊协议模式:主要用于投射部分应用或功能,尤其在车载领域较为常见,如苹果的 CarPlay、华为 HiCar 和百度 CarLife 等。

此外,还有一种新颖的投屏方式,可以在车机上显示手机画面,同时允许手机和车机互相操作,具体可以参考蔚来手机和车机的投屏视频。

今天的主要内容是介绍实现投屏的各种技术方式,主要涉及 Miracast、scrcpy 和 Google Cast 的实现方式及其优缺点。

2. 术语解释

2.1 Miracast

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

2.2 Scrcpy

Scrcpy 是一种开源命令行工具,通过 USB 数据线或 Android ADB(Android 调试桥)控制 Android 设备(如手机和平板电脑),用户可以在电脑上实时查看和控制 Android 设备,类似于远程屏幕操作。

2.3 DLNA 投屏

DLNA 投屏技术通过网络将多媒体内容从一台设备传输到另一台设备,允许用户将智能手机、平板电脑或电脑上的视频、音频和图片等内容投射到支持 DLNA 的电视、音响系统等显示设备上,基于设备之间的 WiFi 连接,无需额外物理连接或设置。

2.4 WiFi Direct

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

2.5 app_process

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

3. 技术实现对比

3.1 Miracast

3.1.1 Miracast 介绍

Miracast 是一种无线技术,允许将屏幕无线连接到计算机,由 WiFi 联盟制定,以 WiFi-Direct 和 IEEE802.11 为无线传输标准,支持将手机向电视或其他接收设备无线投送视频、图片。类似的投屏协议还有 AirPlay、DLNA 和 Chromecast 等。Miracast 是点对点网络,比蓝牙更高效。

3.1.2 Miracast 原理

Miracast 基于 WiFi P2P 或 TDLS、Infrastructure 进行设备发现,媒体传输控制使用 RTSP 协议,通过 HDCP 内容保护将音视频数据封装成 PES 包,再封装成 TS 包和 RTP 包,使用 RTSP 协议发送。

3.1.3 Miracast 优缺点分析
  • 优点:投屏画质清晰,兼容性好,Android 手机集成了 Miracast 投屏,开发文档丰富。
  • 缺点:正常工作时,Wi-Fi 在 P2P 模式下,源端与接收端建立一对一连接,无法实现抢占功能。底层封装了 UDP 传输协议,易造成丢帧、花屏现象,且 Android 投屏常常缺乏音频输出。

3.2 Scrcpy

3.2.1 scrcpy 介绍

scrcpy 通过 ADB 调试方式将手机屏幕投到电脑上并可控制 Android 设备。支持 USB 和 WiFi 连接,使用无需 root 权限,不需在手机上安装任何程序,支持 GNU/Linux、Windows 和 macOS。其显示分辨率高达 1920x1080,延迟约 35~70ms,启动快,代码完全开源。

3.2.2 scrcpy 的实现原理

Scrcpy 通过 ADB 连接手机和电脑,将一个 jar 文件推送到手机的 /data/local/tmp 目录,并执行该程序,处理来自电脑的数据请求。其免 root 原理主要依赖 AIDL(Android Interface Definition Language)和屏幕录制协议。

3.2.3 scrcpy 的优缺点分析
  • 优点:画质好,延迟低,完全开源且文档详尽,无需安装 APK 和 root 权限,能自定义控制行为。
  • 缺点:需要开启开发者模式中的 USB 调试,限制了其在生产环境中的应用。

3.3 Google Cast

3.3.1 Google Cast 介绍

Google Cast 类似于 DLNA、AirPlay 和 Miracast,允许用户通过无线方式将小屏幕(手机、平板、笔记本)的内容发送到大屏设备(如 Google TV、Chromecast)进行播放。提供适用于多个平台的 SDK。

3.3.2 Google Cast 的实现原理

发送端应用使用 SDK 将媒体信息发送到 Google 服务器,服务器再通知接收端播放。接收端运行浏览器,根据发送端的 app ID 和媒体信息载入对应网页,负责播放媒体内容。

3.3.3 优缺点分析
  • 优点:高度可定制,有成熟的 SDK 接入。
  • 缺点:依赖 Google 服务器,受限于某些国家的网络环境。

总结

本文主要介绍了各种 Android 手机投屏的实现方式及优缺点,手机投屏涉及投屏端和接收端的相互操作以及音频播放。在投屏过程中,需要建立多个连接通道,分别传输音频、控制指令和视频流。scrcpy 是目前最好的投屏实现方式,但在权限问题上仍然存在限制。希望这份总结能帮助到需要的读者。

Android 手机到 TV 需要通过 Miracast 技术实现。以下是实现 Miracast 的简单代码示例: 1. 在 AndroidManifest.xml 中添加权限: ``` <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ``` 2. 打开 Wi-Fi 并搜索支持 Miracast 的设备: ``` WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifiManager.setWifiEnabled(true); WifiP2pManager wifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); WifiP2pManager.Channel channel = wifiP2pManager.initialize(this, getMainLooper(), null); wifiP2pManager.discoverPeers(channel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { // 搜索成功 } @Override public void onFailure(int reason) { // 搜索失败 } }); ``` 3. 连接到支持 Miracast 的设备: ``` WifiP2pDevice device = ... // 获取支持 Miracast 的设备 WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = device.deviceAddress; wifiP2pManager.connect(channel, config, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { // 连接成功 } @Override public void onFailure(int reason) { // 连接失败 } }); ``` 4. 开始: ``` MediaRouter mediaRouter = (MediaRouter) getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo routeInfo = ... // 获取支持 Miracast 的设备信息 MediaRouteSelector selector = new MediaRouteSelector.Builder() .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_DISPLAY) .build(); MediaRouter.Callback callback = new MediaRouter.Callback() { @Override public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo info) { // 成功 } @Override public void onRouteUnselected(MediaRouter router, MediaRouter.RouteInfo info) { // 结束 } }; mediaRouter.selectRoute(routeInfo); ``` 注意:以上代码仅为示例,具体实现还需要根据实际情况进行调整。同时,Miracast 需要设备支持该技术,且不是所有的电视都支持 Miracast,需要先检查电视是否支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calvin880828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值