1 Airplay SDK Overview
1.1 Purpose
Used to guide developers who use the BiJie Airplay receiver SDK for development and testing。
1.2 Readers
This document is intended for developers who develop Airplay receivers on the Android platform.
1.3 Airplay from Apple
abbreviations | ||
---|---|---|
Airplay | Wireless Communication Technology developed by Apple, support in iOS and MacOS |
2 Scope
2.1 Feature
The SDK can accept Airplay mirror from iPhone, iPad and imac which run iOS and MacOS. It can also support Android phones/PCs that use Mirror360 for Airplay screen projection processing, and provide an interface to the application layer for call processing.
2.2 SDK Framework
The BJAirplay Receiver SDK is generally divided into two layers
cast_base_lib-1.0.20-release.aar
:it’s an Android Module,It defines the basicMediaChannel
,and the Module interface.bj_airplay_lib-1.0.22-release.aar
:This is an Android module that defines theAirplayModule
and related JNI interfaces.
The application should be developed based on bj_airplay_lib-1.0.22-release.aar
. The applications in principle should not modify the contents of cast_base_lib-1.0.20-release.aar
, bj_airplay_lib-1.0.22-release.aar
.
2.3 DEMO Implementation of SDK
The Airplay Receiver SDK Demo is a reference implementation of the receiver. It implements the Airplay receiver function based on bj_airplay_lib-1.0.17-release.aar
.
AirplayModuleImp
implements theModuleImpItf
interface.AirplayMirrorChannel
implements theMediaChannel
interface, which implements the processing of Airplay mirror sessions.AirplayAudioChannel
implements theMediaChannel
interface, which implements the processing of Airplay audio sessions.AirplayUrlPlayChannel
implements theMediaChannel
interface, which implements the processing of Airplay URL playback sessions.
2.4 SDK Deliverables
SDK library (two AAR files)
DEMO source code
SDK interface documentation
3 Interface
The interface is mainly defined in the AirplayModule
, ModuleImpItf
and MediaChannel
classes;
The
AirplayModule
class provides interfaces such as initializing the SDK, to initialize the SDK, and forcing a session to end.ModuleImpItf
is an interface class that needs to be implemented by the user. The SDK uses this interface class to notify the user program of the start and end of the Airplay screencast session. The user program needs to create correspondingMediaChannel
implementation classes and corresponding player applications based on different session types .MediaChannel
is an interface class that needs to be implemented by a user program. The SDK uses this interface class to notify applications of audio and video data, volume control, video rotation and other control events, and the application processes them in the corresponding player.Users need to implement
MediaChannel
,ModuleImpItf
related interfaces, and can also refer to the DEMO source code provided by our company.
3.1 Interface in AirplayModule class
3.1.1 Set the Custom Module Implementation Class Interface for the Customer
public void setImp(ModuleImpItf imp)
INPUT:
User-implemented
ModuleImpItf
interface instance.
3.1.2 Initialize the Interface
public native int init(Properties props);
The Init method of the AirplayModule
class initializes the Airplay receiver module. The App is called at startup initialization, and the AirplayModule
object should be designed to have only one global object
Where Properties supports the setting of the following Properties:
PARA_NAME_DEVICE_NAME
: receiver name, Airplay receiver display name.PARA_NAME_PASSWORD
: initial PIN code, default empty string, enter empty string if PIN code is not supported.PARA_NAME_KEY_ROTATION
: does the mirror play support rotation, ranging from0
to1
. The default is1
PARA_NAME_MDNS_DEAMON_ENABLE
: whether to enable internal MDNSD for publishing the Airplay service, with a value of 0,1.The default is
1
. It is recommended that the user fill in1
here.Please note: if the receiver APP runs both the
BJAirplay
receiver and the BJCast receiver,then only set
PARA_NAME_MDNS_DEAMON_ENABLE
to1
in one module,and the other must be set to
0
.If both modules are initialized with this parameter of
1
, one of the services will fail to publish.The return value:
public static final int
BJ_AIRPLAY_ERROR_SUCCESS
= 0, ///successpublic static final int
BJ_AIRPLAY_ERROR_PORT_BINDERROR
= 1; ///Failed initialization, Airplay port binding failedpublic static final int
BJ_AIRPLAY_ERROR_INIT_FAILED
=2; ///Failed initializationpublic static final int
BJ_AIRPLAY_ERROR_INIT_RAOP_FAILED
= 3; ///Failed initialization,Raop port binding failedpublic static final int
BJ_AIRPLAY_ERROR_VERIFY_GET_MAC_ERROR
= -101; ///License check failed,Unable to get a valid MAC addresspublic static final int
BJ_AIRPLAY_ERROR_VERIFY_GET_HARDINFO_ERROR
= -102; ///License check failed,Unable to obtain valid hardware informationpublic static final int
BJ_AIRPLAY_ERROR_VERIFY_MAC_FAILED
= -103; ///License check failed,MAC address validation failedpublic static final int
BJ_AIRPLAY_ERROR_VERIFY_HARDINFO_FAILED
= -104; ///License check failed,Failed to verify hardware informationpublic static final int
BJ_AIRPLAY_ERROR_VERIFY_SDKTYPE_FAILED
= -105; ///License check failed,Not a legitimate Airplay Licensepublic static final int
BJ_AIRPLAY_ERROR_VERIFY_TIME_EXPIRED
= -106; ///License check failed,License expiredpublic static final int
BJ_AIRPLAY_ERROR_VERIFY_DECODELICENSE_FAILED
= -107; ///License check failed,Invalid license key, format errorpublic static final int
BJ_AIRPLAY_ERROR_VERIFY_OTHER_ERROR
= -108; ///License check failedpublic static final int
BJ_AIRPLAY_ERROR_VERIFY_ERROR_EMPTY_CLICENSE
= -109; ///License check failed,The license to be verified cannot be empty
3.1.3 Initialize the Interface
public native void fini();
Description: The
fini
method of theAirplayModule
class initializes the Airplay module. Called when the App destroys the Airplay receiver service.
3.1.4 Update the PIN Code Interface
public native void setPassword(String pass);
Description: Update Airplay PIN code. Empty string means PIN codes is disabled, and other valid strings represent PIN codes.
3.1.5 Force End Airplay Session Interface
public native void kickOut(MediaChannel channel);
Description: Channel creates the corresponding session for the
ModuleImpItf
,reqMediaChannel
.
3.1.6 Modify Airplay Receiver Name Interface in Real Time
public native void rename(String name);
3.2 ModuleImpItf Interface
ModuleImpItf
defines an interface class that requires users to implement these interfaces
3.2.1 Session Access Interface
public MediaChannel reqMediaChannel(MediaChannelInfo channelInfo,UserInfo userInfo) ;
INPUT:
Session information that describes its business type
ChannelInfo
describes the type information for the current session.userInfo
describes theIP
,device model
, anddevice name
of the transmitting end and other information.
OUTPUT:
The created
MediaChannel
object.This is a callback interface.
When the Airplay protocol stack finds that there is a session access, the JNI layer will actively call this interface.
The application layer needs to implement the relevant logic, which needs to be implemented in the client’s own
ModuleItf
implementation class.Specific implementation can refer to the DEMO source code.
3.2.2 Session End Interface
public void relMediaChannel(MediaChannel channel)
Callback interface, called when the bottom layer receives the end of the session. The application layer implements the relevant logic. Specific implementation can refer to the DEMO source code.
3.2.3 Projection Property Negotiation Interface
public void probeRenderAbility(Properties props);
Callback interface. When the bottom layer initiates a screen projection, this interface will be called for parameter negotiation. For example, negotiate the maximum frame rate of the current Airplay screencast session. Users can customize the interface to dynamically adjust the maximum frame rate of the session. For example: @Override
public void probeRenderAbility(Properties props){ // users can customize this function to achieve the maximum frame rate of Airplay screen casting session. Set the frame rate to 60 by referring to the following code
int framerate = 60; props.setProperty(AirplayModule.PARA_NAME_KEY_FRAMERATE,Integer.toString(framerate));
}
3.3 MediaChannel Session Interface
When the channel is successfully established, the protocol stack will call the corresponding interface in the MediaChannel
class to send back data or get the status.
The following interfaces need to be implemented in the MediaChannel
subclass. The client needs to implement the following interfaces according to their actual conditions.
The important interfaces in the MediaChannel
subclass are as follows.
Airplay receiver needs to focus on the following interfaces.
3.3.1 Setting the Window Handle
public void setSurface(Surface surface)
Configure the window handle for the render output. The Surface
is obtained from the player view created by the user. Refer to the implementation in Demo.
3.3.2 Callback of Audio Data Interface
public void onAudioFrame(byte[] buffer,int len,long ts)
INPUT:
buffer
: audio data byte arraylen
: length of audio datats
: timestamp (us)
Description: JNI takes back the audio data. The audio is PCM format data. The user needs to implement the playback processing function of the audio data. For the specific implementation, refer to the DEMO source code in the SDK. Where
buffer
is the audio data array,len
is the data length, andts
is the timestamp The interface relates to pure audio Airplay projection screen session and mirroring projection screen session
3.3.3 Update the Cover Information of Audio Playback Interface
public void onRefreshCoverArt(byte[] buffer,int len);
Description: JNI returns the music cover information in jpe format, buffer is the content of JPG, and len is the content length of JPG file. The interface relates to pure audio Airplay projection screen session.
3.3.4 Update the Song Information of Audio Play Interface
public void onRefreshTrackInfo(String album,String title,String artist)
Description: JNI returns the title of the music, the artist, the album information, the title as the title, the artist as the artist information, and the album as the album information (some application players actually transmit the lyrics). The interface relates to pure audio Airplay projection screen session.
3.3.5 Video Data Callback Interface
public void onVideoFrame(byte[] buffer,int len,long ts)
INPUT:
buffer
: video data byte arraylen
: the length of the video datats
: timestamp (in us)
Description: Mirror video data interface, the interface spits out a frame of
H264
video data, the user needs to decode and play.Where
buffer
is the array of video data,len
is the length of the data, andts
is the timestamp.Can refer to the implementation in Demo.
This interface involved while this is a Airplay mirroring session.
3.3.6 Volume Control Interface
public void setVolume(int volume)
INPUT:
volume
: the volume of the audio from iphone, the rage is0~100
. the100
means the volume is the highest.
Description: This interface involves while this is Airplay mirroring session or audio session.
3.3.7 Video Rotate Interface
public void rotate(int angle)
Description: This interface informs the player that the video needs to be rotated,value range is
0
,90
,180
,270
. While the init interface of 3.1.2 is initialized and the PARA_NAME_KEY_ROTATION is set to 1 , the interface is triggered while the Airplay mirror screen is cast. This interface involves while this is Airplay mirroring session
3.3.8 URL Pause Interface
public void pause()
Description: This callback function to notice the application to pause video play. This interface involves the Airplay URL play feature.
3.3.9 URL Play Interface
public void play()
Description: This callback function to notice the application to start or resume play video or audio. This interface involves the Airplay URL play feature.
3.3.10 URL Seek Interface
public void seek(int sec)
INPUT:
sec
: Notifies the player where the progress bar is dragged and dropped, the unit is second
Description: This callback function to notice the application that the seek position of the video or audio. This interface involves the Airplay URL play feature.
3.3.11 Obtain Position of URL
public int getPts()
OUTPUT:
int
: return the position of the play of video. The unit is millisecond.
Description: This interface involves the Airplay URL play feature.
3.3.12 Get length of URL
public int getDuation()
Description: Gets the length of the URL of the currently playing video. The unit is millisecond. This interface involves the Airplay URL play feature.
3.3.13 The Current State of the Video URL Player
public int getPlayerStatus();
Description: The SDK will display the current actual state of the player. The client needs to implement the interface correctly and return its status. Refer to the implementation in the demo. This interface involves the Airplay URL play feature. The return value range is defined in the MediaConst class as: public static final int
PLAYER_STATUS_LOADING
= 0; public static final intPLAYER_STATUS_PLAYING
= 1; public static final intPLAYER_STATUS_PAUSED
= 2; public static final intPLAYER_STATUS_ENDED
= 3; public static final intPLAYER_STATUS_FAILED
= 4; Its meaning is described as followsLOADING
: Means that during loading, initialization will occurPLAYING
: In the playPAUSED
: In the pauseENDED
: End of the playFAILED
Playback failed
4 Demo Description
4.1 Describer
In the Demo, AirplayModuleImp
implements the ModuleImpItf
interface, which implements the reqMediaChannel
and relMediaChannel
methods, where application can control whether to accept the logical control of a session(Such as maximum control of 2 channels).
The reqMediaChannel
creates a MediaChannel
implementation corresponding to the session type, and starts playing the related View to create a Surface for playback.
AirplayMirrorChannel
corresponds to the airplay mirror screen.
AirplayAudioChannel
corresponds to the pure audio projection screen.
AirplayUrlPlayChannel
corresponds to the video or audio URL playback scenario.
They all implement the relevant functional interfaces in MediaChannel
.
5 How to Use SDK
Import
aar
, create a new libs directory in the app directory and place theaar
file in the directory, then add the following code to above and inside thedependencies
inbuild.gradle
file ( user can refer to demo)
repositories{ flatDir { dirs 'libs '} }
compile (name: ‘bj_airplay_lib-1.0.22-release.aar’, ext: ‘aar’)
compile (name: ‘cast_base_lib-1.0.20-release.aar’, ext: ‘aar’),
Implement the
ModuleImpItf
interface, refer toAirplayModuleImp
. ThereqMediaChannel
interface returns an instance of theMediaChannel
, and launches the playback interface.Implement the
MediaChannel
related function interface, refer toAirplayMirrorChannel
,AirplayAudioChannel
,AirplayUrlPlayChannel
.To implement its playback interface, refer to the implementation of
AirplaySurfaceVideoView
in the view package, and set the Surface of the playback interface toMediaChannel
.
About BiJie
BiJie is a high-tech R&D enterprise focusing on the wireless display and interactive. It is committed to provide leading wireless display and interactive product and solution of smart meeting room and classroom.
BiJie can supply Wireless Display SDK such as Miracast, WiDi, Airplay, DLNA, Google Cast and BJCast.
At present, BiJie Networks has established cooperation with hundreds of well-known companies and institutions in the world, including Haier(SEHK: 1169) , JD.com(NASDAQ: JD) , 58.com(NYSE:WUBA), PetroChina(NYSE: PTR), MCC, Accenture(NYSE: ACN), Osram(FWB: OSR) and many other industry-level head enterprises.
About BiJie
BiJie is a high-tech R&D enterprise focusing on the wireless display and interactive. It is committed to provide leading wireless display and interactive product and solution of smart meeting room and classroom.
BiJie can supply Airplay SDK for Android and Windows and Linux which supports airplay from iOS and MacOS of Apple. You can download demo in here airplay sdk download
We also can supply SDKs of other Wireless Display protocols such as Miracast, DLNA, Google Cast.
At present, BiJie Networks has established cooperation with hundreds of well-known companies and institutions in the world, including Haier(SEHK: 1169) , JD.com(NASDAQ: JD) , 58.com(NYSE:WUBA), PetroChina(NYSE: PTR), MCC, Accenture(NYSE: ACN), Osram(FWB: OSR) and many other industry-level head enterprises.