Skip to content
当前版本:V1.9

苏州必捷网络有限公司

1 概述

1.1 目的

用于指导使用必捷Airplay接收端 SDK的开发人员进行开发及测试。

1.2 读者对象

本文档适用于开发Android平台Airplay接收端的开发人员。

1.3 缩略语定义

缩写名称英文中文
Airplay苹果公司制定的无线通讯技术

2 范围

2.1 功能

本SDK可以接收来自iphone,ipad,imac使用Airplay方式的投屏数据,并提供接口给应用层调用处理。基于本SDK可开发Android Airplay接收端应用程序。

本SDK为标准的Android AAR模块,提供JAVA接口供应用集成。

2.2 SDK框架

BJAirplay Receiver SDK总体分为两层:

  1. cast_base_lib-1.0.53-release.aar:它是一个Android Module,它定义了基础的MediaChannel,Module接口。

  2. bj_airplay_lib-1.0.91-release.aar:它是一个Android Module,定义了AirplayModule,以及相关JNI接口。

2.3 SDK的DEMO实现

BJAirplayReceiver SDK Demo是接收端的一个参考实现,它基于bj_airplay_lib-1.0.17-release.aar实现了Airplay接收端功能。其中AirplayModuleImp实现了ModuleImpItf接口,

AirplayMirrorChannel实现了MediaChannel接口,实现了对Airplay镜像会话的处理。

AirplayAudioChannel实现了MediaChannel接口,实现了对Airplay音频会话的处理。

AirplayUrlPlayChannel实现了MediaChannel接口,实现了对Airplay URL播放会话的处理。

2.4 SDK交付物

  • SDK库(两个AAR文件)
  • DEMO源代码
  • SDK接口文档

3 接口

接口主要在AirplayModule,ModuleImpItf和MediaChannel类中进行定义;

其中AirplayModule类提供了初始化SDK,去初始化SDK,强制结束某会话等接口。

ModuleImpItf是一个接口类,需要由用户实现相关接口,SDK通过该接口类通知用户程序Airplay投屏会话的开始与结束,用户程序需要根据不同的会话类型创建对应的MediaChannel实现类和对应的播放器应用。

MediaChannel是一个接口类,它代表一个投屏会话,需由用户程序实现,SDK通过此接口类将音视频数据,音量控制,视频旋转等控制事件通知应用程序,应用程序在对应播放器中进行处理。

用户需实现MediaChannel,ModuleImpItf相关接口, 也可参考我司提供的DEMO源代码实现。

3.1 AirplayModule类中的接口说明

3.1.1 设置客户定制的模块实现类接口

java
public void setImp(ModuleImpItf imp)

描述

设置用户自定义的模块接口实现实例。具体请参考3.2部分的接口。

参数

imp:用户实现的ModuleImpItf接口实例。具体请参考3.2部分的接口。

调用示例

请参考Demo部分代码。

3.1.2 初始化接口

3.1.2.1 初始化接口1

java
public int init(Context context, Properties paras)

描述

AirplayModule类的Init方法初始化Airplay接收端模块。App在启动做初始化时调用,AirplayModule对象应设计为全局只有一个实例。

参数

名称描述
contextAndroid应用上下文
paras为SDK初始化属性集合,paras为Properties类型。
通过键值对的方式初始化sdk的参数

其中paras常用属性的设置说明

属性名描述必填
name接收端名称,即在投射端设备上搜索时显示的Airplay接收端的名称。
secretkeylicense Key,为使用必捷授权申请库或者申请工具申请的license授权。sdk内部会对此进行授权和校验。
license_check_token由必捷分配,用于初始化SDK的license校验和包名认证,防止被他人盗用。
license_check_pass由必捷分配,用于初始化SDK的license校验密码,防止盗用。
resolution接收端支持的最大分辨率,默认为0(1080P),通常不推荐用户设置该值,使用默认值即可。支持以下取值
0:1080P(1920x1080),
1:720P(1280x720)
framerate镜像投屏的最大帧率。
取值范围10-60。默认为30。
max_session_numsSDK支持的最大Airplay投屏路数,1-16。默认为4。根据实际情况进行设置。通常设为1,代表同时支持1路投屏。
注意:如果要支持抢投,则需要设置比实际最大路数多1。
pass初始PIN码,不支持pin码则输入空字符串。默认空字符串。
airtunes_portAirplay ROAP协议使用的端口,默认7202。
mirror_port镜像投屏数据接收端口,默认为7100。
airplay_portAirplay内部Airplay服务监听端口,默认为7002。
rotation接受端是否启用旋转处理。0:不支持 1:支持。 默认为0,推荐用户设为0。
0: 不支持旋转。当ios设备镜像投屏过程发生横竖屏切换时,码流的分辨率会变化。
1: 支持旋转。当ios设备镜像投屏过程发生横竖屏切换时,码流分辨率不会变化,会通过3.3.7 视频旋转接口通知当前的旋转角度,由播放器去处理旋转。

返回值

0表示成功,其它表示初始化失败

返回值含义
0成功
1端口绑定失败。协议使用的端口与其它软件冲突时触发,可通过初始化指定airtunes_port/mirror_port/airplay_port解决
license授权错误码说明license授权相关的失败错误码请参考3.4节。

调用示例

java
this.airplayModule = new AirplayModule();
this.airplayModule.setImp(new AirplayModuleImp()); //用户实现自定义的AirplayModuleImp类,此处创建相应实例

Properties paras = new Properties();
//airplay接收端的名称
paras.setProperty(AirplayModule.PARA_NAME_DEVICE_NAME,deviceName);  

//设置license校验相关的参数
paras.setProperty(AirplayModule.PARA_NAME_SECRETE_KEY,secrectKey);
paras.setProperty("license_check_token",licenseCheckToken); 
paras.setProperty("license_check_pass",licenseCheckPass);

//设置最大分辨率为1080P
//paras.setProperty("resolution","0");  

//设置最大帧率为25
//paras.setProperty("framerate","25");  

//设置最大投屏路数为2,表示SDK支持两个苹果设备同时投屏
//paras.setProperty("max_session_nums","2");

 int errorCode = airplayModule.init(DemoApplication.getContext(),paras);
 if (errorCode == AirplayModule.BJ_AIRPLAY_ERROR_SUCCESS) {
      LogUtils.dTag(TAG, "airplayModule init success");
 } else {
      LogUtils.eTag(TAG, "airplayModule init failed : " + errorCode);
 }

注意事项

初始化时还支持指定一些其它定制化的属性,或者针对某些业务场景的属性(如酒店投屏场景需要自动隐藏不被外部发现),这部分属性属于特定业务场景才需要使用的功能,在本文没有列出,如有需求请与我司商务/技术接口人对接咨询。

3.1.2.2 初始化接口2

java
public int init(Context context, Properties paras, Object userdata)

描述

一般SDK用户无需关心此接口,使用3.1.2.1接口即可。

此接口是针对特定用户的定制化需求而开发,具体业务请咨询我司接口人。

AirplayModule类的Init方法初始化Airplay接收端模块。App在启动做初始化时调用,AirplayModule对象应设计为全局只有一个实例。

参数

名称描述
contextAndroid应用上下文
paras为SDK初始化属性集合,paras为Properties类型。
通过键值对的方式初始化sdk的参数。参考3.1.2.1部分详细描述。
userdata特定用户对象。根据实际某些定制业务场景设计。

调用示例

参考3.1.2.1部分。

注意事项

普通SDK用户不需要关心此接口。

初始化时还支持指定一些其它定制化的属性,或者针对某些业务场景的属性(如酒店投屏场景需要自动隐藏不被外部发现),这部分属性属于特定业务场景才需要使用的功能,在本文没有列出,如有需求请与我司商务/技术接口人对接咨询。

此接口从1.0.90版本开始支持,为某些特定用户定制的特殊需求,SDK内部会访问userdata的某些方法和属性,此处必须要求userdata类没有被混淆并且传入userdata时必须为可用状态,具体使用和对接请与我司技术接口人咨询。

3.1.3 去初始化接口

java
public native void fini();

描述

AirplayModule类的fini方法用于去初始化Airplay模块。App销毁Airplay接收端服务时调用。

3.1.4 更新PIN码接口

java
public native int setPassword(String pass);

描述

更新Airplay PIN码。空字符串表示禁用PIN码,其它有效字符串表示PIN码。

参数

pass:为当前PIN码。不启用pin码,此处请输入””空字符串。PIN码由数字0-9组成,建议不要超过4位长度。

返回值

0:成功,其它: 失败

注意事项

注意: 当有Airplay投屏连接存在的情况下,不允许更新PIN码,此时调用该接口会返回错误。

PIN码模式和密码模式的区别:

PIN码模式:每次投屏都需要输入PIN码(数字组成),PIN码会变化。所以每次投屏时需要实时显示新的PIN码。

密码模式:第一次投屏需要密码(数字和英文字母组成),密码设定后不会变化

3.1.5 强制结束某路Airplay会话接口

java
public native void kickOut(MediaChannel channel);

描述

用于用户强制结束某个投屏会话。

参数

channel: 为ModuleImpItf reqMediaChannel创建的对应会话。

注意事项

kickOut函数的调用不能在SDK的回调接口调用,容易导致死锁。建议用户异步起一个子线程调用。具体请参考Demo源码中的调用示例。

3.1.6 实时修改Airplay接收端名称接口

java
public native void rename(String name);

描述

用于用户修改Airplay接收端的名称,该接口调用实时生效。

参数

name: 为Airplay接收端的名称。

注意事项

3.1.7 设置投屏密码模式

java
public native void setPasswordMode(boolean isEnable,String password);

描述

设置/关闭投屏密码模式。

参数

名称描述
isEnabletrue:启用密码模式,false:关闭密码模式
password投屏密码,字符串(由数字和英文字母组成,建议不要超过6位长度)
在isEnable为true时有效。

调用示例

关闭密码模式:setPasswordMode(false,“”);

设置密码为a12345:setPasswordMode(true,”a12345”);

注意事项

PIN码模式和密码模式的区别:

PIN码模式:每次投屏都需要输入PIN码(数字组成),PIN码会变化。所以每次投屏时需要实时显示新的PIN码;

密码模式:第一次投屏需要密码(数字和英文字母组成),密码设定后不会变化。

3.2 ModuleImpItf接口说明

ModuleImpItf定义了一个接口类,需要用户去实现这些接口。在初始化AirplayModule时需要创建该实例。

3.2.1 会话接入接口

java
public MediaChannel reqMediaChannel(MediaChannelInfo channelInfo,UserInfo userInfo);

描述

这是一个回调接口,由用户重载实现。

当Airplay协议栈发现有会话接入时,SDK内部会主动调用此接口,需要在客户自身的ModuleItf实现类中去实现该接口,返回一个MediaChannel实例,后续sdk会通过MediaChannel接口反馈投屏会话信息。

参数

名称描述
channelInfo描述了投屏的类型,音视频参数等信息。
userInfo描述了发射端的IP,设备型号,设备名称等信息

返回值

用户创建的自定义的MediaChannel实例对象,用户需按照3.3部分的接口实现自己的MediaChannel类,在此接口中创建对应的实例。

若返回null, sdk内部会自动断开此次投屏会话,当用户拒绝此次投屏或其它原因不允许投屏接入时,可直接返回null。

调用示例

更详细的细节请参考demo源码中的处理。

java
	@Override
    public MediaChannel reqMediaChannel(MediaChannelInfo info, UserInfo userInfo) {
        Log.i(DemoApplication.TAG, "reqMediaChannel: userInfo ip:"+userInfo.ip+" name:"+userInfo.deviceName+" model:"+userInfo.model);
         MediaChannel channel = null;
        synchronized (this) {
            /**
             * 根据不同的ChannelPlayType,创建不同的channel
             */
            switch (info.getChannelPlayType()) {
                case MediaConst.MEDIA_TYPE_AV:  //屏幕镜像投屏情况
                    AirplayMirrorChannel mirrorChannel = new AirplayMirrorChannel(info);
                    channel = mirrorChannel;
                    mirrorChannel.setUserInfo(userInfo);
                    Log.d(DemoApplication.TAG, "AirplayModule reqMediaChannel mediaCodecMode  ");   

                    break;
                case MediaConst.MEDIA_TYPE_AUDIO: //纯音乐投屏情况
                    Log.d(DemoApplication.TAG, "AirplayModule reqMediaChannel AUDIO");
                    channel = new AirplayAudioChannel(info);
                    break;
                case MediaConst.MEDIA_TYPE_FILE:   //URL投屏(视频软件中的投TV)情况
                case MediaConst.MEDIA_TYPE_AUDIO_MP3:
                    Log.d(DemoApplication.TAG, "AirplayModule reqMediaChannel URL");
                    channel = new AirplayUrlPlayChannel(info);
                    break;
                case MediaConst.MEDIA_TYPE_PICTUPE_PLAYBACK:   //图片投屏情况,IOS9.0以后设备已经不会触发该流程,用户可不用考虑
                    Log.d(DemoApplication.TAG, "AirplayModule reqMediaChannel PIC");
                    channel = new AirplayPicViewChannel(info);
                    break;
                default: {
                    Log.e(DemoApplication.TAG, "reqMediaChannel failed,because info.getChannelPlayType() invalid:" + info.getChannelPlayType());
                    return null;
                }
            }
        }

       	//打开channel相应的资源
        if (!openAndStartChannel(channel)) {
            Log.e(DemoApplication.TAG, "reqMediaChannel failed,because openAndStartChannel failed.");
            return null;
        }

        //创建channel对应的view资源
        CastManager.getMgr().putChannel(channel, userInfo);
        switch (info.getChannelPlayType()) {
            case MediaConst.MEDIA_TYPE_AV: {
                int viewType = SharedPreferenceHelper.getInstance().getViewType();
                if (viewType == 2){
                    DemoApplication.APP.getEventBus().post(new MirrorGLSurfaceEvent(channel, userInfo));
                }else if (viewType == 0){
                    DemoApplication.APP.getEventBus().post(new AirplayEvent(channel));
                }else if (viewType == 1){
                    DemoApplication.APP.getEventBus().post(new AirSurfaceEvent(channel));
                }
            }
            break;
            case MediaConst.MEDIA_TYPE_AUDIO: {
                DemoApplication.APP.getEventBus().post(new AirAudioEvent(channel));
            }
            break;
            case MediaConst.MEDIA_TYPE_FILE: {
                DemoApplication.APP.getEventBus().post(new AirUrlEvent(channel));
            }
            break;
            default:
                break;
        }
        return channel;  //返回mediachannel实例
    }

注意事项

若此接口返回null, sdk内部会自动断开此次投屏会话,当用户拒绝此次投屏或其它原因不允许投屏接入时,可直接返回null。

具体实现可以参考DEMO源代码。

3.2.2 会话结束接口(done)

java
public void relMediaChannel(MediaChannel channel)

描述

这是一个回调接口,由用户重载实现。

当Airplay协议栈收到会话结束时,SDK内部会主动调用此接口,需要在客户自身的ModuleItf实现类中去实现该接口,用户需要释放MediaChannel相关的资源。

参数

名称描述
channelreqMediaChannel返回的MediaChannel实例

调用示例

具体实现可参考DEMO源代码。

3.2.3 投屏属性协商接口

java
public void probeRenderAbility(Properties props);

描述

这是一个回调接口,由用户根据实际情况重载实现。

回调接口, 当底层发起投屏时,会调用该接口来进行参数协商当前Airplay投屏会话的最大帧率和最大分辨率。用户可通过定制该接口来动态调整会话的最大帧率和最大分辨率。

注意:此接口非用户必须重载实现的接口。若用户不重载该函数,则会以初始化时指定的默认的分辨率和最大分辨率发起投屏。

参数

名称描述
props为协商的属性集。当前支持最大分辨率和最大码率,参考调用示例。

调用示例

举例

java
 @Override
   public void probeRenderAbility(Properties props){
     	//用户可定制此函数,实现Airplay投屏会话的最大帧率,参考如下代码,将最大帧率设置为30
     	int framerate = 30;
   		props.setProperty(AirplayModule.PARA_NAME_KEY_FRAMERATE,
                     Integer.toString(framerate));
       
        //设置分辨率最大为720P,参考3.1.2.1中分辨率取值
   		//props.setProperty("resolution","1");
   }

注意事项

此接口非用户必须重载实现的接口。若用户不重载该函数,则会以默认的分辨率和最大帧率发起投屏。

3.2.4 设备接入回调接口

java
public int onDeviceConnect(UserInfo senderInfo)

描述

这是一个回调接口,由用户根据实际情况重载实现。设备初始连接前提示设备接入,该接口会在reqMediaChannel接口前被调用。由用户根据应用需要重载该接口,父类中默认实现返回0。

该接口是IOS设备连接到接收端时被调用,此时还未真正发起投屏之前就会被调用,其含义表示设备已经连接上。

参数

名称描述
UserInfo描述了发射端的IP,设备型号,设备名称等信息。

返回值

0: 允许接入

1: 直接断开连接

注意事项

该接口从1.0.59版本开始支持。

3.2.5 设备断开回调接口

java
public void onDeviceDisConnect(String ip)

描述

回调接口,当用户完全断开投屏时(或网络异常中断),该接口会回调通知应用。由用户根据应用需要重载该接口,父类中默认实现不做任何处理。用户可根据该接口判断,后续该设备不会再有新的投屏上来(即不会再有reqMediaChannel被调用)。

参数

ip: 为发射端设备的IP地址

注意事项

该接口从1.0.59版本开始支持

3.3 MediaChannel会话处理接口

当投屏会话建立成功后,协议栈会调用MediaChannel类中的相应接口回吐数据或者获取状态。以下接口需要在MediaChannel子类中实现,客户需要根据自身实际情况实现下列接口。

MediaChannel子类中重要的接口如下,Airplay接收端需要重点关注以下接口。

3.3.1 设置窗口句柄

java
public void setSurface(Surface surface)

描述

设置当前MediaChannel关联的显示相关的Surface,视频将显示到该Surface。该Surface来自用户用于显示视频的view。

参数

surface: 显示相关的Surface,通常来自用户用于显示视频的view。

调用示例

参考Demo中的实现。

3.3.2 音频数据回吐接口

java
public abstract void onAudioFrame(byte[] buffer,int len,long ts);

描述

镜像音频数据回调接口,该接口中吐出的是音频PCM数据,用户需要实现对音频数据的播放处理功能。

该接口涉及Airplay镜像投屏或纯音乐投屏。

音频格式如下,播放器需按照以下格式进行音频的播放。

音频参数
采样率44100
音频格式S16
声道数2

参数

名称描述
buffer音频数据数组,byte[]类型
len数据块长度
ts时间戳,时间戳单位为1/1000000秒

3.3.3 更新音频播放的封面信息接口

java
public void onRefreshCoverArt(byte[] buffer,int len);

描述

回调接口, 通知音乐封面信息,其为jpeg格式的数据。用户实现该接口可用于显示当前播放音乐的封面图片。

该接口涉及Airplay纯音频投屏会话。

参数

名称描述
buffer音乐封面数据,其为是jpeg格式的数据。
lenlen为jpeg文件内容长度。

3.3.4 更新音频播放的歌曲信息接口

java
public void onRefreshTrackInfo(String album,String title,String artist)

描述

通知播放的音乐的标题,艺术家,唱片信息。应用实现该接口,可在UI实时显示当前播放音乐的标题,艺术家,唱片信息。

该接口涉及Airplay纯音频投屏会话。

参数

名称描述
album当前播放音乐的唱片信息(某些应用播放器实际传的为歌词)。
title标题内容。
artist艺术家信息

3.3.5 音量控制接口

java
public void setVolume(int volume)

描述

通知音量调节的处理。该接口涉及Airplay纯音频投屏会话和镜像投屏会话。

参数

volume取值范围为0-100。0表示静音,100表示音量为最高。

调用示例

java
public void setVolume(int volume) {
    //注意当前android默认的AudioTrack的setStereoVolume此处取值为0-1,故此处需做转换
    float v = volume/100.0f;  
    
    if(audioPlayer != null){
        audioPlayer.setStereoVolume(v,v);   
    }
}

3.3.6 视频数据回调接口

java
public void onVideoFrame(byte[] buffer,int len,long ts)

描述

镜像视频数据回调接口,该接口中吐出的是H264视频数据,用户需要进行解码并播放。

该接口涉及Airplay镜像投屏,视频格式为H264。

参数

名称描述
buffer视频数据数组
len数据块长度
ts时间戳,时间戳单位为1/1000000秒

返回值

调用示例

可以参考SDK中DEMO源代码中AirplayMirrorChannel类中的实现。

3.3.7 视频旋转接口

java
public void rotate(int angle)

描述

该接口通知播放器需要对视频进行旋转显示。

该接口涉及Airplay镜像投屏。

参数

angle:取值范围为为0,90,180,270。表示旋转角度。

注意事项

当3.1.2的init接口初始化时“rotation”属性设定为1时,该接口在Airplay镜像投屏时才会被触发。通常播放器可以选择TextureView,可方便的支持旋转处理。

3.3.8 视频格式参数回调接口

java
public void onNotifyMirrorVideoCodecPara(int width,int height,byte[] buffer,int len)

描述

该接口通知屏幕镜像码流的分辨率信息,SPS/PPS信息,用于初始化解码器。大部分用户不需要实现此接口。但部分硬件平台创建MediaCodec解码器时,必须指定正确的宽/高,否则会解码失败。

该接口在Airplay镜像投屏的以下场景会触发:

  1. 刚接收到码流的第一个关键帧。
  2. 发生分辨率变化时,如屏幕横竖屏切换。

该接口涉及Airplay镜像投屏。

参数

名称描述
width视频的宽
height视频的高
bufferSPS/PPS数据
lenSPS/PPS数据的长度

注意事项

大部分用户不需要实现此接口。但部分硬件平台(如高通某车机平台)创建MediaCodec解码器时,必须指定正确的宽/高创建MediaCodec,否则会解码失败。

此接口从cast_base_lib-1.0.53-release.aar,Airplay 1.0.91版本开始支持。

3.3.9 视频URL播放暂停接口

java
public void pause()

描述

该接口通知播放器暂停视频播放。

该接口涉及Airplay URL投屏播放场景(常见于视频软件的投TV功能中选择Airplay的方式触发)。

通知播放器暂停播放,通常可由发射端触发;也可由接收端界面上用户进行暂停操作触发。

调用示例

请参考demo代码中AirplayUrlPlayChannel中的实现。

3.3.10 视频URL播放继续播放接口

java
public void play()

描述

该接口通知播放器开始或对处于暂停状态的视频继续视频播放。

该接口涉及Airplay URL投屏播放场景(常见于视频软件的投TV功能中选择Airplay的方式触发)。

调用示例

请参考demo代码中AirplayUrlPlayChannel中的实现。

3.3.11 视频URL播放SEEK接口

java
public void seek(int sec)

描述

SDK回调接口,通知播放器进度条拖放到的位置,单位为秒。此时播放器需按照进度条位置进行SEEK操作。

该接口涉及Airplay URL投屏播放场景(常见于视频软件的投TV功能中选择Airplay的方式触发)。

参数

sec: 表示进度条拖拉定位到的播放位置。单位为秒。

调用示例

请参考demo代码中AirplayUrlPlayChannel中的实现。

3.3.12 获取URL播放器当前播放位置接口

java
public int getPts()

描述

SDK回调接口,SDK获取当前播放器当前播放到的位置。单位为毫秒。

该接口涉及Airplay URL投屏播放场景。

返回值

当前播放器当前播放到的位置。单位为毫秒。

调用示例

请参考demo代码中AirplayUrlPlayChannel中的实现。

3.3.13 获取URL视频总时长

java
public int getDuation()

描述

SDK回调接口,SDK获取当前播放器播放的视频URL的总时长。单位为毫秒。

该接口涉及Airplay URL投屏播放场景。

返回值

当前播放的视频URL的时长。单位为毫秒。

调用示例

请参考demo代码中AirplayUrlPlayChannel中的实现。

3.3.14 视频URL播放器当前的状态

java
public int getPlayerStatus();

描述

SDK内部会获取播放器当前的实际状态。客户需要正确实现该接口,并返回当前播放器的状态。参考demo中的实现。

该接口涉及Airplay URL投屏播放场景。

返回值:

当前播放器播放状态。

取值范围在MediaConst类中定义为:

java
public static final int PLAYER_STATUS_LOADING = 0;
public static final int PLAYER_STATUS_PLAYING = 1;
public static final int PLAYER_STATUS_PAUSED = 2;
public static final int PLAYER_STATUS_ENDED = 3;
public static final int PLAYER_STATUS_FAILED = 4;

其含义描述如下:

LOADING: 表示在加载中,初始化播放器,播放器在加载资源中的时候会出现。

PLAYING:播放中

PAUSED:暂停中

ENDED:播放结束

FAILED:播放失败

调用示例

请参考demo代码中AirplayUrlPlayChannel中的实现。

3.4 License授权校验错误码说明

错误码值说明
801输入deviceId 无效
802proGuardSalt输入无效
803proGuardMode输入无效
804服务器返回值为空(请检查网络是否正常)
810获取本地 deviceId 地址失败
811输入的deviceId无法通过验证(请检查本地设备初始化是否正常)
812license 申请结果异常, 请检查网络状态
1001license_check_token校验失败,包名不匹配
1002license_check_token校验失败
1003license_check_pass密码校验失败
1004license_check_token校验失败,非法的校验类型
-101无法获取deviceId
-102无法获取硬件信息
-103检验deviceId失败
-104校验硬件信息失败
-105SDK类型不一致
-106授权(license Key)已过期
-107无法解析license
-108license Key解析错误, 请检查 license 是否读取成功,申请license过程是否出现异常
-109license Key为空
-110平台类型不匹配(SDK用于windows, android平台必须匹配)
-111productId不匹配

4 混淆规则

4.1 混淆规则

Android APP集成该SDK时,混淆规则方面请加入以下规则。

-keepclasseswithmembernames class * {
    native <methods>;
}
-keep class com.bjnet.cbox.module.* { *; }
-keep class com.bjnet.cbox.util.Log { *; }

5 AirplayDemo简要说明

5.1 AirplayDemo简要说明

AirplayDemo是一个演示SDK使用的Android APP。SDK和源码请联系我司商务或技术接口获取。

Demo中AirplayModuleImp实现了ModuleImpItf接口,实现了reqMediaChannel,relMediaChannel方法,此处可以控制是否接入某个会话的逻辑控制(如最大接入2路这样的控制)。其中reqMediaChannel中创建了与会话类型对应的MediaChannel实现,并启动播放相关的View,创建用于播放的Surface。

AirplayMirrorChannel, AirplayAudioChannel, AirplayUrlPlayChannel分别对应airplay镜像投屏,纯音频投屏,视频URL播放这几种业务类型,实现了MediaChannel中相关功能接口。用户可参考实现。

6 客户如何使用SDK

6.1 集成简要说明

  1. 导入aar,在app目录下新建libs目录并将aar文件放在该目录下,然后在build.gradle(app)中dependencies上方及内部分别添加如下代码:repositories{ flatDir { dirs ’libs ’} },compile (name: ‘bj_airplay_lib-1.0.91-release.aar’, ext: ‘aar’) compile (name: ‘cast_base_lib-1.0.53-release.aar’, ext: ‘aar’),可参考Demo。

  2. 实现ModuleImpItf接口,参考AirplayModuleImp。reqMediaChannel接口返回自定义的MediaChannel实现类的实例,并启动播放界面

  3. 实现MediaChannel相关功能接口,参考AirplayMirrorChannel, AirplayAudioChannel, AirplayUrlPlayChannel。

    实现自身的播放界面,可参考demo代码中view这个package中的view的实现,将播放界面的Surface设置到MediaChannel中。

  4. 混淆规则请参考第4章的设置