miracast技术详解

Miracast是一种基于Wi-Fi Direct的无线显示标准,允许设备间无线分享视频和音频,无需无线热点。本文介绍了Miracast与WifiDisplay的关系,详细阐述了在Android TV上实现Miracast接收端的步骤,包括通过Wi-Fi P2P建立连接,发起RTSP连接,接收和解析RTP数据包,以及播放解码后的音视频流。此外,文中还探讨了多路Miracast的可能性及其挑战。
摘要由CSDN通过智能技术生成

miracast是什么?

Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连(Wi-Fi
Direct)为基础的无线显示标准。支持此标准的消费性电子产品(又称3C设备)可透过无线方式分享视频画面,例如手机可透过Miracast将视频或照片直接在电视或其他设备播放而无需任何连接线,也不需透过无线热点(AP,Access
Point)。
以上内容摘自维基百科

那WifiDisplay又是什么?

Miracast实际上就是WiFi联盟(WiFi Alliance)对支持WiFi
Display功能的设备的认证名称(该认证项目已经在2012年9月正式启动)。而通过Miracast认证的设备,便可提供简化发现和设置,实现设备间高速传输视频。
摘自百度百科

基本就是一个概念。说的都是同一个事情。
我自己总结一下就是
miracsat就是多台支持Wi-Fi直连(Wi-Fi Direct)的设备,通过无线(区别于usb/hdmi等有线连接),不需要无线热点AP(设备不用连接路由器),直接使用Wi-Fi直连(即wifip2p技术)进行连接。连接成功之后通过一些协议,将其中一台(或者多台)设备的画面和声音,直接分享到另外一台设备进行展示的一种技术。
注:一般情况下,投射的是手机画面的镜像。两端画面几乎一致(分辨率,宽高比等会略有差异)。特殊情况下,由于要投射的内容是手机决定的,所以如果手机侧的miracast不想投某些画面的时候,两侧显示的会有区别,比如说密码输入界面,版权保护的界面,锁屏之后的界面等。电视侧接收到的画面可能是全黑,也可能是默认画面。还有一种更特殊的情况,比如说SmartisanOS,如果手机侧设置的是TNT模式,则电视侧显示的画面是和手机侧完全不一样的TNT系统的界面。
在这里插入图片描述

在整个Miracast系统中,有两个角色:
一个是发送端,一般是小屏设备,比如说手机/平板或者是带有无线网卡的笔记本电脑,当然这里要排除所有的Apple设备,因为他们自成体系,镜像类投屏使用独有的协议Airplay。
一个是接收端,比如说电视或者投影仪。我们接下来就聊聊电视。

如何在Android TV上实现miracast接收端?

miracast中的两个设备,一个是要分享音视频数据的设备,一个是展现音视频数据的设备。典型的应用场景就是手机和电视。
手机的角色是发送端,角色是Source。电视角色是接收端,角色是Sink。两者需要先通过wifi p2p技术进行连接。
在这里插入图片描述

其中: Source端一般是手机等小屏设备充当 Sink端一般是电视,车载显示器和投影仪等大屏设备充当
Sink端又可以分为PrimarySink端和Secondary Sink端 Primary Sink端
可以接收音视频数据,适用于本身集成显示器和扬声器的设备 Scondary Sink端 只可以接收音频数据,适用于分体音箱设备
————————————————

版权声明:本文为CSDN博主「coderkim1024」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:blog.csdn.net/weixin_4386…

通过Wi-Fi P2P 连接两个设备
电视作为sink端,被动连接。所以在Android平台上,只需要调用WifiP2pManager等待被连接即可。

注册p2p相关广播,添加相关权限(不一一列举了,搜索引擎上都能搜到)

final IntentFilter wfdFilter = new IntentFilter();
wfdFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
wfdFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
...
mWfdReceiver = new WfdReceiver();
registerReceiver(mWfdReceiver, wfdFilter);

搜索,监听,向网络中发通知自己是一个p2p设备

这里有两种方式
方式一,创建p2p group

public void createGroup() {
   
        mManager.createGroup(mChannel, new WifiP2pManager.ActionListener() {
   
            @Override
            public void onSuccess() {
   
                LogUtil.d("WifiP2pManager createGroup success.");
            }

            @Override
            public void onFailure(int reason) {
   
                LogUtil.d("WifiP2pManager createGroup failed, " + reason);
            }
        });
    }

复制代码
调用成功之后,使用adb shell dumpsys wifip2p可以看到如下内容,和方式二不太一样的是,自带wifi p2p group:
在这里插入图片描述

可以发现,这个wifip2p已经处于已连接状态,并且电视自己已经是wifip2p的group owner。连接方式是,建组,等待成员加入组。很明显,会有更高的权限,因为自己是组长。是leader!
这种方式比较推荐,尤其是想实现多路miracast的情况下(后面章节有提到)。
方式二,主动listen

mManager.listen(mChannel, true, new WfdActionListener(WfdActionListener.ACTION_ID_SEARCH_DEVICE));

这种方式存在两个问题
问题一,会对电视本身网络,甚至整个周围网络环境都有干扰。因为搜索的时候,一般会使用2.4G信道,每次listen,都会给firmware发送listen命令,会强制把信道切换到listen设置的信道。直接就会中断工作在5G信道上的工作流。这个问题对于现代的高级大屏电视系统(比如Smartisan TV OS )来说是致命的,因为具有排他性,miracast工作的时候,其他对网络要求比较高的应用会受到严重影响,就无法实现画中画,多窗口拼接等功能。
问题二,和source端(手机)的连接是协商的方式,大家需要"投票",通过go intent等一些参数来决定谁来当老大。一旦没有当上老大,就比较被动。想实现多路miracast也无法实现了。
请注意,这些接口很多都是无法让第三方APP访问的,所以做这些的前提是整个系统的源码是开放的,这样你才可以给你的 apk 添加系统签名,在源码树中去编译,才能访问这些方法。当然,使用反射也是可以的,但是随着系统升级,反射也是越来越难,也会存在不确定的问题,所以不推荐使用反

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值