Conviva Brightcove Player Plugin Sensor Integration (Video Cloud)

Explains how to integrate the Conviva sensor with the Brightcove Video Cloud player plugin to collect video streaming experience data.

Updated 2026-08-03 brightcove, stream, sensor, sensor developer center, sensor integration, web brightcove
This documentation is for JS SDK 4.0.3 and above.

Prerequisites

  • Obtain your account's CUSTOMER_KEYs.**Conviva provides a test account and a production account for Test and Production environments, respectively. You can find your CUSTOMER_KEY here: Pulse - Account Info. Ask your Conviva representative for assistance if you have problems accessing it.

  • Pass the gatewayUrl parameter to init() method of Conviva SDK. The gatewayUrl is specific for your account and shall ONLY be used for tests, never for production deployment.

    Sample gatewayUrl for Testing:

    https://<*customer_key*>.ts-testonly.conviva.com

    IMPORTANT: If there's any doubt on how to set the gateway URL, consult your Conviva representative - this is a critical parameter. For production, Conviva library uses the automatically-assigned gatewayUrl.

    Use Touchstone 2.0 in Pulse to perform self-validation and debugging of video sensor integration

  • For Conviva JavaScript Sensor Integration, you can use any custom gateway URL with a proxy service setup. This is applicable for JavaScript version 4.7.13 onwards.

  • Plan your metadata

    Conviva supports Pre-defined, Device, and Custom metadata. Work with your project team to determine the need to collect any custom metadata. It's also recommended to work with your Conviva representative to create your metadata plan prior to integration.

  • Integration Summary

    1. Install Conviva Library
    • Download the library and add dependencies.

    • Update the Brightcove Studio player configuration with the CUSTOMER_KEY.

    1. Configure Metadata
    • Implement the metadata by following the instructions to use the pre-defined keys, as well as custom metadata, if applicable.
    1. Handle User Actions
    • Implement the Conviva.Analytics.reportAppBackgrounded() / Conviva.Analytics.reportAppForegrounded() methods to report background events.

    • Implement the Conviva.Analytics.reportAppEvent() method to report app events (user actions, user dialogue, etc).

    • Report Network Metrics.

    • Manage Data Collection and User Preferences.

    1. Clean Up
    • No action required from application as Conviva Brightcove plugin handles cleanup of Conviva.

    Test and Validate

    1. After integration, perform a sanity check following the test cases in the Stream Sensor Sanity Test Plans spreadsheet. For the full validation test, use the test cases in the Stream Sensor Full Test Plans spreadsheet.

    2. Use Touchstone in Pulse to perform self-validation and debugging of video sensor integration.

    Be sure to replace your TEST CUSTOMER_KEY with the PRODUCTION key to go live with your application, and generate the session traffic to the following Touchstone gateway URL:https://.ts-testonly.conviva.com
    1. Done! Analyse your data in Pulse and improve your viewer experience - let's make video experience better!

    1. Install Conviva Library

    Host the Conviva Libraries and Include the Plugin

    Host the Conviva Libraries

    Download the libraries explicitly from Conviva GitHub and host them in a web server accessible over internet:

    https://github.com/Conviva/conviva-js-coresdk

    https://github.com/Conviva/conviva-js-brightcove

    Plugin and Player Inclusions

    Please refer to the Brightcove Plugin development and use the Studio's Players plugin to edit the player you have already created.

    1. Locate the Plugins section on the left pane

    2. Select the Scripts section, click the Add a script button

    3. In the JavaScript URL edit text box, enter the path to the hosted Conviva JavaScript Core SDK and click Save:*1. Select the Plugins section, Click the Add a Plugin dropdown and choose Custom Plugin option.

    4. In the Plugin Name field, enter convivaPlugin and in JavaScript URL area enter the path to the hosted Conviva Brightcove Plugin:

    5. In the Options (JSON) or in the JSON Editor, you may enter the data passed to the plugin, including your test or production keys. For details on the various metadata types, please review the Implement Metadata section.

    Parameters to be passed in the Options are:

    Parameters Description
    customerKey String to identify specific customer account. Different keys shall be used for development / debug versus production environment. Find your keys on the account info page in Pulse.
    gatewayUrl Once enabled, the data will appear in Pulse for performing self-validation of video sensor integration. For more information, see Self-validation using Touchstone
    toggleTraces Set to true for debug-level log verbosity.

    IMPORTANT: No need to set gatewayUrl and toggleTraces settings for your production release. The Conviva SDK provides the default values for production.

    Expected Errors Due to Dual Stack IPv4/v6 Network Support

    When the Conviva SDK is initialized with production settings, the SDK sends a single request to the endpoints below:

    • [customer_key].ipv4.cws.conviva.com for IPv4 only

    • [customer_key].ipv6.cws.conviva.com for IPv6 only

    Sending both requests enables correlation of IPv4 and IPv6 addresses in dual-stack networks. If only IPv4 or IPv6 addressing is used (single-stack networking), it is expected that one request will fail. All the following requests will be sent to the endpoint below which supports both IPv4 and IPv6:

    • [customer_key].cws.conviva.com

    Initialize the video object

    CONVIVA SDK relies on an instance of VideoAnalytics to monitor Video. Conviva Brightcove plugin automatically handles initializing instance of VideoAnalytics.

    2. Configure Metadata

    Metadata enables analysis of your data using different dimensions, for example, content, audience, device, workflow, player, and operating system.

    Conviva categorizes metadata tags into three buckets (Predefined, Device, Custom).

    Pre-defined Video Metadata

  • Conviva defines the constants or fixed string keys for commonly used metadata. These metadata keys provide critical information about video, versioning, workflow. IMPORTANT: In case of Conviva Brightcove plugin used for video integration, Conviva autocollects certain fields some of the metadata using mediainfo and playlist objects. Please refer to the Brightcove mediainfo and playlist pages for more details.

    If both mediainfo and playlist are unavailable, then the required metadata is fetched from the Brightcove Studio Plugin Options JSON.

  • Constants for Pre-defined Video Metadata

    Key / Constant Implementation Note
    assetName Autocollected from playlist, mediainfo or Studio's Options (JSON). This is the asset name for a session. Configure depending on your metadata strategy.

    Click to view the high level algorithm:

    var mediaInfo;
    var custom_fields;
    if (player.playlist && player.playlist() && player.playlist().length > 0) {
    mediaInfo = player.playlist()[player.playlist.currentItem()];
    } else {
    mediaInfo = player.mediainfo;
    }
    if (mediaInfo && (mediaInfo.custom_fields || mediaInfo.customFields)) {
    custom_fields = mediaInfo.custom_fields || mediaInfo.customFields;
    }
    
    var assetName;
    if (custom_fields && (custom_fields.assetName || custom_fields.assetname)) {
    assetName = custom_fields.assetName || custom_fields.assetname;
    } else {
    if (mediaInfo) {
    if (mediaInfo.name && typeof mediaInfo.name !== 'undefined') {
    assetName = mediaInfo.name;
    }
    if (mediaInfo.id && typeof mediaInfo.id !== 'undefined') {
    assetName = assetName ? (assetName += (' - ' + mediaInfo.id)) : (mediaInfo.id);
    }
    }
    }
    if (!assetName && options && options.assetName) {
    assetName = options.assetName;
    }
    
    isLive Autocollected using the mediainfo.duration or player.duration() or Studio's Options (JSON).

    Click to view the high level algorithm:

    var mediaInfo;
    var isLive;
    if (player.playlist && player.playlist() && player.playlist().length > 0) {
    mediaInfo = player.playlist()[player.playlist.currentItem()];
    } else {
    mediaInfo = player.mediainfo;
    }
    if (mediaInfo && (mediaInfo.custom_fields || mediaInfo.customFields)) {
    custom_fields = mediaInfo.custom_fields || mediaInfo.customFields;
    }
    
    if (custom_fields && (custom_fields.isLive || custom_fields.islive)) {
    isLive = custom_fields.isLive || custom_fields.islive;
    if (isLive.toLowerCase() === "true") {
    isLive =  Conviva.Constants.StreamType.LIVE;
    } else if (isLive.toLowerCase() === "false") {
    isLive = Conviva.Constants.StreamType.VOD;
    }
    } else if (mediaInfo && mediaInfo.duration > 0) {
    isLive = Conviva.Constants.StreamType.VOD;
    } else if (options.isLive != undefined){
    if (isLive === true) {
    isLive =  Conviva.Constants.StreamType.LIVE;
    } else if (isLive === false) {
    isLive = Conviva.Constants.StreamType.VOD;
    }
    } else {
    if (!isNaN(player.duration()) && player.duration() > 0) {
    isLive = Conviva.Constants.StreamType.VOD;
    else if (player.duration() === Infinity) {
    isLive = Conviva.Constants.StreamType.LIVE;
    }
    }
    
    playerName Report using the Studio's Options (JSON). A string value used to distinguish video players (applications). Simple values that are unique across all of your integrated platforms work best here. Do not include the build or version number in this property. The intention is to have a simple way of differentiating data from different players.
    viewerId Autocollected from mediainfo, playlist or Studio's Options (JSON). Required for Viewers plugin. A unique identifier to distinguish individual viewers or devices through Conviva's Viewers plugin. The value shall be unique abstract user's identifier. If user is anonymous, do not set any value for this tag.

    Click to view the high level algorithm:

    var mediaInfo;
    var custom_fields;
    if (player.playlist && player.playlist() && player.playlist().length > 0) {
    mediaInfo = player.playlist()[player.playlist.currentItem()];
    } else {
    mediaInfo = player.mediainfo;
    }
    if (mediaInfo && (mediaInfo.custom_fields || mediaInfo.customFields)) {
    custom_fields = mediaInfo.custom_fields || mediaInfo.customFields;
    }
    
    var viewerId;
    if (custom_fields && (custom_fields.viewerId || custom_fields.viewerid)) {
    viewerId = custom_fields.viewerId || custom_fields.viewerid;
    }
    if (!viewerId && options && options.viewerId) {
    viewerId = options.viewerId;
    }
    
    streamUrl

    Autocollected using player.currentSrc().

    The manifest URL of the video stream.The Conviva backend config server attempts to map a portion of StreamURL into a CDN name. For example: In the URL https://www.akamai.net/avengers.m3u8, akamai.net maps to the AKAMAI label. Conviva VSI users can then retrieve metrics based on the mapped CDN name (AKAMAI, in this case).

    The URL values reported in the streamURL are case insensitive. The streamURLs with either all capitals or all lower case are acceptable.
    defaultReportingResource

    Report from mediainfo, playlist or Studio's Options (JSON). This value specifies the video server or CDN name from where the streaming resource is played. Set this field when the video server resource cannot be inferred from the streamUrl.

    For example, if the streamURL is https://cbd12348.cdn.cms.somewebsitehostname.com/abc.txt, it is not possible to infer the AKAMAI name from the streamURL, and in such a case, it is necessary to report the defaultReportingResource as AKAMAI.

    The DEFAULT_Resource value is case sensitive. If the resource name is initially reported as AKAMAI (uppercase) and subsequently modified in the app to akamai (lowercase), it is necessary to inform Conviva about the change because both need to be mapped in the Conviva backend configuration server to ensure that both point to the same CDN name (AKAMAI).

    Click to view the high level algorithm:

    var mediaInfo;
    var custom_fields;
    if (player.playlist && player.playlist() && player.playlist().length > 0) {
    mediaInfo = player.playlist()[player.playlist.currentItem()];
    } else {
    mediaInfo = player.mediainfo;
    }
    if (mediaInfo && (mediaInfo.custom_fields || mediaInfo.customFields)) {
    custom_fields = mediaInfo.custom_fields || mediaInfo.customFields;
    }
    
    var defaultReportingResource;
    if (custom_fields && (custom_fields.defaultReportingResource || custom_fields.defaultReportingresource)) {
    defaultReportingResource = custom_fields.defaultReportingResource || custom_fields.defaultreportingResource;
    }
    if (!defaultReportingResource && options && options.defaultReportingResource) {
    defaultReportingResource = options.defaultReportingResource;
    }
    
    DURATION Autocollected using the mediainfo.duration or player.duration().

    Click to view the high level algorithm:

    var mediaInfo;
    var duration;
    if (player.playlist && player.playlist() && player.playlist().length > 0) {
    mediaInfo = player.playlist()[player.playlist.currentItem()];
    } else {
    mediaInfo = player.mediainfo;
    }
    
    if (mediaInfo && mediaInfo.duration > 0) {
    duration = mediaInfo.duration;
    }
    if (!duration && player.duration() !== Infinity && !isNaN(player.duration()) && player.duration() > 0) {
    duration = player.duration();
    }
    
    encodedFramerate Autocollected from mediainfo, playlist or Studio's Options (JSON). Encoded frame rate of the video stream in frames per second.

    Click to view the high level algorithm:

    var mediaInfo;
    var custom_fields;
    if (player.playlist && player.playlist() && player.playlist().length > 0) {
    mediaInfo = player.playlist()[player.playlist.currentItem()];
    } else {
    mediaInfo = player.mediainfo;
    }
    if (mediaInfo && (mediaInfo.custom_fields || mediaInfo.customFields)) {
    custom_fields = mediaInfo.custom_fields || mediaInfo.customFields;
    }
    
    var encodedFramerate;
    if (custom_fields && (custom_fields.encodedFramerate || custom_fields.encodedframerate)) {
    encodedFramerate = custom_fields.encodedFramerate || custom_fields.encodedframerate;
    encodedFramerate = parseInt(encodedFramerate, 10);
    }
    if (!encodedFramerate && options && options.encodedFramerate) {
    encodedFramerate = parseInt(options.encodedFramerate, 10);
    }
    
    FRAMEWORK_NAME Autocollected as "BrightcovePlayer".
    FRAMEWORK_VERSION Autocollected using bc.VERSION or videojs.VERSION based on availability of API.
    "c3.app.version" Report the application build version using the Studio's Options (JSON) tags field.

    Device Metadata (Click to Expand):

    Device Metadata monitored by Conviva Brightcove plugin (if applicable):

    Key Implementation Note
    BRAND Autocollected using UAS, if available.
    MANUFACTURER Autocollected using UAS, if available.
    MODEL Autocollected using UAS, if available.
    TYPE Autocollected using UAS, if available.
    OS_NAME Autocollected using UAS, if available.
    OS_VERSION Autocollected using UAS, if available.
    CATEGORY Autocollected as Conviva.Constants.DeviceCategory.WEB
    SCREEN_RESOLUTION_WIDTH Autocollected using window.screen.width API.
    SCREEN_RESOLUTION_HEIGHT Autocollected using window.screen.height API.
    SCREEN_RESOLUTION_SCALE_FACTOR Autocollected using window.screen.devicePixelRatio API.

    Custom Metadata

    Refer to App Manager->Setup Metadata page for your account to find the custom tags which shall be implemented.

    Please refer to the Brightcove player page that explains how to create and set custom fields.

    We use tags and convivatags to create custom tags. You can use both methods to fit your needs and create custom tags for your sessions. tags:

    To add custom tags, add it as part of Options in the plugin configuration as shown below. Each key-value pair is sent as a custom tag.

    "tags": {
    "customTagKeyC": "customTagValC",
    "customTagKeyB": "customTagValB",
    "customTagKeyA": "customTagValA"
    }
    

    convivatags:

    Use it to represent custom tags for each asset. Depending on the current video, this helps specify tags dynamically. All the keys are specified as comma-separated string. Conviva plugin detects the value corresponding to those fields in the custom_fields specific for an asset.

    "convivatags": "test_tag_key_a,test_tag_key_b,test_tag_key_c,c3_cm_contenttype"
    

    In the example above, we look for values of test_tag_key_a, test_tag_key_b, test_tag_key_c, and c3_cm_contenttype in the custom fields for the asset, and then send those key-value pairs as custom tags.

    Conviva Plugin looks for the Internal Key to get the corresponding value from custom_fields. This value is then internally mapped to Display Name to show as custom tags.

    The **Internal Key** allows only lowercase and alphanumeric characters without whitespaces.

    Use the Internal Key to set the pre-defined content metadata.

    IMPORTANT: To assign content category labels, such as Audio, Trailer, Tile Play, or Short Video, use the c3.cm.categoryType pre-defined content metadata constant.

    Display Name Internal Key Type Description
    "c3.cm.contentType" "c3_cm_contenttype" string Advanced content delivery methods along with Live and VOD. Acceptable values: "Live", "Live-Linear", "DVR", "Catchup", "VOD".
    "c3.cm.channel" "c3_cm_channel" string The channel on which the content is consumed.

    Example: "ABC".

    "c3.cm.brand" "c3_cm_brand" string The name of the brand to which the content belongs.

    Examples: "ABC X", "ABC Y".

    "c3.cm.affiliate" "c3_cm_affiliate" string Affiliate or MVPD name for TV Everywhere authenticated services.

    Examples: "Xfinity", "Comcast".

    "c3.cm.categoryType" "c3_cm_categorytype" string

    Content business categories of interest.

    Use this constant to assign content category labels, such as Audio, Trailer, Tile Play, or Short Video.

    Examples: "Episodic", "Movies", "News", "Sports", "Events", "Informercials", "Shorts", "Promos", "Audio", "Tile Play", "Short Videos", "Trailer".

    "c3.cm.name" "c3_cm_name" string Name of CMS Provider.

    Examples: "CMS", "ROVI", "TMS".

    "c3.cm.id" "c3_cm_id" string Unique asset identifier to query CMS system to gather additional asset metadata information for a specific asset.

    Example: "003b094d-fc5c-3d5a-8ed0-301bf848291e".

    "c3.cm.seriesName" "c3_cm_seriesname" string The name of Series. Set the value only if the metadata cannot be gathered from CMS System. Null if not applicable.

    Examples: "Friends", "Null".

    "c3.cm.seasonNumber" "c3_cm_seasonnumber" string The Season number. Set the value only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "1", "Null".

    "c3.cm.showTitle" "c3_cm_showtitle" string The name of the Episode or Show Title. Set the value only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "The One with All the Cheesecakes", "Null".

    "c3.cm.episodeNumber" "c3_cm_episodenumber" string The Episode number. Set the value only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "3", "Null".

    "c3.cm.genre" "c3_cm_genre" string The Primary content genre. Set the value only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "Drama", "Null".

    "c3.cm.genreList" "c3_cm_genrelist" string The list of the applicable content genre. Set the values in a comma separated list only if the details cannot be inferred from Asset Provider Server. Null if not applicable.

    Examples: "Drama, Crime, Political, Violence", "Null"

    "c3.cm.utmTrackingUrl" "c3_cm_utmtrackingurl" string Provide the UTM parameters in the URL to track the effectiveness of the online marketing campaign across traffic sources and publishing media. Conviva uses CONTAINS logic to parse the individual UTM parameters from the URL provided, so either the full URL or just the UTM parameters is acceptable.


    Example values: http://www.example.com/?utm_source=newsletter1&utm_medium=email&utm_campaign=summer-sale&utm_content=toplink or utm_source=newsletter1&utm_medium=email&utm_campaign=summer-sale&utm_content=toplink

    This tag is only applicable for web and mobile devices.

    mediaInfo:

    mediainfo is fetched for every content video information present, and varies with each content. To view and change it, navigate to the media page and click the Edit button in the Video Information section.

    By clicking the Edit button, you can make changes and save them. In this window you can also edit and change the custom_fields:

    playlist:

    If mediainfo is unavailable, then the Conviva library retrieves information like the assetName, videoId and custom_fields from the playlist object.

    Note: If mediainfo and playlist are not present, the Conviva library sets the assetName, custom_fields and tags from the options in the plugin.

    This sample code shows how to add a playlist using playlist id in video cloud:

    <video
    id="myPlayerID"
    data-playlist-id="5235575980001"
    data-account="3895904659001"
    data-player="HJfCx9w7Z"
    data-embed="default"
    data-application-id
    class="video-js"
    controls
    width="300"
    height="150"></video>
    
    <script src= "http://players.brightcove.net/3895904659001/HJfCx9w7Z_default/index.min.js"></script>
    <script type="text/javascript">
    videojs('myPlayerID').ready(function () {
    var myPlayer = this;
    });
    </script>
    

    Update/Amend Metadata

    Metadata cannot be amended in Conviva Brightcove plugin and all the metadata are automatically collected by Conviva Brightcove plugin.

    Ad Events and Metadata

    Conviva Brightcove plugin automatically detects ad events and handles them accordingly if your application has ads. To enable this feature, the enableAdExperience setting is passed to the Conviva plugin using Options (JSON) and set to true.

    Report Ad Break

    Conviva Brightcove Plugin automatically detects ad break events and handles them accordingly.

    3. Report Events and Metadata

    Report playback metrics

    Metrics monitored by Conviva Brightcove plugin (if applicable):

    Key Implementation Note
    Errors (VSF/VPF)

    The plugin listens for the video errors fired by the player using error event callback. To report application level errors impacting user experience, call videojs('myPlayerId').trigger('error', 'errorMessage') explicitly.

    The preferred error message format is: [ERROR_CODE]:ERROR_MESSAGE - ERROR_DETAILS

    PLAYER_STATE Autocollected
    BITRATE

    Peak Bitrate Autocollected

    For the Average Peak Bitrate definition, refer to Average Peak Bitrate in the Metric Dictionary.

    AVG_BITRATE

    Average Bitrate Autocollected

    For the Avg. Average Bitrate definition, refer to Avg. Average Bitrate in the Metric Dictionary.

    SEEK_STARTED Autocollected
    SEEK_ENDED Autocollected.
    PLAY_HEAD_TIME Autocollected.
    BUFFER_LENGTH Autocollected.
    RENDERED_FRAMERATE Not applicable as Brightcove doesn't support reporting of the rendered framerate by default.
    CDN_IP CDN IP address in string format. Can be autocollected . NOTE: Please contact Conviva Support to enable auto collection configuration.
    DROPPED_FRAMES_TOTAL Autocollected
    AUDIO_LANGUAGE Autocollected
    SUBTITLES_LANGUAGE Autocollected
    CLOSED_CAPTIONS_LANGUAGE Autocollected

    IMPORTANT: The Conviva Brightcove plugin auto-collects and reports the language change events in [langCode]:langName format, for example, [en]:English. When only one of them is available, the plugin reports it as such, for example, en or English.

    4. Handle User Actions

    Handle specific user actions such as app backgrounding / foregrounding by using the corresponding API as prescribed on the corresponding pages.

    Use the corresponding API as prescribed on the corresponding pages.

    User Actions: Backgrounding

    Handle backgrounding event (e.g., "home"/"power off" buttons)

    Conviva.Analytics.reportAppBackgrounded();
    

    On foregrounding

    Conviva.Analytics.reportAppForegrounded();
    

    Report Network Metrics

    Metrics like connection type which is common for all the concurrent playback within one Analytics instance can be reported.

    Connection Type can be updated after session creation, before the first video frame is rendered.

    Conviva.Analytics.reportDeviceMetric(/* Conviva.Constants.Network / metricKey, / string */ metricValue):

    • metricKey: Conviva.Constants.Network type key for reporting Network Metrics.

    • metricValue: Value of the reported network metric.

    Refer to the sample code mentioned below:

    Conviva.Analytics.reportDeviceMetric(Conviva.Constants.Network.CONNECTION_TYPE, "WiFi");
    

    The table below shows the representation string values for setting connection type:

    Internet Connection Type Representation String
    Wireless WiFi
    Wired Ethernet
    Cellular 2G 2G
    Cellular 3G 3G
    Cellular 4G 4G
    Other/Unknown OTHER

    Data Collection and User Preferences

    By default, Conviva collects a set of data for better user analytics. However, the appropriate legal agreement with Conviva is required in order for Conviva to begin collecting data that would be considered PII, personal information, personal data or the like under applicable data privacy laws such as the General Data Protection Regulation (GDPR) and the California Consumer Privacy Act (CCPA). Further below in this document, there is a description of the user-preference APIs that control data collection, including opt-out and deletion of data, in compliance with data privacy laws. These APIs are in addition to existing, offline processes for opt-out and data deletion requests.

    This document describes the identifiers that the libraries are capable of collecting, however actual collection of identifiers is contingent upon the customer's legal department providing written instructions to Conviva to begin collection. At the discretion of the customer's legal department, some or all of these identifiers may be collected. Conviva provides this flexibility to allow the customer to determine the precise identifiers to be collected.

    Send unique identifier's data such as unique identifier for a device or user, for example deviceId, Mac address, advertisingIdentifier, and other identifiers, use the Conviva.Analytics.setUniqueIdentifier(/* object / identifiers, / function */ callback=):

    • identifiers: JSON object with key value pairs of identifiers and values.

    • callback: Optional callback function that needs to be notified if the identifiers were honored or collected by Conviva.

    Below mentioned are the sample result messages from Conviva:

    • "Data collection successful"

    • "End-user chose to opt-out of personal data collection"

    • "End-user used privacy settings and chose to opt-out of personal data collection"

    Refer to the sample code mentioned below:

    var identifiers = {};
    identifiers["androidId"] = "xyzabd123cvqn";
    Conviva.Analytics.setUniqueIdentifier(identifiers, function (msg) {
    console.log("Result of the setUniqueIdentifier API:" + msg);
    });
    

    Control the data collection, set the user preference to collect or stop collecting PII data items using Conviva.Analytics.setUserPreferenceForDataCollection(/* object / identifiers, / boolean */forAllApps):

    • identifiers:string key/value pair, where key indicates a probable data name and value is false/true. A value of false causes the SDK to stop collecting that specific data item.

    • forAllApps:boolean value indicates if the preference applies to current app or all apps on the device. A value of true indicates all apps; false indicates only the current app.

    Refer to the sample code mentioned below:

    var identifiers = {};
    identifiers["androidId"] = "false";
    Conviva.Analytics.setUserPreferenceForDataCollection(identifiers, false);
    

    Set the user preference to delete and stop collecting specific data items using Conviva.Analytics.setUserPreferenceForDataDeletion(/* object */ identifiers):

    • identifiers: string key/value pair, where key indicates a probable data name and value is false/true. A value of false causes the SDK to stop collecting that specific data item.

    Refer to the sample code mentioned below:

    var identifiers = {};
    identifiers["androidId"] = "true";
    Conviva.Analytics.setUserPreferenceForDataCollection(identifiers);
    

    Report Custom Events

    Player Insight is an advanced feature which allows you to track custom events that are not related to video rendering, but rather specific to your player's functionality. These events and their attributes are then tabulated in the Player Insight dashboard at Conviva VSI (Pulse). Contact your Conviva representative to enable Player Insights in Pulse.

    You may send a custom Player Insight event that can be associated with a video playback using the following method:

    Report app-level events by the method Conviva.Analytics.reportAppEvent(/* string / eventType, / object */ eventDetail=):

    • eventType: Mandatory argument of event type of the app event of string type.

    • eventDetail: Optional argument of event details of the app event of object type.

    Report app-level events

    // Sample for "share-click" event with 3 arguments
    var eventType = "share-click";
    var attr = {};
    attr["location"] =  "Toolbar";
    attr["assetName"] = "Sample Video";
    attr["shareService"] = "Facebook";
    Conviva.Analytics.reportAppEvent(eventType, attr);
    

    5. Clean Up Session

    Conviva Brightcove plugin automatically handles the cleanup of Conviva.

    If none of the ended, abort, dispose events are triggered, the clients need to handle the player exit scenario to ensure one of these events are getting triggered. Alternatively, clients can manually end the Conviva session by calling the ConvivaVideoAnalytics.reportPlaybackEnded() method.

    Limitations

    Known Brightcove Plugin limitations:

    Metric Name Impact Conditions Issue
    Audio, Subtitles, or Closed Captions Language Incorrectly reported For HLS in Safari The player is not reporting the track type (subtitle or closed caption) as the same as in the HLS manifest file.
    DASH protocol for other browsers If DASH protocol has only lang attribute mentioned in the manifest file, then both lang and label attributes report the same value.
    By default, the Brightcove player auto-collects the lang value as *main* if the lang and label attributes are missing in the DASH manifest file.
    Not Supported DASH Protocol with embedded webvtt content Only supports subtitles of type webvtt that are not embedded with video.
    DASH Protocol with TTML content Doesn't support subtitles and closed captions of type TTML.
    Peak Bitrate Inaccurate HLS on Safari Brightcove Player relies on the Safari native engine to fetch bitrate, which does not report the audio bitrate for HLS content, and provides the bitrate switch information when the segments are downloaded rather than streamed.
    Under-reported For HLS Demux Audio bitrate information is not available using player.tech(true).vhs or player.tech(true).hls APIs.
    Average % Complete Under-reported Player state is PAUSED Content is available in cache

    Toggle Play Pause within ~400ms

    Conviva reports only PAUSED state.

    Conviva Brightcove Plugin infers the PLAYING state based on the play head position poll logic, which takes ~400ms to identify the player state.

    Connection Induced Rebuffering (CIRR) Under-reported Mid Stream Low Bandwidth Brightcove Player reports extra seek event while playing the content intermittently during buffering.
    Under-reported Manually change video quality Brightcove Player reports extra seek event when video quality is changed from player settings.
    Exits Before Video Start (EBVS) Over-reported Low Bandwidth

    Skipping to the next item in the playlist after the current one reports PLAYER_TIMEOUT

    Brightcove Player does not report the error event for the next item.
    Over-reported Mid Stream Failure

    Skipping to the next item in the playlist after the current one reports PLAYER_TIMEOUT

    Brightcove Player does not report the error event for the next item.
    Minutes Ended Play Under-reported Player state is PAUSED

    Content is available in cache

    Toggle Play Pause within ~400ms

    Conviva reports only PAUSED state.

    Conviva Brightcove Plugin infers the PLAYING state based on the play head position poll logic, which takes ~400ms to identify the player state.

    Minutes Unique Device Under-reported Player state is PAUSED

    Content is available in cache

    Toggle Play Pause within ~400ms

    Conviva reports only PAUSED state.

    Conviva Brightcove Plugin infers the PLAYING state based on the play head position poll logic, which takes ~400ms to identify the player state.

    Play Head Time Incorrectly reported Player Seek Conviva Brightcove Plugin reports the seek to position in the play head time instead of seek started.
    Tag: has_ads_requested Under-reported Player with ads Brightcove Player is unable to send the ads-request in case of playlist items intermittently.
    Total Minutes Under-reported Player state is PAUSED

    Content is available in cache

    Toggle Play Pause within ~400ms

    Conviva reports only PAUSED state.

    Conviva Brightcove Plugin infers the PLAYING state based on the play head position poll logic, which takes ~400ms to identify the player state.

    Video Restart Time (VRT) Under-reported MS Edge and Seek During user seek, by dragging or clicking any position, player reports multiple seek events and intermittent PLAY state.
    Over-reported Chrome and system sleeps Player reports seek events resulting into reporting buffering related to seek.
    Over-reported Mid Stream Low Bandwidth Brightcove Player reports extra seek event while playing the content intermittently during buffering.
    Video Start Failures (VSF) Under-reported Low Bandwidth

    Skipping to the next item in the playlist after the current one reports PLAYER_TIMEOUT

    Brightcove Player does not report the error event for the next item.
    Under-reported Mid Stream Failure

    Skipping to the next item in the playlist after the current one reports PLAYER_TIMEOUT

    Brightcove Player does not report the error event for the next item.
    Viewer Hours Under-reported Player state is PAUSED

    Content is available in cache

    Toggle Play Pause within ~400ms

    Conviva reports only PAUSED state.

    Conviva Brightcove Plugin infers the PLAYING state based on the play head position poll logic, which takes ~400ms to identify the player state.

    All Conviva Metrics Not reported MPEG DASH on Mac/iOS Safari MPEG DASH playback is not supported on Brightcove and Mac/iOS Safari, therefore no Conviva metrics can be collected.
    Inaccurate Preroll, Midroll, and Postroll Ads

    Skipping the playlist item after the end of Midroll

    Brightcove Player starts playing the Postroll ad of the current item and the main content of the next item simultaneously without playing the Preroll ad.

    Conviva recommends not to have Postroll ads until the issue is fixed by Brightcove.

    Inaccurate

    Muxed Content on Mac Safari

    Mid Stream Low Bandwidth

    Brightcove player reports a false PLAYING state intermittently followed by an increment of playhead position even though the playback is stalled.

    The Conviva Brightcove Plugin infers the PLAYING state based on the playhead position poll logic instead of buffering.

    Not reported VPAID Linear 2.0 ads are unreachable Playback is halted upon starting the playback. Google IMA does not report the error nor starts the playback.
    Ad Start Failure (ASF) Over-reported Auto Start Enabled

    Auto Advance enabled

    Do not Preload

    Preroll Ads

    Player type playlist

    Ads are unreachable

    Duplicate 'ads-request' and 'adserror' events are triggered for non-first playlist items.
    Under-reported VPAID Linear 2.0 ads are unreachable Playback is halted upon starting the playback. Google IMA does not report the error nor starts the playback.
    Over-reported Mid-roll ads are unreachable

    Ads metadata is loaded

    Duplicate ima3-log error events are triggered for mid-roll ads.
    Under-reported Low Bandwidth

    Previous playlist item throws the timeout error

    Error event is not triggered for the current playlist item.
    Attempts Over-reported

    iOS Safari

    Preroll, Midroll, or Postroll Ads integrated in Player Version 6.60.0 onwards

    ‘Abort’ event is reported at the end of each ad.
    Metadata Name Impact Conditions Issue
    Device Manufacturer Not Autocollected Desktop Browsers: - Windows 7 - Windows 10 - Linux The Conviva library autocollects this information from the User Agent String and cannot infer this metadata for desktop browsers.
    Device Marketing Name Not Autocollected Desktop Browsers: - Windows 7 - Windows 10 - Linux - Mac The Conviva library autocollects this information from the User Agent String and cannot infer this metadata for desktop browsers.
    Device OS Version Not Autocollected Desktop Browsers: - Windows 7 - Windows 10 - Linux The Conviva library autocollects this information from the User Agent String and cannot infer this metadata for desktop browsers.

    Self Validation

    Upon completion of your integration, and before submission to Conviva QA team, developers should complete a comprehensive self-validation test pass of each Device Application.

    Perform self-validation of video sensor integration using Touchstone in Pulse.

    Conviva provides sample test cases with detailed steps and expected results.

    Developers should be checking for both metric and metadata accuracy. Based on our experience, comprehensive self-validation can reduce your QE cycles, saving your costly project time.