android投屏技巧,怎么样使用Platinum库开采三个D

图片 1image.png

什么是DLNA?

图片 2

问题:华为手机怎么投屏到电视机上?

  • iOS上实现DLNA功能Github上搜一下大多是基于C 的Platinum,于是就想能不能靠OC实现一套方便iOS开发者.于是就有了MRDLNA这个库.

DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE, 其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA(Digital Living Network Alliance) 由索尼、英特尔、微软等发起成立、旨在解决个人PC,消费电器,移动设备在内的无线网络和有线网络的互联互通,使得数字媒体和内容服务的无限制的共享和增长成为可能,目前成员公司已达280多家。<引自百度百科>

cover

回答:

DLNA包含若干协议和标准,最重要的也是我们最常用的就是UPnP技术。那么UPnP又是什么呢?

关于 android 投屏技术系列:
一、知识概念

  随着科技的不断发展,如今家家户户都有智能手机和电脑,人人都用智能手机,那么如何把手机或者平板的屏幕投屏到电脑上呢?其实很简单,首先我们得有一款投屏软件,比如说迅捷录屏大师,就非常的不错,下面小编便来分享给大家,教大家手机游戏投屏电脑的具体方法。

  • DLNA投屏的相关的介绍,协议,具体XML内容就不细说了. 这里介绍一下 MRDLNA这个库的投屏使用.

通用即插即用 是一种用于 PC 机和智能设备的常见对等网络连接的体系结构,尤其是在家庭中。UPnP 以 Internet 标准和技术(例如 TCP/IP、HTTP 和 XML)为基础,使这样的设备彼此可自动连接和协同工作,从而使网络对更多的人成为可能。<引自百度百科>

  • android设备投屏技术:协议&概念

图片 3

图片 4image.png图片 5image.png

那么,了解了这两个概念,还不够,我们还需要了解DLNA中另外几个重要概念。

这章主要讲一些基本概念, 那些 DLNA 类库都是基于这些概念来做的,了解这些概念能帮助你理清思路,同时可以提升开发效率,遇到问题也能有个解决问题的清晰思路。

  投屏软件

设置好代理self.dlnaManager = [MRDLNA sharedMRDLNAManager];self.dlnaManager.delegate = self;

调用开始搜索后就会搜索整个局域网中支持投视频的设备- viewWillAppear:animated{ [super viewWillAppear:animated]; [self.dlnaManager startSearch];}

发现设备后在代理中可以拿到- searchDLNAResult:(NSArray *)devicesArray{ NSLog; self.deviceArr = devicesArray; [self.dlnaTable reloadData];}//devicesArray中拿到的是CLUPnPDevice类型的对象
  1. DMC:简单点说,就是一个控制点,那么这个控制点是什么,我个人的理解是,谁控制,谁就是控制点。
  2. DMS:这是一个媒体服务器。
  3. DMR:我理解为媒体渲染器。这三者的关系是,DMC通过获取DMS上的歌曲或者视频(也可以不是DMS上的,而仅仅只是一个链接),把它们传送到DMR上,由DMR进行播放。

二、手机与tv对接

  安卓投屏软件

  • Demo中将搜索页面和投屏控制页面分开来的,所以在搜索页面搜索到设备后就把目标设备和播放Url设置给了dlnaManager

好了,我们把几个最基本的概念了解了一下,下面我们正式开始开发DLNA功能。DEMO在最后。再补充一句,platinum是集成开发,博主认为,各位还是应该先看看底层协议,了解DLNA具体是怎么运作的,然后再使用这个库进行开发,下面给一个博主写的DEMO并推荐四篇文章,让各位学习。

  • android投屏技术:发现设备代码实现
  • android投屏技术:发现设备源码分析

  第一步、首先在手机上我们打开安卓投屏软件,之后我们在底部导航栏点击投屏这个选项,进入投屏页面。

  • 1.DEMO
  • 2.基于DLNA实现iOS,Android投屏:基本概念
  • 3.基于DLNA实现iOS,Android投屏:SSDP发现设备
  • 4.基于DLNA实现iOS,Android投屏:SOAP控制设备
  • 5.基于DLNA实现iOS,Android投屏:订阅事件通知

这部分是通过Cling DLNA类库来实现发现设备的。
内容包括:

图片 6

- tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSString *testUrl = @"http://223.110.239.40:6060/cntvmobile/vod/p_cntvmobile00000000000020150518/m_cntvmobile00000000000659727681"; [tableView deselectRowAtIndexPath:indexPath animated:YES]; if (indexPath.row < self.deviceArr.count) { CLUPnPDevice *model = self.deviceArr[indexPath.row]; self.dlnaManager.device = model; self.dlnaManager.playUrl = testUrl; DLNAControlVC *controlVC = [[DLNAControlVC alloc] init]; controlVC.model = model; [self.navigationController pushViewController:controlVC animated:YES]; }}

- viewDidLoad { [super viewDidLoad]; self.dlnaManager = [MRDLNA sharedMRDLNAManager]; [self.dlnaManager startDLNA];}

/** 退出 */- closeAction:sender { [self.dlnaManager endDLNA];}/** 播放/暂停 */- playOrPause:sender { if (_isPlaying) { [self.dlnaManager dlnaPause]; }else{ [self.dlnaManager dlnaPlay]; } _isPlaying = !_isPlaying;}/** 进度条seek单位是秒 */- seekChanged:(UISlider *)sender{ NSInteger sec = sender.value * 60 * 60; NSLog(@"播放进度条======>: %zd",sec); [self.dlnaManager seekChanged:sec];}/** 音量volume建议传0-100之间字符串 */- volumeChange:(UISlider *)sender { NSString *vol = [NSString stringWithFormat:@"%.f",sender.value * 100]; NSLog(@"音量========>: %@",vol); [self.dlnaManager volumeChanged:vol];}/** 切集 */- playNext:sender { NSString *testVideo = @"http://wvideo.spriteapp.cn/video/2016/0328/56f8ec01d9bfe_wpd.mp4"; [self.dlnaManager playTheURL:testVideo];}
  1. 抽出发现设备所需接口
  2. 发现设备步骤的实现
  3. 原理的分析

  第二步、如果投屏的同时需要录屏,我们可以在投屏页面,将左上角的自动录屏开启,这样我们便能在录屏的同时录制电脑屏幕了。

  • 2.1 下载Platinum库

三、手机与tv通信

图片 7

  • android投屏技术:控制设备代码实现
  • android投屏技术:控制设备源码分析

  第三步、之后我们在电脑上安装与手机同款的投屏软件,点击立即安装即可进行安装,然后耐心等待一分钟即可安装完成。

git clone --depth=1 https://github.com/plutinosoft/Platinum.git

这部分也是通过Cling DLNA类库来实现手机对tv的控制。
内容包括:

图片 8

  • 2.2 编译Neptune库由于Platinum库是基于C 编写的,所以我们要安装一个叫Neptune的跨平台库。不过我们不用自己去编译,打开你下载好的Platinum库,你会发现有一个Cartfile的文件,用cat Cartfiel就能输出里面的内容,你会看到里面有这个库,所以我们直接下载就好了。下载的话我们需要用homebrew去下载一个carthage,然后再下载这个库。没有homebrew的以及不知道carthage是什么的同学请自行百度哦,这里就不多说了。
  1. 控制设备步骤
  2. 控制设备代码实现
  3. 手机如何控制tv
  4. tv将自己的信息如何通知手机
  5. 原理的分析

  第四步、安装好之后,我们运行它,并点击手机上的扫一扫投屏按钮,将其对准电脑上的二维码进行扫描。

前言

上篇文章,我们聊了投屏技术所需的协议和概念。今天我们来实际操作。

图片 9

神操作

何为发现设备?
android 手机投屏到 tv盒子 上,首先你要让 tv盒子 跟你的手机在同一个局域网中,然后要让手机能搜索到当前局域网内所有支持投屏的设备(如:tv盒子)这个过程 就是发现设备。

噢了~ 这篇文章分两部分:

  • 第一部分是 Cling库 的使用以及里面基本概念。
  • 第二部分是 Cling库 发现设备部分的源码分析。

图片 10

action

行动前,先分析一下 我们的需求:

  1. 手机 & tv盒子 都连上局域网
  2. 手机需要随时监听局域网中支持投屏设备的出现
  3. 手机跟支持投屏的 tv盒子 建立连接

首先,看 Cling库 的介绍:

图片 11

Cling

它主要由 core 和 support 两个部分构成。

  • core: 包含了发现设备部分
  • support: 包含的是控制设备部分

今天我们要用到的是 core 部分。
一切准备就绪,大哥,我们开始实现发现设备功能好不好?
不好也得好,就是这么任性,略略略

图片 12

打我啊

图片 13

cd Platinumbrew install carthagecarthage update

发现设备功能实现

首先我们要在 manifest 里加上以下权限(网络相关权限):

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

在 Cling 中针对 android 定义了一个 Service 来操作------>AndroidUpnpServiceImpl
它有以下方法:

public UpnpServiceConfiguration getConfiguration();

public ControlPoint getControlPoint();

public ProtocolFactory getProtocolFactory();

public Registry getRegistry();

public Router getRouter();

public IBinder onBind(Intent intent);

public void onDestroy();

不懂没关系。
现在你只需要知道:

  • ControlPoint getControlPoint() 获取到控制点,通过控制点执行 search() 方法就可以发现设备了
  • 然后就是 我们可以根据需求在 activity 里 bind 或者 unbind AndroidUpnpServiceImpl 这个 Service

接下来我们要在 manifest 里面定义这个 Service

<service android:name="org.fourthline.cling.android.AndroidUpnpServiceImpl"/>

下面是 activity:

public class BrowserActivity extends ListActivity {

    private ArrayAdapter<DeviceDisplay> listAdapter;

   // 监听设备发现,当一个新设备出现在网络时,会回调它
    private BrowseRegistryListener registryListener = new BrowseRegistryListener();

    private AndroidUpnpService upnpService;

    private ServiceConnection serviceConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className, IBinder service) {
            upnpService = (AndroidUpnpService) service;

            listAdapter.clear();

            // 添加监听
            upnpService.getRegistry().addListener(registryListener);

            // 添加已知的设备
            for (Device device : upnpService.getRegistry().getDevices()) {
                registryListener.deviceAdded(device);
            }

            // 搜索所有的设备
            upnpService.getControlPoint().search();
        }

        public void onServiceDisconnected(ComponentName className) {
            upnpService = null;
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        listAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1);
        setListAdapter(listAdapter);

        // This will start the UPnP service if it wasn't already started
        getApplicationContext().bindService(
            new Intent(this, AndroidUpnpServiceImpl.class),
            serviceConnection,
            Context.BIND_AUTO_CREATE
        );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (upnpService != null) {
            upnpService.getRegistry().removeListener(registryListener);
        }
        // This will stop the UPnP service if nobody else is bound to it
        getApplicationContext().unbindService(serviceConnection);
    }
    // ...
}

这段代码就实现了两个功能:

  1. upnpService.getControlPoint().search(); 实现发现设备
  2. BrowseRegistryListener registryListener;
    upnpService.getRegistry().addListener(registryListener);
    实现了发现设备监听

其实 就这么简单,<b>但</b>搜索到的 并不是我们想要的结果,我要筛选到支持投屏渲染的设备:

    public static final DeviceType DMR_DEVICE_TYPE = new UDADeviceType("MediaRenderer");

    /**
     * 获取支持投屏的设备
     *
     * @return  设备列表
     */
    @Override
    @Nullable
    public Collection<Device> getDmrDevices() {
        if (Utils.isNull(mUpnpService))
            return null;

        Collection<Device> devices = upnpService.getRegistry().getDevices(DMR_DEVICE_TYPE);

        return devices;
    }

噢了~~

  第五步、然后耐心等待连接成功,网络环境好的话,几秒钟即可连接成功。所以投屏的时候一定要保持自己的网络环境通畅,下面为小编本次投屏的效果图(因为手机上没有游戏,所以展示的不是游戏,但是步骤都是一样的,绝对可行)。

以上三条命令完成后,你会在platinum/Carthage/build文件夹下看到两个文件夹,分别是iOS和Mac,里面各有一个Neptune.framework,这时就说明我们编译成功了。

点击查看详细代码

(* 详细代码里 做了一些封装)

下面我们进入正式环节-源码分析:
由于文章太长,我分开到下篇文章

图片 14

  • 2.3 编译platinum库打开platinum/Build/Targets/universal-apple-macosx/Platinum.xcodeproj工程,选择Platinum-iOS的target,分别在模拟器和iOS设备上运行一次。如下:

android投屏技术

本文由星彩网app下载发布于计算机编程,转载请注明出处:android投屏技巧,怎么样使用Platinum库开采三个D

TAG标签: 星彩网app下载

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。