Android投屏总结

news2024/11/20 0:39:20

#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.coloradmin.cn/o/945889.html

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

相关文章

for...in和for...of有什么区别

在JavaScript中遍历数组通常是使用for...i循环,在ES5具有遍历数组功能的还有forEach、map、filter、some、every、reduce、reduceRight等。 for...in和for...of是两种增强型循环,for...in是ES5标准,在ES6中新增了for...of的循环方式。 1.fo…

基于ADAU1452 DSP语音信号处理算法系统构建

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?加我微信hezkz17, 本群提供音频技术答疑服务,群赠送音频,DSP音频项目核心开发资料 1 LMS, NLMS 最小均方自适应滤波算法 2 语音活动检测,去混响,波束形成算…

字符设备驱动读写操作实现

一、读操作实现 ssize_t xxx_read(struct file *filp, char __user *pbuf, size_t count, loff_t *ppos); 完成功能:读取设备产生的数据 参数:filp:指向open产生的struct file类型的对象,表示本次read对应的那次openpbuf&#xf…

十四五双碳双控时代下的“低碳认证”

目录 前言 十四五双碳双控时代下的“低碳认证” 一、关于“低碳认证” 二、低碳认证优势 三、环境产品认证EPD 四、EPD相关运营机构 五、碳中和相关机构 六、EPD的认证流程 七、低碳产品认证认证流程和要求 八、相关机构认证证书样例 九、证书附件表 前言 通过本篇文…

JavaWeb JQuery操作结点

目录 一、查找结点 1.简介 : 2.实例 : 二、创建结点 1.创建结点介绍 : 2.内部插入 : 2.1 介绍 : 2.2 实例 3.外部插入 : 3.1 介绍 3.2 实例 三、结点的其他相关操作 1.删除结点 : 2.复制结点 : 3.替换结点 : 4.遍历结点 : 一、查找结点 1.简介 : 查找到…

RAID磁盘阵列(RAID0/1/4/6/1+0)

目录 一、概述: 二、RAID 级别介绍 RAID 0 RAID 1 RAID 4 RAID 5 RAID 6 RAID10: 一、概述: RAID( Redundant Array of Inexpensive Disks)称为廉价磁盘冗余阵列。 RAID 的基本思想是把多个便宜的小磁盘组合到…

编写简单的支付接口测试用例思路

支付接口Python代码示例 以下是一个简单的支付接口Python代码示例,实现了用户登录后购买商品并支付的功能: import requests import json # 定义支付接口的URL和请求参数 url "https://example.com/pay" payment_data {"username&quo…

【业务功能篇87】微服务-springcloud-本地缓存-redis-分布式缓存-缓存穿透-雪崩-击穿

一、缓存 1. 什么是缓存 缓存的作用是减低对数据源的访问频率。从而提高我们系统的性能。 缓存的流程图 2.缓存的分类 2.1 本地缓存 其实就是把缓存数据存储在内存中(Map <String,Object>).在单体架构中肯定没有问题。 单体架构下的缓存处理 2.2 分布式缓存 在分布式环…

Iterator: hasNext()、next()、remove()

一、Iterator的API 关于Iterator主要有三个方法&#xff1a;hasNext()、next()、remove() hasNext:没有指针下移操作&#xff0c;只是判断是否存在下一个元素next&#xff1a;指针下移&#xff0c;返回该指针所指向的元素remove&#xff1a;删除当前指针所指向的元素&#xf…

树莓派 SSD1306

树莓派安装python3.9以及pip换源_树莓派安装pip_&#xff2c;&#xff2a;&#xff38;的博客-CSDN博客 树莓派使用 Python 驱动 SSD1306&#xff08;IIC/SPI 通信&#xff09; 进阶篇——树莓派OLED模块的使用 大量例程详解_oled例程_玩转智能机器人的博客-CSDN博客 使用OS 版…

从零开始学习盲盒小程序开发

在当前的电商市场中&#xff0c;微信盲盒小程序以其独特的互动性和惊喜感&#xff0c;已经成为吸引消费者的一种新兴电商模式。如果你也想搭建自己的微信盲盒小程序&#xff0c;本文将详细介绍如何从零开始实现这一目标。 第一步&#xff1a;登录【乔拓云】网后台&#xff0c;进…

自然语言处理2-NLP

目录 自然语言处理2-NLP 如何把词转换为向量 如何让向量具有语义信息 在CBOW中 在Skip-gram中 skip-gram比CBOW效果更好 CBOW和Skip-gram的算法实现 Skip-gram的理想实现 Skip-gram的实际实现 自然语言处理2-NLP 在自然语言处理任务中&#xff0c;词向量&#xff08;…

利用fsimage分析HDFS小文件

一、Hive 小文件概述 在Hive中&#xff0c;所谓的小文件是指文件大小远小于HDFS块大小的文件&#xff0c;通常小于128 MB&#xff0c;甚至更少。这些小文件可能是Hive表的一部分&#xff0c;每个小文件都包含一个或几个表的记录&#xff0c;它们以文本格式存储。 Hive通常用于…

卫星网络中的量子通信

当今社会&#xff0c;通信已经成为人类生活中不可或缺的一部分&#xff0c;而随着科技的迅猛发展&#xff0c;我们的通信方式也在不断革新和进化。近年来&#xff0c;量子通信作为一项引人瞩目的领域&#xff0c;正逐渐走入人们的视野。与传统通信方式相比&#xff0c;量子通信…

渗透测试漏洞原理之---【任意文件上传漏洞】

文章目录 1、任意文件上传概述1.1、漏洞成因1.2、漏洞危害 2、WebShell解析2.1、Shell2.2、WebShell2.2.1、大马2.2.2、小马2.2.3、GetShell 3、任意文件上传攻防3.1、毫无检测3.1.1、源代码3.1.2、代码审计3.1.3、靶场试炼 3.2、黑白名单策略3.2.1、文件检测3.2.2、后缀名黑名…

【AI】数学基础——线代(矩阵特征值,特征向量矩阵分解)

【AI】数学基础——线代&#xff08;向量部分&#xff09; 文章目录 2.3 矩阵2.3.1 二元方程组求解与行列式行列式 2.3.2 用矩阵形式表示数据矩阵与行列式区别特殊矩阵 2.3.3 矩阵的秩矩阵的秩 2.3.4 矩阵运算加减法数乘运算矩阵乘向量线性变换角度线性组合角度 矩阵乘矩阵转置…

MySQL有哪些常见的存储引擎?

主要存储引擎 主要的三个存储引擎MyISAMMemoryInnoDB 那存储引擎应该怎么选择&#xff1f;InnoDB 和 MylSAM 主要有什么区别&#xff1f; MySQL有9种存储引擎&#xff0c;不同的引擎&#xff0c;适合不同的场景&#xff0c;我们最常用的&#xff0c;可能就是InnoDB&#xff0c;…

向前兼容与向后兼容

2012年3月发布了Go 1.0,随着 Go 第一个版本发布的还有一份兼容性说明文档。该文档说明&#xff0c;Go 的未来版本会确保向后兼容性&#xff0c;不会破坏现有程序。 即用10年前Go 1.0写的代码&#xff0c;用10年后的Go 1.18版本&#xff0c;依然可以正常运行。即较高版本的程序能…

泰凌微科创板成功上市

2023年8月25日&#xff0c;泰凌微电子&#xff08;上海&#xff09;股份有限公司&#xff08;股票简称“泰凌微”&#xff0c;股票代码为“688591.SH”&#xff09;成功于上海证券交易所科创板挂牌上市。自泰凌微成立以来&#xff0c;便一直致力于研发具有自主知识产权、国际一…

Matter 设备配网流程 ---- 配网材料和 SPAKE2P 机制

Matter 设备配网流程 ---- 配网材料和 SPAKE2P 机制 1. Matter 配网材料 Matter 配网&#xff08;commissioning&#xff09;使用 SPAKE2P 协议完成 PASE&#xff0c;进而验证 DAC&#xff08;Device Attestation Credentials&#xff09;&#xff0c;派发 NOC&#xff0c;然…