Tracks

Audio tracks

For audio track selection, the Web Receiver SDK provides a AudioTracksManager class that simplifies and streamlines track selection, giving you more control and better access to properties, such as name, URL, and language. This class is best used in the event handler for the cast.framework.events.EventType.PLAYER_LOAD_COMPLETE event.

The API provides various ways to query and select the active audio tracks. Here is an example of how to select a track to be active by specifying its ID:

  const 
  
 context 
  
 = 
  
 cast 
 . 
 framework 
 . 
 CastReceiverContext 
 . 
 getInstance 
 (); 
 const 
  
 playerManager 
  
 = 
  
 context 
 . 
 getPlayerManager 
 (); 
 playerManager 
 . 
 addEventListener 
 ( 
  
 cast 
 . 
 framework 
 . 
 events 
 . 
 EventType 
 . 
 PLAYER_LOAD_COMPLETE 
 , 
  
 () 
  
 = 
>  
 { 
  
 const 
  
 audioTracksManager 
  
 = 
  
 playerManager 
 . 
 getAudioTracksManager 
 (); 
  
 // 
  
 Get 
  
 all 
  
 audio 
  
 tracks 
  
 const 
  
 tracks 
  
 = 
  
 audioTracksManager 
 . 
 getTracks 
 (); 
  
 // 
  
 Choose 
  
 the 
  
 first 
  
 audio 
  
 track 
  
 to 
  
 be 
  
 active 
  
 by 
  
 specifying 
  
 its 
  
 ID 
  
 audioTracksManager 
 . 
 setActiveById 
 ( 
 tracks 
 [ 
 0 
 ] 
 . 
 trackId 
 ); 
  
 }); 
 context 
 . 
 start 
 (); 
 

The AudioTracksManager class also provides a method getActiveTrack() .

Here is an example of how to select the first audio track for a specified language, in this case English:

  const 
  
 context 
  
 = 
  
 cast 
 . 
 framework 
 . 
 CastReceiverContext 
 . 
 getInstance 
 (); 
 const 
  
 playerManager 
  
 = 
  
 context 
 . 
 getPlayerManager 
 (); 
 playerManager 
 . 
 addEventListener 
 ( 
  
 cast 
 . 
 framework 
 . 
 events 
 . 
 EventType 
 . 
 PLAYER_LOAD_COMPLETE 
 , 
  
 () 
  
 = 
>  
 { 
  
 const 
  
 audioTracksManager 
  
 = 
  
 playerManager 
 . 
 getAudioTracksManager 
 (); 
  
 // 
  
 Set 
  
 the 
  
 first 
  
 matching 
  
 language 
  
 audio 
  
 track 
  
 to 
  
 be 
  
 active 
  
 audioTracksManager 
 . 
 setActiveByLanguage 
 ( 
 'en' 
 ); 
  
 }); 
 context 
 . 
 start 
 (); 
 

The AudioTracksManager class also provides a method getTracksByLanguage(language) that returns all tracks for the specified language.

The audio language code is retrieved from the media manifest and should follow RFC 5646. Language codes can be presented in 2-character nomenclature (such as "es", "en" or "de"), or 4 character nomenclature (such as "en-us", "es-es" or "fr-ca").

If the media manifest follows a different language code standard, the Web Receiver app needs to convert it into an RFC 5646 conforming language code. Web Receiver SDK provides an interceptor EDIT_AUDIO_TRACKS to perform modifications:

  const 
  
 context 
  
 = 
  
 cast 
 . 
 framework 
 . 
 CastReceiverContext 
 . 
 getInstance 
 (); 
 const 
  
 playerManager 
  
 = 
  
 context 
 . 
 getPlayerManager 
 (); 
 // 
  
 Intercept 
  
 the 
  
 EDIT_AUDIO_TRACKS 
  
 request 
 playerManager 
 . 
 setMessageInterceptor 
 ( 
 cast 
 . 
 framework 
 . 
 messages 
 . 
 MessageType 
 . 
 EDIT_AUDIO_TRACKS 
 , 
  
 request 
  
 = 
>  
 { 
  
 // 
  
 write 
  
 logic 
  
 to 
  
 convert 
  
 language 
  
 codes 
  
 here 
 }); 
 context 
 . 
 start 
 (); 
 

When playing through ad breaks, any audio track selection, such as language, made before a break will persist after the break for the same content, even if the ads are in a different language.

Closed captions (subtitles)

For closed caption track selection, the Web Receiver SDK provides the TextTracksManager class that simplifies and streamlines track selection, giving you more control and better access to properties, such as name, URL and language.

The TextTracksManager class is best used in the event handler for the cast.framework.events.EventType.PLAYER_LOAD_COMPLETE event.

Closed captions selection in the Web Receiver SDK is simplified and streamlined with other parts of the SDK.

The API supports controlling WebVTT, TTML and CEA-608.

The TextTracksManager class provides various ways to query and select a closed caption track to be active. Here is an example of how to select the first track to be active by specifying its ID:

  const 
  
 context 
  
 = 
  
 cast 
 . 
 framework 
 . 
 CastReceiverContext 
 . 
 getInstance 
 (); 
 const 
  
 playerManager 
  
 = 
  
 context 
 . 
 getPlayerManager 
 (); 
 playerManager 
 . 
 addEventListener 
 ( 
  
 cast 
 . 
 framework 
 . 
 events 
 . 
 EventType 
 . 
 PLAYER_LOAD_COMPLETE 
 , 
  
 () 
  
 = 
>  
 { 
  
 const 
  
 textTracksManager 
  
 = 
  
 playerManager 
 . 
 getTextTracksManager 
 (); 
  
 // 
  
 Get 
  
 all 
  
 text 
  
 tracks 
  
 const 
  
 tracks 
  
 = 
  
 textTracksManager 
 . 
 getTracks 
 (); 
  
 // 
  
 Choose 
  
 the 
  
 first 
  
 text 
  
 track 
  
 to 
  
 be 
  
 active 
  
 by 
  
 its 
  
 ID 
  
 textTracksManager 
 . 
 setActiveByIds 
 ([ 
 tracks 
 [ 
 0 
 ] 
 . 
 trackId 
 ]); 
  
 }); 
 context 
 . 
 start 
 (); 
 

The TextTracksManager class also provides a method getActiveTracks() .

Here is an example of how to select the first text track for a specific language:

  const 
  
 context 
  
 = 
  
 cast 
 . 
 framework 
 . 
 CastReceiverContext 
 . 
 getInstance 
 (); 
 const 
  
 playerManager 
  
 = 
  
 context 
 . 
 getPlayerManager 
 (); 
 playerManager 
 . 
 addEventListener 
 ( 
  
 cast 
 . 
 framework 
 . 
 events 
 . 
 EventType 
 . 
 PLAYER_LOAD_COMPLETE 
 , 
  
 () 
  
 = 
>  
 { 
  
 const 
  
 textTracksManager 
  
 = 
  
 playerManager 
 . 
 getTextTracksManager 
 (); 
  
 // 
  
 Set 
  
 the 
  
 first 
  
 matching 
  
 language 
  
 text 
  
 track 
  
 to 
  
 be 
  
 active 
  
 textTracksManager 
 . 
 setActiveByLanguage 
 ( 
 'en' 
 ); 
  
 }); 
 context 
 . 
 start 
 (); 
 

The TextTracksManager class also provides a method getTracksByLanguage(language) that returns all tracks for the specified language.

The text language code is retrieved from the media manifest and should follow RFC 5646. Language codes can be presented in 2-character nomenclature (such as "es", "en" or "de"), or 4-character nomenclature (such as "en-us", "es-es" or "fr-ca").

If the media manifest follows a different language code standard, the Web Receiver app needs to convert any incoming requests to that standard. These requests, such as voice commands, use RFC 5646 language codes. The Web Receiver SDK provides an interceptor EDIT_TRACKS_INFO to translate the requests to your manifest's standard:

  const 
  
 context 
  
 = 
  
 cast 
 . 
 framework 
 . 
 CastReceiverContext 
 . 
 getInstance 
 (); 
 const 
  
 playerManager 
  
 = 
  
 context 
 . 
 getPlayerManager 
 (); 
 // 
  
 intercept 
  
 the 
  
 EDIT_TRACKS_INFO 
  
 request 
 playerManager 
 . 
 setMessageInterceptor 
 ( 
 cast 
 . 
 framework 
 . 
 messages 
 . 
 MessageType 
 . 
 EDIT_TRACKS_INFO 
 , 
  
 request 
  
 = 
>  
 { 
  
 // 
  
 write 
  
 logic 
  
 to 
  
 convert 
  
 language 
  
 codes 
  
 here 
 }); 
 context 
 . 
 start 
 (); 
 

The API allows a developer to dynamically add new closed caption tracks, in this case for different languages and out-of-band tracks, and then select a track to be the new active track:

  const 
  
 context 
  
 = 
  
 cast 
 . 
 framework 
 . 
 CastReceiverContext 
 . 
 getInstance 
 (); 
 const 
  
 playerManager 
  
 = 
  
 context 
 . 
 getPlayerManager 
 (); 
 playerManager 
 . 
 addEventListener 
 ( 
  
 cast 
 . 
 framework 
 . 
 events 
 . 
 EventType 
 . 
 PLAYER_LOAD_COMPLETE 
 , 
  
 () 
  
 = 
>  
 { 
  
 // 
  
 Create 
  
 text 
  
 tracks 
  
 object 
  
 const 
  
 textTracksManager 
  
 = 
  
 playerManager 
 . 
 getTextTracksManager 
 (); 
  
 // 
  
 Create 
  
 track 
  
 1 
  
 for 
  
 English 
  
 text 
  
 const 
  
 track1 
  
 = 
  
 textTracksManager 
 . 
 createTrack 
 (); 
  
 track1 
 . 
 trackContentType 
  
 = 
  
 'text/vtt' 
 ; 
  
 track1 
 . 
 trackContentId 
  
 = 
  
 'http://example.com/en.vtt' 
 ; 
  
 track1 
 . 
 language 
  
 = 
  
 'en' 
 ; 
  
 // 
  
 Create 
  
 track 
  
 2 
  
 for 
  
 Spanish 
  
 text 
  
 const 
  
 track2 
  
 = 
  
 textTracksManager 
 . 
 createTrack 
 (); 
  
 const 
  
 track2Id 
  
 = 
  
 track2 
 . 
 trackId 
 ; 
  
 track2 
 . 
 trackContentType 
  
 = 
  
 'text/vtt' 
 ; 
  
 track2 
 . 
 trackContentId 
  
 = 
  
 'http://example.com/spa.vtt' 
 ; 
  
 track2 
 . 
 language 
  
 = 
  
 'spa' 
 ; 
  
 // 
  
 Add 
  
 tracks 
  
 textTracksManager 
 . 
 addTracks 
 ([ 
 track1 
 , 
  
 track2 
 ]); 
  
 // 
  
 Set 
  
 the 
  
 first 
  
 matching 
  
 language 
  
 text 
  
 track 
  
 to 
  
 be 
  
 active 
  
 textTracksManager 
 . 
 setActiveByLanguage 
 ( 
 'en' 
 ); 
  
 }); 
 context 
 . 
 start 
 (); 
 

When playing through ad breaks, any text track selection, such as language, made before a break will persist after the break for the same content, even if the ads are in a different language.

Forced captions

Forced captions or forced narrative is text overlay that is displayed so the viewer can understand when alternative language is used or to clarify audio. Unlike closed captions, a viewer does not need to enable forced captions as they are auto-selected based on the viewer's audio preferences.

To add forced captions to your Cast application, you will need to include it as part of your manifest. In your manifest, set the role of the track to be forced-subtitle . When the Cask SDK picks up these tracks, it will identify them as forced captions. There is no sender work needed as the Cast SDK will separate out forced captions and closed captions. This means a viewer will not be able to select a forced caption.

When closed captions are enabled, forced captions are disabled to prevent overlap of captions. When closed captions are turned off and if forced captions are provided in the manifest, then forced captions are displayed based on the viewer's audio language preference.

Create a Mobile Website
View Site in Mobile | Classic
Share by: