Android投屏总结

#android手机投屏

####导语

至于手机投屏的实现方法可谓五花八门,今天小袁就说下以开发人员的角度来说下当今手机的主流投屏方法。目前这种将终端信号经由WiFi传输到电视、电视盒的技术有三种:DLNA、AirPlay、Miracast、Google Cast。

##手机投屏智能电视的几种方法

###DLNA 专业术语:DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟)。 DLNA(Digital Living Network Alliance) 由索尼、英特尔、微软等发起成立、旨在解决个人PC,消费电器,移动设备在内的无线网络和有线网络的互联互通。 DLNA 2003年诞生是为了能够把当时相互独立的电视机及其相关设备(功放、音响、DVD/蓝光播放机)、PC及其相关设备(数码相机、音乐播放器)和移动电话在家庭中有机地整合起来,使得多媒体内容能够在各个设备上便捷地播放。

通俗术语: DLNA(数字生活网络联盟) 就是大佬们一起搞事情 商讨“我们要将物联网设备连接起来,怎么搞啊?” 搞着搞着 就搞出了这套设备的工业标准。 然后让其他设备具备 DLNA 这种工业标准,这样这些设备就可以互联互通了。

####UPnp协议

DLNA 标准包括多项协议及标准,其中最重要的部分是 UPnP 协议 UPnP是由“通用即插即用论坛”(UPnP Forum)推广的一套网络协议,它的目标是实现设备间网络互联。

  • UPnP协议定义了设备之间,设备和控制点,控制点之间通信的协议
  • 完整的UPnP协议栈由设备寻址、设备发现、设备描述、设备控制、事件通知以及基于Html的描述等几部分构成

Mou icon

 看到这个图有没有想到 OSI 七层模型? 我从下至上来介绍一下:

Mou icon

ip网络协议 大哥哥 IP:就是ip网络协议。 为什么需要它? 因为用到网络层数据的传输,IP层用于数据的发送与接收。 想象一下两个设备互联,其实就是在网络互联,所以需要网络层协议。

Mou icon

 TCP-UDP

这里包含了UDP和TCP两块协议。 这里图应该这样表示: 

Mou icon

 UDP协议跟IP协议组合成:UDP/IP协议 而 HHTPMU 和 HTPU 这两个协议是基于 UDP/IP 协议之上的。 TCP协议跟IP协议组合成:TCP/IP 协议 HTTP 则是基于 TCP/IP 协议上。

TCP/IP 协议大家应该都了解,但为何出现一个 UDP/IP 呢? 使用UDP,可以通过多点传送(Multicast)向 LAN 上所有支持UPnP的设备发送新设备接入的通知。这里流媒体 也会使用 UDP 来传输,因为速度快。

HHTPMU 和 HHTPU 是什么? 它是构建在 TCP/IP 协议之上的是 HTTP 协议及其变种,所有 UPnP 消息都被封装在 HTTP 协议及其变种中。HTTP 协议的变种是 HTTPU 和 HTTPMU,这些协议的格式沿袭了 HTTP 协议,只不过与 HTTP 不同的是他们通过 UDP 而非 TCP 来承载的,并且可用于组播进行通信。 可见 它之所以存在就是替换 TCP 为 UDP。

接下来就是 设备发现 | 设备控制 | 设备事件 协议了: 1、设备发现 SSDP 协议 简单服务发现协议(Simple Service Discovery Protocol:SSDP) 具体包括控制点如何发现网络上有哪些服务,以及这些服务的资讯,还有控制点本身宣告他提供哪些服务。

2、控制设备 SOAP 协议 简单对象访问协议(Simple Object Access Protocol:SOAP) 它定义如何使用 XML 与 HTTP 来执行远程过程调用。包括控制点如何发送命令消息给设备,设备收到命令消息后如何发送响应消息给控制点。

3、设备事件 GENA 协议 通用事件通知架构(Generic Event Notification Architecture:GENA) 定义在控制点想要监听设备的某个服务状态变量的状况时,控制点如何传送订阅信息并如何接收这些信息。

体系定义 

Mou icon

 这一层仅仅是一个抽象的、公用的设备模型。就是一个规范 定义,所有的 UPnP 设备都必须使用这层。 

Mou icon

 UPnP论坛 UPnP 论坛的各个专业委员会的设备定义层,在这个论坛中,不同电器设备由不同的专业委员会定义,例如:电视委员会只负责定义网络电视设备部分,空调器委员会只负责定义网络空调设备部分,依此类推。 

Mou icon

 UPnP设备制造厂商定义 也就是应用层,由 UPnP 设备制造厂商定义的部分。

###Miracast

Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连为基础的无线显示标准。支持此标准的设备可通过无线方式分享视频画面,例如手机可通过Miracast将影片或照片直接在电视或其他装置播放而无需受到连接线缆长度的影响。与DLNA不同的是,Miracast 也有类似于AirPlay 的镜像功能,可以将手机中屏幕内容直接投放到高清电视屏幕里,这样你也可以通过电视屏幕来玩游戏了。Android4.2版本以后系统标配此功能(在设置或显示菜单中可以找到,应用名称诸如:Wlan display、Wifi display、Miracast、Allshare cast、Mirroring screen、无线显示等,只是各手机厂家命名不同而已)。可以将手机屏幕通过无线显示接收器将画面无线传输到其他较大屏幕上,如客厅电视,会议室投影仪。画面传输延时150ms以下,几乎同时。点击此功能,但没有任何反应,因为此项功能需要配件支持。

###AirPlay

AirPlay 是苹果开发的一种无线技术,可以通过WiFi将iPhone 、iPad、iPodtouch 等iOS 设备上的包括图片、音频、视频通过无线的方式传输到支持AirPlay 设备。售价99美元的Apple TV就具备这样的功能,现在一些传统的家庭影院和HIFI如马兰士和天龙的新品功放和网络播放器已经支持AirPlay功能。

AirPlay具备与DLNA所没有的镜像功能,这一功能叫AirPlay镜像,可将iPhone 或iPad 上的画面无线传输到电视上,也就是说你设备显示的是什么,电视屏幕显示就就是什么,而不仅限于图片和视频。你可以拿着iPad 来当做方向盘,然后看着大屏玩游戏。

另外AirPlay镜像最牛地方是它可以实现双屏游戏,让你的游戏有更多的交互。比如,电视里显示的是游戏画面,而iPad上显示的是比赛的路线图。

###Google Cast

谷歌官方的文档

谷歌官方的demo

因为国内的手机基本都是阉割版本的。因为不需要使用Google Play,所以国内很多手机需要下载好谷歌的三件套才能使用,然后就是谷歌官方的硬件Chromecast,在国内基本很难用,因为要用访问谷歌的服务器,所以需要外网才行, 我在集成Chromecast中遇到的坑

#####申请id

*使用Styled Media Receiver类型注册,获取id,然后替换官方demo的id就不会有sample这个水印了,我开始用的Custom Receiver类型注册,水印还在。

#####Android代码加入

   	compile 'com.google.android.gms:play-services-cast-framework:10.0.1'//这里要用低版本,困扰两天compile 'com.googlecode.android-query:android-query:0.25.9'compile 'com.android.support:mediarouter-v7:25+'  

#####投屏关键代码

    private MediaInfo buildMediaInfo() {MediaMetadata movieMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);movieMetadata.putString(MediaMetadata.KEY_SUBTITLE, mTitle);movieMetadata.putString(MediaMetadata.KEY_TITLE, "第" + mPart + "集");movieMetadata.addImage(new WebImage(Uri.parse(mPictureUrl)));movieMetadata.addImage(new WebImage(Uri.parse(mPictureUrl)));//  Log.e(TAG, "buildMediaInfo" + mSelectedMedia.getUrl() + "         " + mSelectedMedia.getDuration() * 1000);//第一条为谷歌,第二条为我加密,三 不加密   4 网路不加密//   return new MediaInfo.Builder("https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/hls/WhatCarCanYouGetForAGrand.m3u8")//  return new MediaInfo.Builder("https://cdn61.ytbbs.tv/cn/tv/55550/55550-1/play.m3u8?md5=QXaEWg8r8NkZJo9ln0cZwg&expires=1521010007&token=55550")//  return new MediaInfo.Builder("https://cdn61.ytbbs.tv/cn/tv/54063/54063-1/play.m3u8?md5=DRhHA6ToB4z43_32sex0kw&expires=1521012980&token=54063")// return new MediaInfo.Builder("http://cdn14.ytbbs.tv/666/ds3/play.m3u8")//  return new MediaInfo.Builder(mSelectedMedia.getUrl())// url = "https://commondatastorage.googleapis.com/gtv-videos-bucket/CastVideos/mp4/DesigningForGoogleCast.mp4";//url = "https://cdn61.ytbbs.tv/666/ds3/ds3s.mp4";LogUtils2.logi(TAG, "buildMediaInfo" + url);return new MediaInfo.Builder(url).setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setContentType("application/vnd.apple.mpegurl")// .setContentType("application/x-mpegurl")// .setContentType("videos/m3u8")// .setContentType("videos/mp4").setMetadata(movieMetadata).setStreamDuration(0).build();}

setContentType里面MIME值类型非常重要。很多小伙伴投屏失败就是因为没有使用正确的__MIME__类型

###DLNA和Miracast区别

DLNA是基于文件的,媒体文件可能有各种各样的编码格式,播放器这端必须能够处理这么多种编码格式。通常为了比较好的播放体验,DLNA会先缓存一小段时间。 Miracast是实时的,它可以实时传输源端(Source)的输出。源端任何屏幕的操作都会被传输到接收(Sink)端。如果源端是播放媒体文件,源端负责先对媒体文件解码,然后再编码成H.264的格式。接收端只需要做H.264的解码就可以了。相对DLNA,Miracast对于WiFi通路的要求要更高一些。

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

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

相关文章

python 深度学习 解决遇到的报错问题3

目录 一、AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0. 二、ImportError: cannot import name logsumexp 三、FutureWarning: Passing (type, 1) or 1type as a synonym of type is deprecated; in a future version of numpy, it w…

VBA:对Excel单元格进行合并操作

Sub hb()Dim nn 3For i 3 To 18If Range("b" & i) <> Range("b" & i 1) ThenRange("b" & n & ":b" & i).Mergen i 1End IfNextEnd Sub

记录--前端使用a链接下载内容增加loading效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 问题描述&#xff1a;最近工作中出现一个需求&#xff0c;纯前端下载 Excel 数据&#xff0c;并且有的下载内容很多&#xff0c;这时需要给下载增加一个 loading 效果。 代码如下&#xff1a; // util…

Maven入门教程(三):Maven语法

视频教程&#xff1a;Maven保姆级教程 Maven入门教程(一)&#xff1a;安装Maven环境 Maven入门教程(二)&#xff1a;idea/Eclipse使用Maven Maven入门教程(三)&#xff1a;Maven语法 Maven入门教程(四)&#xff1a;Nexus私服 Maven入门教程(五)&#xff1a;自定义脚手架 6.Mav…

Loki日志系统

1、Loki是什么&#xff1f; Loki是一个开源的日志聚合系统&#xff0c;由Grafana Labs开发和维护。它旨在帮助用户收集、存储和查询大规模的日志数据&#xff0c;帮助用户更好地理解和监控他们的应用程序和系统。 Loki的设计灵感来自于Prometheus&#xff0c;它采用了类似的标…

【小沐学Unity3d】3ds Max 骨骼动画制作(蒙皮修改器skin)

文章目录 1、简介2、蒙皮修改器3.1 骨骼对象测试3.2 Biped对象测试 3、动画制作4、FBX导出结语 1、简介 “蒙皮”修改器是一种骨骼变形工具&#xff0c;主要设计用于通过另一个对象对一个对象进行变形来创建角色动画。可使用骨骼、样条线和其他对象变形网格、面片和 NURBS 对象…

python3+requests:接口自动化测试(二)

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;&#xff1a;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于…

【机器学习】线性回归

Model Representation 1、问题描述2、表示说明3、数据绘图4、模型函数5、预测总结附录 1、问题描述 一套 1000 平方英尺 (sqft) 的房屋售价为300,000美元&#xff0c;一套 2000 平方英尺的房屋售价为500,000美元。这两点将构成我们的数据或训练集。面积单位为 1000 平方英尺&a…

2010-2021年上市公司和讯网社会责任评级CSR数据/和讯网上市公司社会责任数据

2010-2021年上市公司和讯网社会责任评级CSR数据 1、时间&#xff1a;2010-2021年 2、指标&#xff1a;股票名称、股票代码、年份、总得分、等级、股东责任、员工责任、供应商、客户和消费者权益责任、环境责任、社会责任、所属年份 3、样本量&#xff1a;4万 4、来源&#…

数据结构与算法基础-学习-31-交换排序之冒泡排序、快速排序

排序的其他相关知识点和源码分享可以参考之前的博客&#xff1a; 《数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序》 一、交换排序基本思想 两两比较&#xff0c;如果发生逆序则交换位置&#xff0c;直到所有数据记录都排好序为止。 二、冒…

大模型理解之CLIP

前言 2021年2月份&#xff0c;CLIP模型被提出&#xff0c;想法很简单&#xff0c;性能高效&#xff0c;而且具备很好的泛化性。我在这里简单谈论下我对CLIP模型的理解&#xff0c;以及发现的一些问题。 我是在沐神的视频中了解的CLIP, 里面提到CLIP最大的贡献在于打破了固定类…

四轴飞行器的电池研究(MatlabSimulink仿真)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

全球免费编程教育网站:Code.org

全球免费编程教育网站&#xff1a;Code.org 官网地址注册使用 你还在为小朋友的编程教育而发愁吗&#xff1f; 你还在为小朋友放假无聊而头疼吗&#xff1f; 他来了他来了&#xff0c;全球免费编程教育网站来了。 2013年成立的Code.org是一个非营利组织。 它致力于为年轻女子、…

Xilinx UltraScale架构之可配置逻辑块CLB

目录 一、概览 二、UltraScale架构 2.1 UltraScale/UltraScale特点 2.2 与7系列CLB差异 三、 CLB结构 3.1 LUT 3.2 FF 3.3 多路选择器Multiplexers 3.4 进位链Carry Chain 四、应用 4.1 分布式RAM 4.2 移位寄存器 4.3 进位链Carry Chain 五、参考资料 一、概览 二…

专门针对开发人员,攻击者利用Rust获取操作系统信息

近日&#xff0c;研究人员在 Rust 编程语言的 crate 注册表中发现了一些恶意软件包&#xff0c;专门针对开发人员。 Phylum 在上周发布的一份报告中称&#xff0c;这些库是由一个名为 "amaperf "的用户在 2023 年 8 月 14 日至 16 日之间上传的。现已删除的软件包名…

【LeetCode-中等题】114. 二叉树展开为链表

文章目录 题目方法一&#xff1a;前序遍历&#xff08;构造集合&#xff09; 集合&#xff08;构造新树&#xff09;方法二&#xff1a;原地构建方法三&#xff1a;前序遍历--迭代&#xff08;构造集合&#xff09; 集合&#xff08;构造新树&#xff09; 题目 方法一&#x…

el-select 选择一条数据后,把其余数据带过来

1. 案例&#xff1a; ps: 票号是下拉框选择&#xff0c;风险分类、场站名称以及开始时间是选择【票号】后带过来的。 2. 思路: 使用官网上给的方法&#xff0c;选择之后&#xff0c;触发change方法从而给其余字段赋值 3. 代码 <el-form-itemlabel"票号&#xff1a;&…

buildAdmin的使用笔记

安装buildAdmin 下载完整包&#xff0c;解压进入 buildadmin 的文件夹&#xff0c; 输入命令 composer install 启动的时候使用&#xff0c; php think run 就可以了 为什么启动只需要&#xff0c; php think run 这种启动方式&#xff0c; 我是头一回看见 &#xff0c;后来才…

Android 手游聚合SDK小知识(一)

Android 手游聚合SDK小知识(一) Android 手游聚合SDK小知识(二) 聚合分包 前言 回头想想&#xff0c;在安卓游戏SDK这个领域&#xff0c;我也呆了4年了&#xff0c;从啥都不懂的小菜鸟&#xff0c;逐渐靠自己不断学习&#xff0c;对这个行业也算有了一些理解&#xff0c;趁着…

[贪心] 拼接最小数

这道题思路并不难&#xff0c;我主要想学习其一些对于字符串的处理。 代码如下&#xff1a; #include <iostream> #include <string> #include <algorithm> using namespace std;const int MAXN 10000; string nums[MAXN];bool cmp(string a, string b) {…