Skip to content

Latest commit

 

History

History
163 lines (133 loc) · 12.3 KB

events.md

File metadata and controls

163 lines (133 loc) · 12.3 KB

Events

Events can be listened by the FE apps inorder to understand more details about the Player. We have PlayerEvents, AdEvents and AnalyticsEvents.

  1. App can import the events from our package,

    import {
    PlayerEvents,
    AdEvents,
    AnalyticsEvents,
    } from 'kaltura-player-rn';
  2. 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 on KalturaPlayerAPI,

    KalturaPlayerAPI.addListeners();
  3. Now to listen to the Native Events, app should take help of NativeEventEmitter. App should take KalturaPlayerEvents from NativeModules.

    const kalturaPlayerEvents = NativeModules.KalturaPlayerEvents;
    const playerEventEmitter = new NativeEventEmitter(kalturaPlayerEvents);
  4. 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> = [];
  5. Listen to an events,

    eventsSubscriptionList.push(
        playerEventEmitter.addListener(
            PlayerEvents.DURATION_CHANGE,
            (payload) => {
            console.log(
                'PlayerEvent DURATION_CHANGE : ' + JSON.stringify(payload));
            }
        )
        );
  6. 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 on KalturaPlayerAPI.

    if (eventsSubscriptionList.length > 0) {
        eventsSubscriptionList.forEach((event) => {
            console.log(`removing player subscription ${event}`);
            event.remove();
        });
        }
    
    KalturaPlayerAPI.removeListeners();

Player Events

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    {
     "errorType": errorType,
     "errorCode": errorCode,
     "errorSeverity":"Fatal",
     "errorMessage": errorMessage,
     "errorCause": errorCause
     }


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": audioTracks,
     "text": textTracks,
     "video":videoTracks,
     "image": imageTracks
    }


Audio Track:
   {
    "id": String,
    "bitrate":Number,
    "language": String,
    "label": String,
    "channelCount": Number,
    "isSelected": Boolean
    }


Video Track:
   {
    "id": String,
    "width":Number,
    "height": Number,
    "bitrate": Number,
    "isSelected": Boolean,
    "isAdaptive": Boolean
    }


Text Track:
   {
     "id": String,
     "language": String,
     "label":String,
     "isSelected": Boolean
    }


Image Track:
   {
     "id": String,
     "label": String,
     "bitrate":Number,
     "width": Number,
     "height": Number,
     "cols":Number,
     "rows":Number,
     "duration":Number,
     "url":String,
     "isSelected":Boolean
    }


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 {
   "android": {
     "videoBitrate": Number,
     "audioBitrate": Number,
     "videoThroughput":Number,
     "videoWidth": Number,
     "videoHeight": Number
     },
   "ios": {
     "bitrate": Number,
     "indicatedBitrate": Number,
     "observedBitrate":Number,
     "averageVideoBitrate": Number,
     "averageAudioBitrate": Number,
     "uri": String
     }
 }

VOLUME_CHANGED { "volume": Number }
STOPPED No data sent
METADATA_AVAILABLE [
  {
   "schemeIdUri": "urn:scte:scte35:2013:xml",
   "value": "999",
   "messageData": [
     60,
     62
     ],
   "id": 165882295,
   "durationMs": 10000
  }
 ]


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

AdEvents

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 {
 "ima": {
    "cuePoints": [Number],
    "count": Number,
    "hasPreRoll": Boolean,
    "hasMidRoll": Boolean,
    "hasPostRoll": Boolean
 }
}
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    {
     "errorType": errorType,
     "errorCode": errorCode,
     "errorSeverity":"Fatal",
     "errorMessage": errorMessage,
     "errorCause": errorCause
     }
ICON_FALLBACK_IMAGE_CLOSED No data sent
ICON_TAPPED No data sent
PLAY_HEAD_CHANGED { "adPlayHead": <Number> }
AD_PLAYBACK_INFO_UPDATED    {
     "bitrate": Number,
     "height": Number,
     "width":Number
     }
DAI_SOURCE_SELECTED { "sourceURL": <String> }
adWaterFalling { "newState": <String> }
adWaterFallingFailed { "newState": <String> }

AnalyticsEvents

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    {
     "code": 4001(Number) ,
     "extra": KalturaAPIException(String),
     "message": Concurrent play limitation(String)
    }


   {
     "code": ConcurrencyLimitation(String) ,
     "extra": KalturaAccessControlMessage(String),
     "message": Concurrency limitation(String)
     }
PHOENIX_BOOKMARK_ERROR TODO
PHOENIX_ERROR    {
     "code": 500015(Number) ,
     "extra": KalturaAPIException(String),
     "message": Invalid KS format(String),
     "name": OTTError(String)
     }


   {
     "code": 500016(Number) ,
     "extra": KalturaAPIException(String),
     "message": KS expired(String),
     "name": OTTError(String)
     }
SOURCE_URL_SWITCHED    {
     "originalUrl": String,
     "updatedUrl": String
     }
CDN_SWITCHED    {
     "cdnCode": String
     }
BROADPEAK_ERROR    {
     "errorMessage": String,
     "errorCode": String
     }
PHOENIX_REPORT_SENT    {
     "eventName": String
     }
KAVA_REPORT_SENT    {
     "eventName": String
     }
YOUBORA_REPORT_SENT    {
     "eventName": String
     }