Skip to content

当前版本: V1.1.0 苏州必捷网络有限公司

1 概述

1.1 目的

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

1.2 读者对象

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

1.3 缩略语定义

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

2 范围

2.1 功能

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

本SDK为标准的windows动态链接库,供应用集成。

2.2 SDK框架

BJAirplay Receiver SDK总体分为两部分:

  • include下的头文件,定义了关键数据结构,和功能接口。供用户直接参考。
  • lib下的动态库文件,bj_airplay_lib.dll实现了Airplay基本功能,license_apply.dll提供license获取功能。

2.3 SDK的DEMO实现

  • BJAirplayReceiver SDK Demo是接收端的一个参考实现,它基于bj_airplay_lib.dll实现了Airplay接收端功能。其中bj_airplay_callback_imp实现了回调接口。

  • log实现自定义日志。airplay_player_mgr实现Airplay的控制。main.cpp演示了license 获取和程序初始化。

2.4 SDK交付物

  • SDK库
  • DEMO源代码
  • SDK接口文档

3 接口

接口主要在bj_airplay.h头文件中定义,包括控制接口和回调接口。

其中,回调接口定义在BJAirplayFunctionCbs_t结构体中,需由用户程序实现。

3.1 控制接口说明

3.1.1 初始化接口

C
int InitBJAirplay(AirplayInitPara* initpara);

描述

初始化BJAirplay SDK,App在启动做初始化时调用。

参数

AirplayInitPara: 为SDK初始化属性集合,initpara为AirplayInitPara结构体类型。通过赋值的方式初始化SDK的参数。

其中initpara常用属性的设置说明如下:

属性名描述必填
friendly_nameAirplay接收端的显示名称,即在iPhone/IPad等设备搜索到的Airplay接收端的名称
framerate镜像投屏的最大帧率。取值范围15-60; >60会设置为60 <15会设置为15
resolution_typeresolution_type 取值范围参考: 6.4 BJAirResolutionType
password投屏密码
licenseKeyLicense信息,从License文件中读取
mac_addr接收端设备的mac地址,格式:00:26:b9:52:7b:e0
airplay_flags位域类型,参考BJ_AIRPLAY_FLAGS定义
max_session_numsSDK支持的最大Airplay投屏路数,1-9。默认为4。根据实际情况进行设置。通常设为1,代表同时支持1路投屏。注意:如果要支持抢投,则需要设置比实际最大路数多1。
republish_modemdns发布方式。取值范围参考: 6.5 BJAirRepublishType
log_level日志级别。取值范围参考: 6.8 BJAirplayLogLevel
no_url_type仅在 airplay_flags 中含有BJ_AIRPLAY_SUPPORT_URL_FLAG时有意义,设置为0即可,其它取值请与必捷SDK方沟通
callback用户回调接口,需要由用户来实现
airplay_portAirplay内部Airplay服务监听端口,默认7002
mirror_port镜像投屏数据接收端口,默认7100
airtunes_portAirplay ROAP协议使用的端口,默认7202
enable_aac_decode是否开启AAC解码,音频AAC解码为PCM
enable_deamon_mdns启用mdns守护进程,仅在widows平台上有效

返回值

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

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

调用示例

C
AirplayInitPara initpara;
memset(&initpara,0,sizeof(AirplayInitPara));
strncpy(initpara.friendly_name, "bj_airplay_demo", sizeof(initpara.friendly_name));
strncpy(initpara.password, "1234", sizeof(initpara.password));
strncpy(initpara.mac_addr, mac, sizeof(initpara.mac_addr));
initpara.framerate = 30;
initpara.resolution_type = BJAir_Resolution_1080P;
initpara.max_session_nums = 6;
initpara.airplay_flags = BJ_AIRPLAY_SUPPORT_MBNAUL_FLAG | BJ_AIRPLAY_SUPPORT_SPSPPSNAUL_FLAG | BJ_AIRPLAY_ENABLE_FASTCONN_FLAG;
initpara.republish_mode = BJAir_RepublishType_Normal;
initpara.no_url_type = 0;
initpara.enable_deamon_mdns = true;

initpara.callback.OnStartMirrorPlayer = BJAirplayCallbackImp::OnStartMirrorPlayer;
initpara.callback.NotifyMirrorAudioCodecInfo = BJAirplayCallbackImp::NotifyMirrorAudioCodecInfo;
initpara.callback.OnMirrorAudioData = BJAirplayCallbackImp::OnMirrorAudioData;
initpara.callback.OnMirrorVideoData = BJAirplayCallbackImp::OnMirrorVideoData;
initpara.callback.OnRotateMirrorVideo = BJAirplayCallbackImp::OnRotateMirrorVideo;
initpara.callback.OnStopMirrorPlayer = BJAirplayCallbackImp::OnStopMirrorPlayer;
initpara.callback.RefreshCoverArtFromBuffer = BJAirplayCallbackImp::RefreshCoverArtFromBuffer;
initpara.callback.SetVolume = BJAirplayCallbackImp::SetVolume;
initpara.callback.RefreshTrackInfo = BJAirplayCallbackImp::RefreshTrackInfo;

initpara.callback.OnStartAudioPlayer = BJAirplayCallbackImp::OnStartAudioPlayer;
initpara.callback.OnAudioData = BJAirplayCallbackImp::OnAudioData;
initpara.callback.OnStopAudioPlayer = BJAirplayCallbackImp::OnStopAudioPlayer;
initpara.callback.NotifyAudioCodecInfo = BJAirplayCallbackImp::NotifyAudioCodecInfo;

initpara.callback.OnStartVideoPlayback = BJAirplayCallbackImp::OnStartVideoPlayback;
initpara.callback.OnStopVideoPlayback = BJAirplayCallbackImp::OnStopVideoPlayback;
initpara.callback.OnPauseVideoPlayback = BJAirplayCallbackImp::OnPauseVideoPlayback;
initpara.callback.OnResumeVideoPlayback = BJAirplayCallbackImp::OnResumeVideoPlayback;
initpara.callback.OnSeekVideoBySec = BJAirplayCallbackImp::OnSeekVideoBySec;
initpara.callback.OnGetVideoPositionMSec = BJAirplayCallbackImp::OnGetVideoPositionMSec;
initpara.callback.OnGetVideoDurationMSec = BJAirplayCallbackImp::OnGetVideoDurationMSec;
initpara.callback.OnGetVideoPlayerStatus = BJAirplayCallbackImp::OnGetVideoPlayerStatus;

initpara.callback.OnStartPhotoPlayer = BJAirplayCallbackImp::OnStartPhotoPlayer;
initpara.callback.OnPlayPhoto = BJAirplayCallbackImp::OnPlayPhoto;
initpara.callback.OnStopPhotoPlayer = BJAirplayCallbackImp::OnStopPhotoPlayer;

initpara.callback.OnShowPinCode = BJAirplayCallbackImp::OnShowPinCode;
initpara.callback.OnVerifyPinSuccess = BJAirplayCallbackImp::OnVerifyPinSuccess;
initpara.callback.OnProbePlayerAbility = BJAirplayCallbackImp::OnProbePlayerAbility;
initpara.callback.OnDeviceConnect = BJAirplayCallbackImp::OnDeviceConnect;
initpara.callback.OnDeviceDisConnect = BJAirplayCallbackImp::OnDeviceDisConnect;
initpara.callback.LogFun = defaultTrace;
int res = InitBJAirplay(&initpara);
if (res){
      TRACE_ERR("InitBJAirplay failed");
   }

注意事项

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

3.1.2 去初始化接口

C
void UninitBJAirplay();

描述

用于去初始化Airplay模块。App销毁Airplay接收端服务时调用。

3.1.3 更新投屏密码接口

C
int SetAirplayPassword(const char *password);

描述

更新Airplay投屏密码。空字符串表示禁用投屏密码,其他有效字符串表示投屏密码。

参数

password: 为当前投屏密码。

返回值

0: 成功

其他: 失败

注意事项

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

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

C
void  KickOut(uint32_t playerId);

描述

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

参数

playerId: 为播放会话ID。

注意事项

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

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

C
void ServiceRename(const char* name);

描述

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

参数

name: 为Airplay接收端的名称。

3.1.6 显示或隐藏服务发现

C
void ServiceSetDiscoverable(bool flag);

描述

使服务隐藏对用户不可见或使服务显示对用户可见。

参数

flag: true:显示 false:隐藏。

3.2 回调接口说明

回调接口需要用户去实现这些接口。

3.2.1 设备接入回调接口

C
int(*OnDeviceConnect)(const BJAirPlaySenderConnInfo* sender_conn_info);

描述

回调接口。由用户根据实际情况重载实现。

用户发起投屏会话时通知设备连接触发该接口,应用可根据sender_conn_info中信息获取发射端的信息进行对应处理。

参数

sender_conn_info: 发射端设备信息。参考: 6.7 BJAirPlaySenderConnInfo。

返回值

0: 允许接入;

1: 直接断开连接。

注意事项

若输PIN码会调用多次该接口。

3.2.2 设备断开回调接口

C
void(*OnDeviceDisConnect)(const char* ip);

描述

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

参数

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

注意事项

若输入PIN码会调用多次该接口。

3.2.3 开始镜像投屏播放接口

C
int32_t (*OnStartMirrorPlayer)(uint32_t playerId, const char* ip, const char* device_model, const char* device_name);

描述

回调接口。当用户发起镜像投屏或URL播放回到镜像播放等场景会触发该接口。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
ip发射端设备的IP地址
device_model发射端设备的设备型号,如iPhone6
device_name发射端的设备名称

返回值

0: 应用层播放成功; 其他: 应用层播放失败,SDK内部会结束该会话。

注意事项

应用需要记住playerId,由playerId参数来维护镜像会话,后续相关接口都通过该字段进行关联。

3.2.4 通知镜像音频解码信息接口

C
void (*NotifyMirrorAudioCodecInfo)(uint32_t playerId, int32_t bitsdep, int32_t channels, int32_t sampleRate);

描述

回调接口。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
bitsdep音频位域信息,默认16
channels声道数,固定为2,表示双声道
sampleRate采样率,固定为44100

3.2.5 通知应用镜像音频数据接口

C
uint32_t(*OnMirrorAudioData)(uint32_t playerId, const uint8_t *p_src, uint32_t size, int64_t ptsValue);

描述

回调接口。镜像投屏过程中,SDK收到音频数据后会进行解码,并调用该接口通知应用层已经解码的PCM音频数据。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
p_src指向音频数据块的指针
size音频数据块的长度
ptsValue音频数据对应的时间戳,时间戳单位为1/1000000秒

返回值

uint32_t: 复制的音频数据长度,单位: 字节。

注意事项

应用收到音频数据后应进行解码播放,同时需要根据时间戳与音频做同步控制。

3.2.6 通知应用镜像视频数据接口

C
uint32_t(*OnMirrorVideoData)(uint32_t playerId, const uint8_t *p_src, uint32_t size, int64_t ptsValue);

描述

回调接口。镜像投屏过程中,SDK收到视频数据后会调用该接口通知应用层收到H264视频数据。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
p_src指向视频数据块的指针
size视频数据块的长度
ptsValue视频数据对应的时间戳,时间戳单位为1/1000000秒

返回值

uint32_t: 复制的视频数据长度,单位: 字节。

注意事项

应用收到视频数据后应进行解码并播放,同时需要根据时间戳与视频做同步控制。

3.2.7 镜像视频解码参数通知接口

C
void (*OnNotifyMirrorVideoCodecPara)(uint32_t playerId,int w, int h,const uint8_t *p_src, uint32_t size);

描述

回调接口。通知镜像视频解码参数。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
w视频宽度
h视频高度
p_src指向视频数据块的指针
size视频数据块的长度

注意事项

在视频分辨率变化时调用。

3.2.8 镜像播放视频旋转角度通知接口

C
void(*OnRotateMirrorVideo)(uint32_t playerId, int angle);

描述

回调接口。当IPAD/IPHONE等终端旋转时,SDK会调用该接口通知旋转角度。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
angle视频旋转角度,可能取值范围为0,90,180,270。所有角度为顺时针方向角度

注意事项

要触发此回调需要在初始化时设置BJ_AIRPLAY_SUPPORT_ROTATION_FLAG标志,应用收到该回调事件后,播放器需要根据该角度来处理旋转,才能正确显示视频。

3.2.9 停止镜像播放接口

C
void(*OnStopMirrorPlayer)(uint32_t playerId);

描述

回调函数。当用户停止镜像投屏或由镜像投屏切换到URL播放等场景时,会触发该接口。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

注意事项

应用需要释放该会话相关资源。

3.2.10 设置音量接口

C
void(*SetVolume)(uint32_t playerId, int volumePercent);

描述

回调接口。当用户调整音量时会触发该接口。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
volumePercent音量值,0: 静音,100: 音量最高

3.2.11 开始纯音频播放接口

C
int32_t(*OnStartAudioPlayer)(uint32_t playerId, const char* ip, const char* device_model, const char* device_name);

描述

回调接口。当用播放纯音频数据的时候会触发该接口。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
ip发射端设备的IP地址
device_model发射端设备的设备型号,如iPhone6
device_name发射端设备的设备名称

返回值

0: 应用层开始播放成功。

其他: 应用层播放失败,SDK内部会结束该会话。

注意事项

应用需要记住playerId,由playerId参数来维护会话,后续相关接口都通过该字段继续关联。

3.2.12 音频播放时封面图片刷新接口

C
void(*RefreshCoverArtFromBuffer)(uint32_t playerId, const uint8_t *p_src, int size);

描述

回调接口。音频播放时,当前播放的音乐的封面图片,JPEG格式。

参数

名称描述
playerId播放会话Id(该ID由SDK内部统一分配,全局唯一)
p_srcJPEG图片内容
sizeJPEG图片长度

注意事项

应用应该将图片内容做持久化的文件并进行呈现。

3.2.13 通知音频播放时的元数据信息接口

C
void(*RefreshTrackInfo)(uint32_t playerId, const char* album, const char* title, const char* artist);

描述

回调函数。当音频播放时,通知播放器,该音频的相关元数据。

参数

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

注意事项

该接口不是必须的。

3.2.14 通知应用音频播放数据接口

C
uint32_t(*OnAudioData)(uint32_t playerId, const uint8_t *p_src, uint32_t size, int64_t ptsValue);

描述

回调接口。纯音频投屏过程中,SDK收到音频数据后会进行解码,并调用该接口通知应用层已经解码的PCM音频数据。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
p_src指向视频数据块的指针
size视频数据块的长度
ptsValue视频数据对应的时间戳,时间戳单位为1/1000000秒

返回值

uint32_t: 复制的数据长度,单位: 字节

注意事项

应用收到音频数据后应进行解码并播放,同时需要根据时间戳与音频做同步控制。

3.2.15 停止纯音频播放接口

C
void(*OnStopAudioPlayer)(uint32_t playerId);

描述

回调接口。停止镜像播放会话,当用户停止镜像投屏或由镜像投屏切换到URL播放等场景会触发该接口。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

注意事项

应用需要释放该会话相关资源。

3.2.16 通知音乐播放时音频数据的格式接口

C
void(*NotifyAudioCodecInfo)(uint32_t playerId, int32_t bitsdep, int32_t channels, int32_t sampleRate);

描述

回调接口。当音频播放时,通知播放器音频数据的格式。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
bitsdep音频位域,默认16
channels声道数,默认2,表示双声道
sampleRate采样率,默认44100

3.2.17 开始URL视频播放会话接口

C
int32_t(*OnStartVideoPlayback)(uint32_t playerId, const char* ip, const char *url);

描述

回调接口。URL视频播放会话开始时SDK会调用。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
url要播放的视频URL

返回值

0: 应用层开始播放成功 其他: 应用层播放失败,SDK内部会结束该会话

3.2.18 结束URL视频播放会话接口

C
void(*OnStopVideoPlayback)(uint32_t playerId);

描述

回调接口。URL视频播放会话结束时SDK会调用。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

注意事项

应用应当释放播放器等相关资源。

3.2.19 暂停URL视频播放会话接口

C
void(*OnPauseVideoPlayback)(uint32_t playerId);

描述

回调接口。在URL视频暂停播放时SDK会调用。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

注意事项

应用应暂停播放。

3.2.20 恢复URL视频播放会话接口

C
void(*OnResumeVideoPlayback)(uint32_t playerId);

描述

回调接口。在URL视频恢复播放时SDK会调用。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

注意事项

暂停后继续播放。

3.2.21 URL视频播放Seek接口

C
void(*OnSeekVideoBySec)(uint32_t playerId, int64_t position_sec);

描述

回调接口。拖动视频进度条时SDK会调用。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一);

position_sec: 播放位置。

返回值

int32_t: 当前播放器所播放到的位置,单位: 秒

3.2.22 获取播放器URL播放视频当前所处的位置接口

C
int32_t(*OnGetVideoPositionMSec)(uint32_t playerId);

描述

回调接口。SDK需要获悉当前URL播放的视频的位置时会调用。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

返回值

int32_t: 当前播放器所播放到的位置,单位: 毫秒。

3.2.23 获取当前播放器播放状态接口

C
int32_t(*OnGetVideoPlayerStatus)(uint32_t playerId);

描述

回调接口。SDK会要获悉当前播放器播放状态时会调用。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

返回值

int32_t: 取值范围参考 6.2 BJAirPlayerStatus

3.2.24 获取URL总时长接口

C
int32_t(*OnGetVideoDurationMSec)(uint32_t playerId);

描述

回调接口。SDK需要获悉URL播放的视频的总时长时会调用。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

返回值

int32_t: URL视频的总时长,单位: 毫秒

3.2.25 开始播放照片接口

C
int32_t(*OnStartPhotoPlayer)(uint32_t playerId, const char* ip);

描述

回调接口。播放照片时SDK会调用。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
ip发射端设备的IP地址

返回值

0: 播放成功 其他: 播放失败

注意事项

iOS9以前系统支持。

3.2.26 播放照片接口

C
void(*OnPlayPhoto)(uint32_t playerId, const uint8_t* picData, int size);

描述

回调接口。正在播放照片时SDK调用,通知播放器当前播放的照片信息。

参数

名称描述
playerId播放会话ID(该ID由SDK内部统一分配,全局唯一)
picData指向图片数据的指针
size数据的大小

注意事项

IOS9以前系统支持。

3.2.27 结束播放照片接口

C
void(*OnStopPhotoPlayer)(uint32_t playerId);

描述

回调接口。结束播放照片时SDK会调用。

参数

playerId: 播放会话ID(该ID由SDK内部统一分配,全局唯一)。

注意事项

IOS9以前系统支持。

3.2.28 显示PIN码接口

C
void(*OnShowPinCode)(const char* ip,const char* pincode);

描述

回调接口。SDK在显示PIN码时会调用。

参数

名称描述
ipIP地址
pincodePIN码

3.2.29 PIN码验证成功接口

C
void(*OnVerifyPinSuccess)(const char* ip);

描述

回调接口。PIN码验证成功时SDK会调用。

参数

ip: IP地址。

3.2.30 获取发射端能力接口

C
void(*OnProbePlayerAbility)(const char* ip, BJAirPlayAbility* const ability);

描述

回调接口。当某个发射端发起投屏时,SDK会调用该接口,获取最大帧率和分辨率参数。

参数

名称描述
ipIP地址
ability参考结构体 6.6 BJAirPlayAbility

3.2.31 自定义日志接口

C
void(*LogFun)(unsigned int level, const char *format,  va_list argp);

描述

回调接口。用户自定义日志打印细节的函数接口,SDK会优先调用该接口。

参数

名称描述
level日志等级
format格式化方式
argp参数列表

3.2.32 已连接发射端设备信息接口

C
void(*BJAirPlaySenderConnInfo)(const char* ip, const BJAirPlaySenderConnInfo* conn_info);

描述

回调接口。AirPlay 连接的发射端的设备信息。

参数

名称描述
ipIP地址
conn_info参考 6.7 BJAirPlaySenderConnInfo

3.3 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,Linux平台必须匹配)
-111productId不匹配

4 关键数据结构

4.1 Airplay错误码

C
typedef enum
{
    BJ_AIRPLAY_ERROR_SUCCESS = 0,
	BJ_AIRPLAY_ERROR_PORT_BINDERROR,
	BJ_AIRPLAY_ERROR_INIT_FAILED,
	BJ_AIRPLAY_ERROR_INIT_RAOP_FAILED,
	BJ_AIRPLAY_ERROR_BUTTON
}BJAirplayErrorCode;

4.2 播放状态

C
typedef enum
{
    BJ_PLAYER_STATUS_LOADING = 0, //正在加载
    BJ_PLAYER_STATUS_PLAYING,     //正在播放
    BJ_PLAYER_STATUS_PAUSED,      //暂停状态
    BJ_PLAYER_STATUS_ENDED,       //播放结束
    BJ_PLAYER_STATUS_FAILED,      //播放失败
}BJAirPlayerStatus;

4.3 功能支持标识

C
#define BJ_AIRPLAY_SUPPORT_ROTATION_FLAG (0x00000001)     //支持旋转
#define BJ_AIRPLAY_SUPPORT_URL_FLAG (0x00000002)          //支持URL播放
#define BJ_AIRPLAY_SUPPORT_MBNAUL_FLAG (0x00000004)       //启用MBNAUL 实时写入
#define BJ_AIRPLAY_DISABLE_MBNAUL_FLAG (0x00000008)       //禁用MBNAUL 仅在完整帧就绪时才写入数据
#define BJ_AIRPLAY_SUPPORT_SPSPPSNAUL_FLAG (0x00000010)   //SPS/PPS作为独立的NAUL发送 
#define BJ_AIRPLAY_ENABLE_FASTCONN_FLAG (0x00000020)      //启用快速连接(ios14以上支持)

注意事项 启用NAUL会导致网络包数量增加,但是会降低首帧延迟。

4.4 分辨率

C
typedef enum
{
    BJAir_Resolution_1080P = 0,
    BJAir_Resolution_720P = 1,
    BJAir_Resolution_800x600 = 2,
    BJAir_Resolution_1600x900 = 3,
    BJAir_Resolution_2560x1440 = 4,
    BJAir_Resolution_3840x2160 = 5,
    BJAir_Resolution_Button
}BJAirResolutionType;

注意事项 当前不支持2K及以上分辨率。

4.5 发布方式

C
typedef enum
{
    BJAir_RepublishType_Normal = 0,                //mdns消息发布一次
    BJAir_RepublishType_Remove_And_Publish = 1,    //mdns消息定时更新
    BJAir_RepublishType_Button
}BJAirRepublishType;

4.6 播放能力

C
typedef struct BJAirPlayAbility
{
    int maxFPS;             //最大fps
    int resolution_type;    //取值范围参考: 6.4 BJAirResolutionType
}BJAirPlayAbility;

4.7 发射端设备信息

C
typedef struct BJAirPlaySenderConnInfo
{
    const char* name;      //设备名称 ex:iPhone8
    const char* model;     //设备型号 ex:iPhone10,1
    const char* mac;       //设备mac地址 ex:C2:87:12:0A:88:83
    const char* ip;        //设备ip ex:192.168.10.66
    const char* osName;    //系统名称 ex:iPhone OS
    const char* osVersion; //系统版本 ex:15.5
};

4.8 日志等级

C
typedef enum {
    BJAir_LOG_CRIT = 1,
    BJAir_LOG_ERROR,
    BJAir_LOG_WARN,
    BJAir_LOG_INFO,
    BJAir_LOG_DEBUG,
    BJAir_LOG_DETAIL,
    BJAir_LOG_MAX,
}BJAirplayLogLevel;

4.9 初始化参数

C
typedef struct
{
    char friendly_name[128];           //Airplay接收端的显示名称,即在iPhone/IPad等设备搜索到的Airplay接收端的名称
    int  framerate;                    //取值范围15-60; >60会设置为60  <15会设置为15
    int  resolution_type;              //resolution_type 取值范围参考: 6.4 BJAirResolutionType
    char password[256];                //投屏密码
    char licenseKey[1024];             //License信息,从License文件中读取
    char mac_addr[32];                 //格式:00:26:b9:52:7b:e0
    int airplay_flags;                 //参考BJ_AIRPLAY_FLAGS定义,位域类型
    int max_session_nums;              //最大nums 取值范围1-9
    int republish_mode;                //mdns发布模式,取值范围参考: 6.5 BJAirRepublishType
    int log_level;                     //日志级别,取值范围参考BJAirplayLogLevel
    int no_url_type;                   //仅在 airplay_flags 中含有BJ_AIRPLAY_SUPPORT_URL_FLAG时有意义,设置为0即可,其它取值请与必捷SDK方沟通
    BJAirplayFunctionCbs_t callback;   //用户回调接口,需要由用户来实现
    int  airplay_port;                 //默认7002
    int  mirror_port;                  //默认7100
    int  airtunes_port;                //默认7202
    bool enable_aac_decode;            //是否开启AAC解码,音频AAC解码为PCM
    bool enable_deamon_mdns;           //启用mdns守护进程,仅在widows平台上有效
}AirplayInitPara;

5 Airplay Demo简要说明

bj_airplay_sdk_demo 是一个演示SDK使用的Windows 可执行程序。SDK和源码请联系我司商务或技术接口获取。 Demo中演示了各个控制接口的调用方法,并提供了获取license的示例方法。

6 客户如何使用SDK

6.1 集成简要说明

  1. 将include下的头文件和lib下的动态库文件添加到工程目录下。
  2. 编译过程中一定要配置成MT模式。
  3. 实现回调函数,创建AirplayInitPara结构体并填充。
  4. 实现自身播放器功能。