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章的设置