Events can be listened by the FE apps inorder to understand more details about the Player. We have PlayerEvents, AdEvents and AnalyticsEvents.
-
App can import the events from our package,
import { PlayerEvents, AdEvents, AnalyticsEvents, } from 'kaltura-player-rn';
-
When you setup the player by calling
setup = async (playerType: PLAYER_TYPE, options: string, id: number = 0)
then after successful player setup, App should listen to the events, App should call the following method onKalturaPlayerAPI
,KalturaPlayerAPI.addListeners();
-
Now to listen to the Native Events, app should take help of
NativeEventEmitter
. App should takeKalturaPlayerEvents
fromNativeModules
.const kalturaPlayerEvents = NativeModules.KalturaPlayerEvents; const playerEventEmitter = new NativeEventEmitter(kalturaPlayerEvents);
-
Now create a list of
EmitterSubscription
where you will add the listeners. Why this is important so that when user quits the app then app can remove/release all the events. Otherwise, it may lead to 'MemoryLeak'.let eventsSubscriptionList: Array<EmitterSubscription> = [];
-
Listen to an events,
eventsSubscriptionList.push( playerEventEmitter.addListener( PlayerEvents.DURATION_CHANGE, (payload) => { console.log( 'PlayerEvent DURATION_CHANGE : ' + JSON.stringify(payload)); } ) );
-
When the app goes to background or user quits the app then App should remove the listeners from the list creates in the 4th step and should call
removeListeners
onKalturaPlayerAPI
.if (eventsSubscriptionList.length > 0) { eventsSubscriptionList.forEach((event) => { console.log(`removing player subscription ${event}`); event.remove(); }); } KalturaPlayerAPI.removeListeners();
It talks about the various states of the player like when it is buffering, when there is a video bitrate change etc.
PlayerEvents | Data sent to RN | iOS | Android |
---|---|---|---|
STATE_CHANGED |
{ "newState": <String> } |
✅ | ✅ |
CAN_PLAY |
No data sent | ✅ | ✅ |
DURATION_CHANGE |
{ "duration": <Number> } |
✅ | ✅ |
ENDED |
No data sent | ✅ | ✅ |
ERROR |
{ The errorSeverity in iOS is always Fatal when we get an error from the AVPlayer. |
✅ | ✅ |
LOADED_METADATA |
No data sent | ✅ | ✅ |
PAUSE |
No data sent | ✅ | ✅ |
PLAY |
No data sent | ✅ | ✅ |
PLAYING |
No data sent | ✅ | ✅ |
SEEKED |
No data sent | ✅ | ✅ |
SEEKING |
{ "targetPosition": targetSeekPosition } |
✅ | ✅ |
TRACKS_AVAILABLE |
{ Audio Track: { Video Track: { Text Track: { Image Track: { Notes for iOS: Video and Image tracks don't exist, therefore an empty array will be returned. Audio Tracks, the bitrate and channelCount are not available will return -1, UNSET. |
✅ | ✅ |
REPLAY |
No data sent | ✅ | ✅ |
PLAYBACK_INFO_UPDATED |
{ |
✅ | ✅ |
VOLUME_CHANGED |
{ "volume": Number } |
❌ | ✅ |
STOPPED |
No data sent | ✅ | ✅ |
METADATA_AVAILABLE |
[ For iOS AVMetadataItem |
❌ | ✅ |
EVENT_STREAM_CHANGED |
TODO | ❌ | ✅ |
SOURCE_SELECTED |
TODO | ✅ | ✅ |
PLAYHEAD_UPDATED |
TODO | ✅ | ✅ |
VIDEO_TRACK_CHANGED |
TODO | ✅ | ✅ |
AUDIO_TRACK_CHANGED |
TODO | ✅ | ✅ |
TEXT_TRACK_CHANGED |
TODO | ✅ | ✅ |
IMAGE_TRACK_CHANGED |
TODO | ❌ | ✅ |
PLAYBACK_RATE_CHANGED |
{ "rate": rate } TODO in iOS |
✅ | ✅ |
CONNECTION_ACQUIRED |
{ "newState": <String> } |
❌ | ✅ |
VIDEO_FRAMES_DROPPED |
TODO | ❌ | ✅ |
OUTPUT_BUFFER_COUNT_UPDATE |
TODO | ❌ | ✅ |
BYTES_LOADED |
TODO | ❌ | ✅ |
SUBTITLE_STYLE_CHANGED |
{ "subtitlesStyleChanged": styleName } |
❌ | ✅ |
ASPECT_RATIO_RESIZE_MODE_CHANGED |
{ "surfaceAspectRationSizeModeChanged": resizeMode } |
❌ | ✅ |
LOAD_TIME_RANGES |
TODO | ✅ | ✅ |
DRM_INITIALIZED |
TODO | ✅ | ✅ |
It talks about the ad's info like cuepoint, no of ads present in VMAP ad URL etc.
AdEvents | Data sent to RN | iOS | Android |
---|---|---|---|
AD_REQUESTED |
{ "adTagUrl": <String> } |
✅ | ✅ |
AD_FIRST_PLAY |
No data sent | ✅ | ✅ |
STARTED |
No data sent | ✅ | ✅ |
PAUSED |
No data sent | ✅ | ✅ |
RESUMED |
No data sent | ✅ | ✅ |
COMPLETED |
No data sent | ✅ | ✅ |
FIRST_QUARTILE |
No data sent | ✅ | ✅ |
MIDPOINT |
No data sent | ✅ | ✅ |
THIRD_QUARTILE |
No data sent | ✅ | ✅ |
SKIPPED |
No data sent | ✅ | ✅ |
SKIPPABLE_STATE_CHANGED |
No data sent | ✅ | ✅ |
CLICKED |
{ "clickThroughUrl": <String> } |
❌ | ✅ |
TAPPED |
No data sent | ✅ | ✅ |
AD_BREAK_READY |
No data sent | ✅ | ✅ |
AD_PROGRESS |
{ "currentAdPosition": <Number> } |
❌ | ✅ |
AD_BREAK_STARTED |
No data sent | ✅ | ✅ |
AD_BREAK_ENDED |
No data sent | ✅ | ✅ |
AD_BREAK_FETCH_ERROR |
No data sent | ❌ | ✅ |
AD_BREAK_IGNORED |
No data sent | ❌ | ✅ |
CUEPOINTS_CHANGED |
{ |
✅ | ✅ |
LOADED |
TODO | ❌ | ✅ |
CONTENT_PAUSE_REQUESTED |
No data sent | ❌ | ✅ |
CONTENT_RESUME_REQUESTED |
No data sent | ❌ | ✅ |
ALL_ADS_COMPLETED |
No data sent | ❌ | ✅ |
AD_BUFFER_START |
{ "adPosition": <Number> } |
❌ | ✅ |
AD_BUFFER_END |
{ "adPosition": <Number> } |
❌ | ✅ |
ERROR |
{ |
✅ | ✅ |
ICON_FALLBACK_IMAGE_CLOSED |
No data sent | ❌ | ✅ |
ICON_TAPPED |
No data sent | ❌ | ✅ |
PLAY_HEAD_CHANGED |
{ "adPlayHead": <Number> } |
❌ | ✅ |
AD_PLAYBACK_INFO_UPDATED |
{ |
❌ | ✅ |
DAI_SOURCE_SELECTED |
{ "sourceURL": <String> } |
❌ | ✅ |
adWaterFalling |
{ "newState": <String> } |
❌ | ❌ |
adWaterFallingFailed |
{ "newState": <String> } |
❌ | ❌ |
It talks about more about the concurrency level errors on the stream. These events are only for Kaltura BE customers.
AnalyticsEvents | Data sent to RN | iOS | Android |
---|---|---|---|
PHOENIX_CONCURRENCY_ERROR |
{ { |
✅ | ❌ |
PHOENIX_BOOKMARK_ERROR |
TODO | ✅ | ❌ |
PHOENIX_ERROR |
{ { |
✅ | ❌ |
SOURCE_URL_SWITCHED |
{ |
✅ | ❌ |
CDN_SWITCHED |
{ |
✅ | ❌ |
BROADPEAK_ERROR |
{ |
✅ | ❌ |
PHOENIX_REPORT_SENT |
{ |
✅ | ❌ |
KAVA_REPORT_SENT |
{ |
✅ | ❌ |
YOUBORA_REPORT_SENT |
{ |
✅ | ❌ |