Difference between revisions of "Tizen Player"
| (153 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
| − | The Tizen player is  | + | The Tizen player is used in Media Station X version '''0.1.128''' or higher for all Samsung TVs (2016+ models). In previous versions, the HTML5 player is used. The Tizen player works similar to the HTML5 player, but supports more video formats (e.g. 4k/8k formats) and can be configured via the [[Extended Properties]] of a content item to setup display, buffer, and/or stream settings. Additionally, you can interact with it using the <code>player:commit</code> actions to get the current stream information and/or to select a specific audio/text track. Please see [[#Runtime Usage]] for more information. Some extended properties are dynamic and can also be set via an action at runtime.   | 
| − | + | Most of the extended properties are directly mapped to a corresponding Tizen (i.e. <code>AVPlay</code> API) function. For more information, please visit following links. | |
| + | |||
| + | * <code>AVPlay</code> API: https://developer.samsung.com/smarttv/develop/api-references/samsung-product-api-references/avplay-api.html | ||
| + | * Using <code>AVPlay</code>: https://developer.samsung.com/smarttv/develop/guides/multimedia/media-playback/using-avplay.html | ||
| + | |||
| + | '''Note: All properties are reset if a new video/audio is played. Please also note that you can still use the HTML5 player with a plugin (see [[Video/Audio Plugin#Examples]]). It should be mentioned here that setting the speed only works with the HTML5 player, because the <code>AVPlay</code> API does not support the required speed values.'''  | ||
| == Syntax == | == Syntax == | ||
| {| class="wikitable sortable" | {| class="wikitable sortable" | ||
| − | |+ Property syntax of extended properties for  | + | |+ Property syntax of extended properties for Tizen player | 
| |- | |- | ||
| ! Property !! Value !! Example !! Tizen Function || Dynamic || Since Version || class="unsortable" | Description   | ! Property !! Value !! Example !! Tizen Function || Dynamic || Since Version || class="unsortable" | Description   | ||
| |- | |- | ||
| − | | <code>tizen:buffer:size</code> || <code>{SECONDS}</code> || <code>"tizen:buffer:size":"10"</code> || <code>setBufferingParam("PLAYER_BUFFER_FOR_PLAY", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS});</code><br/><code>setBufferingParam("PLAYER_BUFFER_FOR_RESUME", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS});</code> || No || data-sort-value=128|'''0.1.128''' | + | | <code>tizen:buffer:size</code> || <code>{SECONDS}</code> || <code>"tizen:buffer:size": "10"</code> || <code>setBufferingParam("PLAYER_BUFFER_FOR_PLAY", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS});</code><br/><code>setBufferingParam("PLAYER_BUFFER_FOR_RESUME", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS});</code> || No || data-sort-value=128|'''0.1.128''' | 
| − | |  | + | | Sets up the initial and resume buffer size in seconds. The default buffer size is <code>"10"</code>. Please see <code>AVPlay</code> API for possible values. | 
| + | |- | ||
| + | | <code>tizen:buffer:size:init</code> || <code>{SECONDS}</code> || <code>"tizen:buffer:size:init": "10"</code> || <code>setBufferingParam("PLAYER_BUFFER_FOR_PLAY", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS});</code> || No || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up the initial buffer size in seconds. The default buffer size is <code>"10"</code>. Please see <code>AVPlay</code> API for possible values. | ||
| + | |- | ||
| + | | <code>tizen:buffer:size:resume</code> || <code>{SECONDS}</code> || <code>"tizen:buffer:size:resume": "10"</code> || <code>setBufferingParam("PLAYER_BUFFER_FOR_RESUME", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS});</code> || No || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up the resume buffer size in seconds. The default buffer size is <code>"10"</code>. Please see <code>AVPlay</code> API for possible values. | ||
| + | |- | ||
| + | | <code>tizen:buffer:timeout</code> || <code>{SECONDS}</code> || <code>"tizen:buffer:timeout": "20"</code> || <code>setTimeoutForBuffering({SECONDS});</code> || '''Yes''' || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up the buffer timeout in seconds. The default buffer timeout is <code>"20"</code>. Please see <code>AVPlay</code> API for possible values. | ||
| + | |- | ||
| + | | <code>tizen:display:area</code> || <code>{REL_X},{REL_Y},{REL_W},{REL_H}</code> || <code>"tizen:display:area": "0,0,1,1"</code><br/><code>"tizen:display:area": "0.125,0,0.75,1"</code><br/><code>"tizen:display:area": "0,0.119,1,0.762"</code> || <code>setDisplayRect({ABS_X}, {ABS_Y}, {ABS_W}, {ABS_H});</code> || '''Yes''' || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up the display area with relative coordinates. The default area is <code>"0,0,1,1"</code>, which fills the entire screen. Please see <code>AVPlay</code> API for possible values. | ||
| + | |||
| + | '''Note: If this property is set, the property <code>tizen:display:mode</code> will be set to <code>"PLAYER_DISPLAY_MODE_FULL_SCREEN"</code>, which fills the entire area (by stretching the video image).''' | ||
| + | |- | ||
| + | | <code>tizen:display:mode</code> || <code>{DISPLAY_MODE}</code> || <code>"tizen:display:mode": "PLAYER_DISPLAY_MODE_LETTER_BOX"</code><br/><code>"tizen:display:mode": "PLAYER_DISPLAY_MODE_FULL_SCREEN"</code><br/><code>"tizen:display:mode": "PLAYER_DISPLAY_MODE_AUTO_ASPECT_RATIO"</code> || <code>setDisplayMethod({DISPLAY_MODE});</code> || '''Yes''' || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up the display mode. The default mode is <code>"PLAYER_DISPLAY_MODE_LETTER_BOX"</code>, which fills the entire screen (by keeping the video aspect ratio). Please see <code>AVPlay</code> API for possible values. | ||
| + | |||
| + | '''Note: If this property is set, the property <code>tizen:display:area</code> will be set to <code>"0,0,1,1"</code>.''' | ||
| + | |- | ||
| + | | <code>tizen:load</code> || <code>{ACTION}</code> || <code>"tizen:load": "info:Tizen player loaded."</code> || n/a || No || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up an action that is executed if the player is loaded (i.e. the internal state is <code>"IDLE"</code>). Please see <code>AVPlay</code> API for more information. | ||
| + | |- | ||
| + | | <code>tizen:ready</code> || <code>{ACTION}</code> || <code>"tizen:ready": "info:Tizen player ready."</code> || n/a || '''Yes''' || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up an action that is executed if the player is ready (i.e. the internal state is <code>"READY"</code>). Please see <code>AVPlay</code> API for more information. | ||
| + | |- | ||
| + | | <code>tizen:start</code> || <code>{ACTION}</code> || <code>"tizen:start": "info:Tizen player started."</code> || n/a || '''Yes''' || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up an action that is executed if the player is started (i.e. the internal state is <code>"PLAYING"</code> or <code>"PAUSED"</code>). Please see <code>AVPlay</code> API for more information. | ||
| + | |- | ||
| + | | <code>tizen:stream:{STREAM_TYPE}</code> || <code>{STREAM_VALUE}</code> || <code>"tizen:stream:PREBUFFER_MODE": "5000"</code><br/><code>"tizen:stream:ADAPTIVE_INFO": "FIXED_MAX_RESOLUTION=7680X4320"</code><br/><code>"tizen:stream:ADAPTIVE_INFO": "BITRATES=5000~10000{{pipe}}STARTBITRATE=HIGHEST{{pipe}}SKIPBITRATE=LOWEST"</code> || <code>setStreamingProperty({STREAM_TYPE}, {STREAM_VALUE});</code> || No || data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up a stream specific property. Please see <code>AVPlay</code> API for possible values. | ||
| + | |- | ||
| + | | <code>tizen:subtitle:delay</code> || <code>{MILLISECONDS}</code> || <code>"tizen:subtitle:delay": "500"</code> || <code>setSubtitlePosition({MILLISECONDS});</code> || '''Yes''' || data-sort-value=141|'''0.1.141''' | ||
| + | | Sets up a subtitle delay in milliseconds to adjust the synchronization with the video/audio. The default delay is <code>"0"</code>. Please see <code>AVPlay</code> API for more information. | ||
| + | |- | ||
| + | | <code>tizen:subtitle:hidden</code> || <code>{BOOLEAN_VALUE}</code> || <code>"tizen:subtitle:hidden": "true"</code> || n/a || '''Yes''' || data-sort-value=145|'''0.1.145''' | ||
| + | | Shows/Hides the in-app subtitles. The default value is <code>"false"</code>. | ||
| + | |- | ||
| + | | <code>tizen:subtitle:silent</code> || <code>{BOOLEAN_VALUE}</code> || <code>"tizen:subtitle:silent": "true"</code> || <code>setSilentSubtitle({BOOLEAN_VALUE});</code> || '''Yes''' || data-sort-value=141|'''0.1.141''' | ||
| + | | Shows/Hides the subtitles. The default value is <code>"false"</code>. Please see <code>AVPlay</code> API for more information. | ||
| + | |||
| + | '''Note: If the <code>tizen:subtitle:url</code> or <code>tizen:track:text</code> property is set, this property will be set to <code>"false"</code>.''' | ||
| + | |- | ||
| + | | <code>tizen:subtitle:style:color</code> || <code>{STYLE_COLOR}</code> || <code>"tizen:subtitle:style:color": "white"</code><br/><code>"tizen:subtitle:style:color": "yellow"</code><br/><code>"tizen:subtitle:style:color": "black"</code> || n/a || '''Yes''' || data-sort-value=153|'''0.1.153''' | ||
| + | | Sets up the in-app subtitle style color. The default value is <code>"white"</code>. | ||
| + | |- | ||
| + | | <code>tizen:subtitle:style:size</code> || <code>{STYLE_SIZE}</code> || <code>"tizen:subtitle:style:size": "extra-small"</code><br/><code>"tizen:subtitle:style:size": "small"</code><br/><code>"tizen:subtitle:style:size": "medium"</code><br/><code>"tizen:subtitle:style:size": "large"</code><br/><code>"tizen:subtitle:style:size": "extra-large"</code> || n/a || '''Yes''' || data-sort-value=153|'''0.1.153''' | ||
| + | | Sets up the in-app subtitle style size. The default value is <code>"medium"</code>. | ||
| + | |- | ||
| + | | <code>tizen:subtitle:style:type</code> || <code>{STYLE_TYPE}</code> || <code>"tizen:subtitle:style:type": "border"</code><br/><code>"tizen:subtitle:style:type": "shadow"</code><br/><code>"tizen:subtitle:style:type": "box"</code> || n/a || '''Yes''' || data-sort-value=153|'''0.1.153''' | ||
| + | | Sets up the in-app subtitle style type. The default value is <code>"border"</code>. | ||
| + | |- | ||
| + | | <code>tizen:subtitle:type</code> || <code>{SUBTITLE_TYPE}</code> || <code>"tizen:subtitle:type": "html"</code><br/><code>"tizen:subtitle:type": "plain"</code> || n/a || '''Yes''' || data-sort-value=145|'''0.1.145''' | ||
| + | | Sets up the in-app subtitle type. By default, Samsung TVs provide subtitles in the HTML format, therefore, the default type is <code>"html"</code> (which means that subtitles will not be HTML-escaped). However, it is not clear whether this applies to all subtitle files and all TV models. Therefore, it is also possible to set the type to <code>"plain"</code> (which means that subtitles will be HTML-escaped). | ||
| |- | |- | ||
| − | | <code>tizen: | + | | <code>tizen:subtitle:url</code> || <code>{SUBTITLE_URL}</code> || <code>"tizen:subtitle:url": "http://msx.benzac.de/media/sintel/en.srt"</code> || <code>setExternalSubtitlePath({SUBTITLE_FILE});</code> || '''Yes''' || data-sort-value=141|'''0.1.141''' | 
| − | |  | + | | Sets up an external subtitle file. Please see <code>AVPlay</code> API for more information. | 
| + | |||
| + | '''Note: Subtitle files should be specified in the SubRip Text (SRT) format.''' | ||
| |- | |- | ||
| − | | <code>tizen: | + | | <code>tizen:track:audio</code> || <code>{TRACK_INDEX}</code> || <code>"tizen:track:audio": "1"</code> || <code>setSelectTrack("AUDIO", {TRACK_INDEX});</code> || '''Yes''' || data-sort-value=128|'''0.1.128''' | 
| − | |  | + | | Selects an audio track by indicating the index. Please see <code>AVPlay</code> API for more information. | 
| |- | |- | ||
| − | | <code>tizen: | + | | <code>tizen:track:text</code> || <code>{TRACK_INDEX}</code> || <code>"tizen:track:text": "1"</code> || <code>setSelectTrack("TEXT", {TRACK_INDEX});</code> || '''Yes''' || data-sort-value=128|'''0.1.128''' | 
| − | |  | + | | Selects a text track by indicating the index. Please see <code>AVPlay</code> API for more information. | 
| |} | |} | ||
| + | |||
| + | == Runtime Usage == | ||
| + | It is possible to request data from the Tizen player (e.g. from an interaction plugin) and/or to set some extended properties via an action at runtime. | ||
| + | |||
| + | === Actions === | ||
| + | {| class="wikitable sortable" | ||
| + | |+ Action syntax for Tizen player | ||
| + | |- | ||
| + | ! Syntax & Example !! Data !! Tizen Function !! Since Version !! Description  | ||
| + | |- | ||
| + | |  | ||
| + | <code>player:commit:message:{PROPERTY}:{VALUE}</code><br/>  | ||
| + | <code>player:commit:message:tizen:buffer:timeout:20</code><br/> | ||
| + | <code>player:commit:message:tizen:display:area:0,0,1,1</code><br/> | ||
| + | <code>player:commit:message:tizen:subtitle:hidden:true</code><br/> | ||
| + | <code>player:commit:message:tizen:subtitle:silent:true</code><br/> | ||
| + | <code>player:commit:message:tizen:subtitle:style:size:large</code><br/> | ||
| + | <code>player:commit:message:tizen:subtitle:url:http://msx.benzac.de/media/sintel/en.srt</code><br/> | ||
| + | <code>player:commit:message:tizen:track:audio:1</code><br/> | ||
| + | <code>player:commit:message:tizen:track:text:1</code><br/> | ||
| + | | n/a | ||
| + | | n/a | ||
| + | | data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up an extended property during runtime. | ||
| + | |||
| + | '''Note: Only the dynamic properties can be set at runtime.''' | ||
| + | |||
| + | Please see [[#Syntax]] for more information. | ||
| + | |- | ||
| + | | <code>player:commit</code> ||  | ||
| + | <syntaxhighlight lang="json"> | ||
| + | { | ||
| + |    "key": "{PROPERTY}", | ||
| + |    "value": "{VALUE}", | ||
| + |    "action": "{ACTION}", | ||
| + |    "data": null | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | | n/a | ||
| + | | data-sort-value=128|'''0.1.128''' | ||
| + | | Sets up an extended property during runtime and optionally executes an action on completion. | ||
| + | |||
| + | '''Note: Only the dynamic properties can be set at runtime.''' | ||
| + | |||
| + | Please see [[#Syntax]] for more information. | ||
| + | |- | ||
| + | |  | ||
| + | <code>interaction:commit:response:request:player:tizen:info</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:info:base</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:info:display</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:info:buffer</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:info:subtitle</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:info:stream</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:info:tracks</code><br/> | ||
| + | | n/a | ||
| + | |  | ||
| + | <code>getVersion();</code><br/> | ||
| + | <code>getState();</code><br/> | ||
| + | <code>getCurrentStreamInfo();</code><br/> | ||
| + | <code>getTotalTrackInfo();</code><br/> | ||
| + | | data-sort-value=128|'''0.1.128''' | ||
| + | | Requests info data from the player and commits the response to an interaction plugin. Please see <code>AVPlay</code> API for more information. For the response data structure, please see [[#Response Examples]]. | ||
| + | |- | ||
| + | |  | ||
| + | <code>interaction:commit:response:request:player:tizen:property:{STREAM_TYPE}</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:property:IS_LIVE</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:property:AVAILABLE_BITRATE</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:property:GET_LIVE_DURATION</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:property:CURRENT_BANDWIDTH</code><br/> | ||
| + | | n/a | ||
| + | | <code>getStreamingProperty({STREAM_TYPE});</code> | ||
| + | | data-sort-value=128|'''0.1.128''' | ||
| + | | Requests a stream specific property from the player and commits the response to an interaction plugin. Please see <code>AVPlay</code> API for more information. For the response data structure, please see [[#Response Examples]]. | ||
| + | |- | ||
| + | |  | ||
| + | <code>interaction:commit:response:request:player:tizen:properties:{STREAM_TYPE}{{pipe}}{STREAM_TYPE}{{pipe}}{STREAM_TYPE}</code><br/> | ||
| + | <code>interaction:commit:response:request:player:tizen:properties:IS_LIVE{{pipe}}AVAILABLE_BITRATE{{pipe}}GET_LIVE_DURATION</code><br/> | ||
| + | | n/a | ||
| + | | <code>getStreamingProperty({STREAM_TYPE});</code> | ||
| + | | data-sort-value=128|'''0.1.128''' | ||
| + | | Requests multiple stream specific properties from the player and commits the response to an interaction plugin. Please see <code>AVPlay</code> API for more information. For the response data structure, please see [[#Response Examples]]. | ||
| + | |} | ||
| + | |||
| + | === Response Examples === | ||
| + | '''Note: Please note that no action-related <code>data</code> property is used for all response examples. Therefore, the committed <code>data</code> property is always <code>null</code>.''' | ||
| + | {| class="wikitable" | ||
| + | |+ Response examples for Tizen player | ||
| + | |- | ||
| + | ! Action Example !! Response Example | ||
| + | |- | ||
| + | | | ||
| + | <code>interaction:commit:response:request:player:tizen:info</code><br/> | ||
| + | | | ||
| + | <syntaxhighlight lang="json"> | ||
| + | { | ||
| + |     "response": { | ||
| + |         "tizen": { | ||
| + |             "info": { | ||
| + |                 "version": "1.0", | ||
| + |                 "state": "PLAYING", | ||
| + |                 "display": { | ||
| + |                     "area": "0,0,1,1", | ||
| + |                     "mode": "PLAYER_DISPLAY_MODE_LETTER_BOX" | ||
| + |                 }, | ||
| + |                 "buffer": { | ||
| + |                     "timeout": 20, | ||
| + |                     "size": { | ||
| + |                         "init": 10, | ||
| + |                         "resume": 10 | ||
| + |                     } | ||
| + |                 }, | ||
| + |                 "subtitle": { | ||
| + |                     "delay": 0, | ||
| + |                     "silent": false, | ||
| + |                     "hidden": false, | ||
| + |                     "type": "html", | ||
| + |                     "style": { | ||
| + |                         "size": "medium", | ||
| + |                         "color": "white", | ||
| + |                         "type": "border" | ||
| + |                     }, | ||
| + |                     "url": null | ||
| + |                 }, | ||
| + |                 "stream": { | ||
| + |                     "video": { | ||
| + |                         "index": 0, | ||
| + |                         "info": { | ||
| + |                             "fourCC": "H264", | ||
| + |                             "Width": 1920, | ||
| + |                             "Height": 1080, | ||
| + |                             "Bit_rate": 477000 | ||
| + |                         } | ||
| + |                     }, | ||
| + |                     "audio": { | ||
| + |                         "index": 1, | ||
| + |                         "info": { | ||
| + |                             "language": "eng", | ||
| + |                             "channels": 2, | ||
| + |                             "sample_rate": 44100, | ||
| + |                             "bit_rate": 96000, | ||
| + |                             "fourCC": "AACL" | ||
| + |                         } | ||
| + |                     }, | ||
| + |                     "text": { | ||
| + |                         "index": 2, | ||
| + |                         "info": { | ||
| + |                             "track_num": 0, | ||
| + |                             "track_lang": "eng", | ||
| + |                             "subtitle_type": -1, | ||
| + |                             "fourCC": "TTML" | ||
| + |                         } | ||
| + |                     } | ||
| + |                 }, | ||
| + |                 "tracks": { | ||
| + |                     "video": [{ | ||
| + |                             "index": 0, | ||
| + |                             "info": { | ||
| + |                                 "fourCC": "H264", | ||
| + |                                 "Width": 1920, | ||
| + |                                 "Height": 1080, | ||
| + |                                 "Bit_rate": 477000 | ||
| + |                             } | ||
| + |                         }], | ||
| + |                     "audio": [{ | ||
| + |                             "index": 1, | ||
| + |                             "info": { | ||
| + |                                 "language": "eng", | ||
| + |                                 "channels": 2, | ||
| + |                                 "sample_rate": 44100, | ||
| + |                                 "bit_rate": 96000, | ||
| + |                                 "fourCC": "AACL" | ||
| + |                             } | ||
| + |                         }], | ||
| + |                     "text": [{ | ||
| + |                             "index": 2, | ||
| + |                             "info": { | ||
| + |                                 "track_num": 0, | ||
| + |                                 "track_lang": "eng", | ||
| + |                                 "subtitle_type": -1, | ||
| + |                                 "fourCC": "TTML" | ||
| + |                             } | ||
| + |                         }] | ||
| + |                 } | ||
| + |             } | ||
| + |         } | ||
| + |     }, | ||
| + |     "error": null, | ||
| + |     "data": null | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |- | ||
| + | | | ||
| + | <code>interaction:commit:response:request:player:tizen:property:IS_LIVE</code><br/> | ||
| + | | | ||
| + | <syntaxhighlight lang="json"> | ||
| + | { | ||
| + |     "response": { | ||
| + |         "tizen": { | ||
| + |             "property": { | ||
| + |                 "type": "IS_LIVE", | ||
| + |                 "value": "0" | ||
| + |             } | ||
| + |         } | ||
| + |     }, | ||
| + |     "error": null, | ||
| + |     "data": null | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |- | ||
| + | | | ||
| + | <code>interaction:commit:response:request:player:tizen:properties:IS_LIVE{{pipe}}AVAILABLE_BITRATE{{pipe}}GET_LIVE_DURATION</code><br/> | ||
| + | | | ||
| + | <syntaxhighlight lang="json"> | ||
| + | { | ||
| + |     "response": { | ||
| + |         "tizen": { | ||
| + |             "properties": [{ | ||
| + |                     "type": "IS_LIVE", | ||
| + |                     "value": "0" | ||
| + |                 }, { | ||
| + |                     "type": "AVAILABLE_BITRATE", | ||
| + |                     "value": "" | ||
| + |                 }, { | ||
| + |                     "type": "GET_LIVE_DURATION", | ||
| + |                     "value": "" | ||
| + |                 }] | ||
| + |         } | ||
| + |     }, | ||
| + |     "error": null, | ||
| + |     "data": null | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |} | ||
| + | |||
| + | == Example == | ||
| + | This example uses an interaction plugin to interact with the Tizen player. You can use it as is or integrate it into your existing interaction plugin. Please have a look at following implementation scripts. | ||
| + | * https://msx.benzac.de/interaction/js/tizen.js | ||
| + | * https://msx.benzac.de/interaction/js/tizen-player.js | ||
| + | |||
| + | === Screenshot === | ||
| + | [[File:tizen_player.png|thumb|640px|none|Example Screenshot (Tizen Player)]] | ||
| + | |||
| + | === Code === | ||
| + | <syntaxhighlight lang="json"> | ||
| + | { | ||
| + |     "type": "list", | ||
| + |     "headline": "Tizen Player Test", | ||
| + |     "template": {        | ||
| + |         "type": "separate", | ||
| + |         "layout": "0,0,2,4",        | ||
| + |         "color": "msx-glass", | ||
| + |         "properties": { | ||
| + |             "tizen:buffer:size": "10", | ||
| + |             "tizen:buffer:timeout": "20",           | ||
| + |             "tizen:load": "logger:debug:Tizen player loaded.", | ||
| + |             "tizen:ready": "logger:debug:Tizen player ready.", | ||
| + |             "tizen:start": "logger:debug:Tizen player started.",             | ||
| + |             "button:content:icon": "build", | ||
| + |             "button:content:action": "content:request:interaction:init@http://msx.benzac.de/interaction/tizen.html"			 | ||
| + |         } | ||
| + |     }, | ||
| + |     "items": [{ | ||
| + |             "icon": "msx-white-soft:movie", | ||
| + |             "title": "Video 1", | ||
| + |             "playerLabel": "Video 1", | ||
| + |             "action": "video:http://msx.benzac.de/media/video1.mp4" | ||
| + |         }, { | ||
| + |             "icon": "msx-white-soft:movie", | ||
| + |             "title": "Video 2", | ||
| + |             "playerLabel": "Video 2", | ||
| + |             "action": "video:http://msx.benzac.de/media/video2.mp4" | ||
| + |         }, { | ||
| + |             "icon": "msx-white-soft:movie", | ||
| + |             "title": "Video 3", | ||
| + |             "playerLabel": "Video 3", | ||
| + |             "action": "video:http://msx.benzac.de/media/video3.mp4" | ||
| + |         }, { | ||
| + |             "offset": "0,0,0,-1", | ||
| + |             "icon": "msx-white-soft:music-note", | ||
| + |             "background": "http://msx.benzac.de/img/bg1.jpg", | ||
| + |             "title": "Audio 1", | ||
| + |             "playerLabel": "Audio 1", | ||
| + |             "action": "audio:http://msx.benzac.de/media/audio1.mp3" | ||
| + |         }, { | ||
| + |             "offset": "0,0,0,-1", | ||
| + |             "icon": "msx-white-soft:music-note", | ||
| + |             "background": "http://msx.benzac.de/img/bg2.jpg", | ||
| + |             "title": "Audio 2", | ||
| + |             "playerLabel": "Audio 2", | ||
| + |             "action": "audio:http://msx.benzac.de/media/audio2.mp3" | ||
| + |         }, { | ||
| + |             "offset": "0,0,0,-1", | ||
| + |             "icon": "msx-white-soft:music-note", | ||
| + |             "background": "http://msx.benzac.de/img/bg3.jpg", | ||
| + |             "title": "Audio 3", | ||
| + |             "playerLabel": "Audio 3", | ||
| + |             "action": "audio:http://msx.benzac.de/media/audio3.mp3" | ||
| + |         }, { | ||
| + |             "icon": "msx-white-soft:subtitles", | ||
| + |             "title": "Sintel",       | ||
| + |             "titleFooter": "0.1.145+", | ||
| + |             "playerLabel": "Sintel © copyright Blender Foundation | durian.blender.org", | ||
| + |             "action": "video:http://msx.benzac.de/media/sintel/sintel.mp4", | ||
| + |             "properties": { | ||
| + |                 "resume:position": "102", | ||
| + |                 "label:extension": "{ico:msx-white:subtitles} EN", | ||
| + |                 "tizen:subtitle:url": "http://msx.benzac.de/media/sintel/en.srt",           | ||
| + |                 "button:content:icon": "build", | ||
| + |                 "button:content:action": "content:request:interaction:init@http://msx.benzac.de/interaction/tizen.html",           | ||
| + |                 "button:speed:icon": "subtitles", | ||
| + |                 "button:speed:action": "panel:http://msx.benzac.de/info/xp/data/tizen_test_subtitles.json" | ||
| + |             } | ||
| + |         }] | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | === Demo === | ||
| + | * Launch via App: https://msx.benzac.de/?start=content:https://msx.benzac.de/info/xp/data/tizen_test.json | ||
| + | * Launch via Demo Page: https://msx.benzac.de/info/?start=content:https://msx.benzac.de/info/xp/data/tizen_test.json | ||
| + | |||
| + | '''Note: This demo will only work properly on a Samsung TV (2016+ model) with Media Station X 0.1.128 or higher.''' | ||
Latest revision as of 08:45, 2 January 2024
The Tizen player is used in Media Station X version 0.1.128 or higher for all Samsung TVs (2016+ models). In previous versions, the HTML5 player is used. The Tizen player works similar to the HTML5 player, but supports more video formats (e.g. 4k/8k formats) and can be configured via the Extended Properties of a content item to setup display, buffer, and/or stream settings. Additionally, you can interact with it using the player:commit actions to get the current stream information and/or to select a specific audio/text track. Please see #Runtime Usage for more information. Some extended properties are dynamic and can also be set via an action at runtime. 
Most of the extended properties are directly mapped to a corresponding Tizen (i.e. AVPlay API) function. For more information, please visit following links.
- AVPlayAPI: https://developer.samsung.com/smarttv/develop/api-references/samsung-product-api-references/avplay-api.html
- Using AVPlay: https://developer.samsung.com/smarttv/develop/guides/multimedia/media-playback/using-avplay.html
Note: All properties are reset if a new video/audio is played. Please also note that you can still use the HTML5 player with a plugin (see Video/Audio Plugin#Examples). It should be mentioned here that setting the speed only works with the HTML5 player, because the AVPlay API does not support the required speed values. 
Syntax[edit]
| Property | Value | Example | Tizen Function | Dynamic | Since Version | Description | 
|---|---|---|---|---|---|---|
| tizen:buffer:size | {SECONDS} | "tizen:buffer:size": "10" | setBufferingParam("PLAYER_BUFFER_FOR_PLAY", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS});setBufferingParam("PLAYER_BUFFER_FOR_RESUME", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS}); | No | 0.1.128 | Sets up the initial and resume buffer size in seconds. The default buffer size is "10". Please seeAVPlayAPI for possible values. | 
| tizen:buffer:size:init | {SECONDS} | "tizen:buffer:size:init": "10" | setBufferingParam("PLAYER_BUFFER_FOR_PLAY", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS}); | No | 0.1.128 | Sets up the initial buffer size in seconds. The default buffer size is "10". Please seeAVPlayAPI for possible values. | 
| tizen:buffer:size:resume | {SECONDS} | "tizen:buffer:size:resume": "10" | setBufferingParam("PLAYER_BUFFER_FOR_RESUME", "PLAYER_BUFFER_SIZE_IN_SECOND", {SECONDS}); | No | 0.1.128 | Sets up the resume buffer size in seconds. The default buffer size is "10". Please seeAVPlayAPI for possible values. | 
| tizen:buffer:timeout | {SECONDS} | "tizen:buffer:timeout": "20" | setTimeoutForBuffering({SECONDS}); | Yes | 0.1.128 | Sets up the buffer timeout in seconds. The default buffer timeout is "20". Please seeAVPlayAPI for possible values. | 
| tizen:display:area | {REL_X},{REL_Y},{REL_W},{REL_H} | "tizen:display:area": "0,0,1,1""tizen:display:area": "0.125,0,0.75,1""tizen:display:area": "0,0.119,1,0.762" | setDisplayRect({ABS_X}, {ABS_Y}, {ABS_W}, {ABS_H}); | Yes | 0.1.128 | Sets up the display area with relative coordinates. The default area is "0,0,1,1", which fills the entire screen. Please seeAVPlayAPI for possible values.Note: If this property is set, the property  | 
| tizen:display:mode | {DISPLAY_MODE} | "tizen:display:mode": "PLAYER_DISPLAY_MODE_LETTER_BOX""tizen:display:mode": "PLAYER_DISPLAY_MODE_FULL_SCREEN""tizen:display:mode": "PLAYER_DISPLAY_MODE_AUTO_ASPECT_RATIO" | setDisplayMethod({DISPLAY_MODE}); | Yes | 0.1.128 | Sets up the display mode. The default mode is "PLAYER_DISPLAY_MODE_LETTER_BOX", which fills the entire screen (by keeping the video aspect ratio). Please seeAVPlayAPI for possible values.Note: If this property is set, the property  | 
| tizen:load | {ACTION} | "tizen:load": "info:Tizen player loaded." | n/a | No | 0.1.128 | Sets up an action that is executed if the player is loaded (i.e. the internal state is "IDLE"). Please seeAVPlayAPI for more information. | 
| tizen:ready | {ACTION} | "tizen:ready": "info:Tizen player ready." | n/a | Yes | 0.1.128 | Sets up an action that is executed if the player is ready (i.e. the internal state is "READY"). Please seeAVPlayAPI for more information. | 
| tizen:start | {ACTION} | "tizen:start": "info:Tizen player started." | n/a | Yes | 0.1.128 | Sets up an action that is executed if the player is started (i.e. the internal state is "PLAYING"or"PAUSED"). Please seeAVPlayAPI for more information. | 
| tizen:stream:{STREAM_TYPE} | {STREAM_VALUE} | "tizen:stream:PREBUFFER_MODE": "5000""tizen:stream:ADAPTIVE_INFO": "FIXED_MAX_RESOLUTION=7680X4320""tizen:stream:ADAPTIVE_INFO": "BITRATES=5000~10000|STARTBITRATE=HIGHEST|SKIPBITRATE=LOWEST" | setStreamingProperty({STREAM_TYPE}, {STREAM_VALUE}); | No | 0.1.128 | Sets up a stream specific property. Please see AVPlayAPI for possible values. | 
| tizen:subtitle:delay | {MILLISECONDS} | "tizen:subtitle:delay": "500" | setSubtitlePosition({MILLISECONDS}); | Yes | 0.1.141 | Sets up a subtitle delay in milliseconds to adjust the synchronization with the video/audio. The default delay is "0". Please seeAVPlayAPI for more information. | 
| tizen:subtitle:hidden | {BOOLEAN_VALUE} | "tizen:subtitle:hidden": "true" | n/a | Yes | 0.1.145 | Shows/Hides the in-app subtitles. The default value is "false". | 
| tizen:subtitle:silent | {BOOLEAN_VALUE} | "tizen:subtitle:silent": "true" | setSilentSubtitle({BOOLEAN_VALUE}); | Yes | 0.1.141 | Shows/Hides the subtitles. The default value is "false". Please seeAVPlayAPI for more information.Note: If the  | 
| tizen:subtitle:style:color | {STYLE_COLOR} | "tizen:subtitle:style:color": "white""tizen:subtitle:style:color": "yellow""tizen:subtitle:style:color": "black" | n/a | Yes | 0.1.153 | Sets up the in-app subtitle style color. The default value is "white". | 
| tizen:subtitle:style:size | {STYLE_SIZE} | "tizen:subtitle:style:size": "extra-small""tizen:subtitle:style:size": "small""tizen:subtitle:style:size": "medium""tizen:subtitle:style:size": "large""tizen:subtitle:style:size": "extra-large" | n/a | Yes | 0.1.153 | Sets up the in-app subtitle style size. The default value is "medium". | 
| tizen:subtitle:style:type | {STYLE_TYPE} | "tizen:subtitle:style:type": "border""tizen:subtitle:style:type": "shadow""tizen:subtitle:style:type": "box" | n/a | Yes | 0.1.153 | Sets up the in-app subtitle style type. The default value is "border". | 
| tizen:subtitle:type | {SUBTITLE_TYPE} | "tizen:subtitle:type": "html""tizen:subtitle:type": "plain" | n/a | Yes | 0.1.145 | Sets up the in-app subtitle type. By default, Samsung TVs provide subtitles in the HTML format, therefore, the default type is "html"(which means that subtitles will not be HTML-escaped). However, it is not clear whether this applies to all subtitle files and all TV models. Therefore, it is also possible to set the type to"plain"(which means that subtitles will be HTML-escaped). | 
| tizen:subtitle:url | {SUBTITLE_URL} | "tizen:subtitle:url": "http://msx.benzac.de/media/sintel/en.srt" | setExternalSubtitlePath({SUBTITLE_FILE}); | Yes | 0.1.141 | Sets up an external subtitle file. Please see AVPlayAPI for more information.Note: Subtitle files should be specified in the SubRip Text (SRT) format. | 
| tizen:track:audio | {TRACK_INDEX} | "tizen:track:audio": "1" | setSelectTrack("AUDIO", {TRACK_INDEX}); | Yes | 0.1.128 | Selects an audio track by indicating the index. Please see AVPlayAPI for more information. | 
| tizen:track:text | {TRACK_INDEX} | "tizen:track:text": "1" | setSelectTrack("TEXT", {TRACK_INDEX}); | Yes | 0.1.128 | Selects a text track by indicating the index. Please see AVPlayAPI for more information. | 
Runtime Usage[edit]
It is possible to request data from the Tizen player (e.g. from an interaction plugin) and/or to set some extended properties via an action at runtime.
Actions[edit]
| Syntax & Example | Data | Tizen Function | Since Version | Description | 
|---|---|---|---|---|
| 
 | n/a | n/a | 0.1.128 | Sets up an extended property during runtime. Note: Only the dynamic properties can be set at runtime. Please see #Syntax for more information. | 
| player:commit | {
   "key": "{PROPERTY}",
   "value": "{VALUE}",
   "action": "{ACTION}",
   "data": null
}
 | n/a | 0.1.128 | Sets up an extended property during runtime and optionally executes an action on completion. Note: Only the dynamic properties can be set at runtime. Please see #Syntax for more information. | 
| 
 | n/a | 
 | 0.1.128 | Requests info data from the player and commits the response to an interaction plugin. Please see AVPlayAPI for more information. For the response data structure, please see #Response Examples. | 
| 
 | n/a | getStreamingProperty({STREAM_TYPE}); | 0.1.128 | Requests a stream specific property from the player and commits the response to an interaction plugin. Please see AVPlayAPI for more information. For the response data structure, please see #Response Examples. | 
| 
 | n/a | getStreamingProperty({STREAM_TYPE}); | 0.1.128 | Requests multiple stream specific properties from the player and commits the response to an interaction plugin. Please see AVPlayAPI for more information. For the response data structure, please see #Response Examples. | 
Response Examples[edit]
Note: Please note that no action-related data property is used for all response examples. Therefore, the committed data property is always null.
| Action Example | Response Example | 
|---|---|
| 
 | {
    "response": {
        "tizen": {
            "info": {
                "version": "1.0",
                "state": "PLAYING",
                "display": {
                    "area": "0,0,1,1",
                    "mode": "PLAYER_DISPLAY_MODE_LETTER_BOX"
                },
                "buffer": {
                    "timeout": 20,
                    "size": {
                        "init": 10,
                        "resume": 10
                    }
                },
                "subtitle": {
                    "delay": 0,
                    "silent": false,
                    "hidden": false,
                    "type": "html",
                    "style": {
                        "size": "medium",
                        "color": "white",
                        "type": "border"
                    },
                    "url": null
                },
                "stream": {
                    "video": {
                        "index": 0,
                        "info": {
                            "fourCC": "H264",
                            "Width": 1920,
                            "Height": 1080,
                            "Bit_rate": 477000
                        }
                    },
                    "audio": {
                        "index": 1,
                        "info": {
                            "language": "eng",
                            "channels": 2,
                            "sample_rate": 44100,
                            "bit_rate": 96000,
                            "fourCC": "AACL"
                        }
                    },
                    "text": {
                        "index": 2,
                        "info": {
                            "track_num": 0,
                            "track_lang": "eng",
                            "subtitle_type": -1,
                            "fourCC": "TTML"
                        }
                    }
                },
                "tracks": {
                    "video": [{
                            "index": 0,
                            "info": {
                                "fourCC": "H264",
                                "Width": 1920,
                                "Height": 1080,
                                "Bit_rate": 477000
                            }
                        }],
                    "audio": [{
                            "index": 1,
                            "info": {
                                "language": "eng",
                                "channels": 2,
                                "sample_rate": 44100,
                                "bit_rate": 96000,
                                "fourCC": "AACL"
                            }
                        }],
                    "text": [{
                            "index": 2,
                            "info": {
                                "track_num": 0,
                                "track_lang": "eng",
                                "subtitle_type": -1,
                                "fourCC": "TTML"
                            }
                        }]
                }
            }
        }
    },
    "error": null,
    "data": null
}
 | 
| 
 | {
    "response": {
        "tizen": {
            "property": {
                "type": "IS_LIVE",
                "value": "0"
            }
        }
    },
    "error": null,
    "data": null
}
 | 
| 
 | {
    "response": {
        "tizen": {
            "properties": [{
                    "type": "IS_LIVE",
                    "value": "0"
                }, {
                    "type": "AVAILABLE_BITRATE",
                    "value": ""
                }, {
                    "type": "GET_LIVE_DURATION",
                    "value": ""
                }]
        }
    },
    "error": null,
    "data": null
}
 | 
Example[edit]
This example uses an interaction plugin to interact with the Tizen player. You can use it as is or integrate it into your existing interaction plugin. Please have a look at following implementation scripts.
Screenshot[edit]
Code[edit]
{
    "type": "list",
    "headline": "Tizen Player Test",
    "template": {       
        "type": "separate",
        "layout": "0,0,2,4",       
        "color": "msx-glass",
        "properties": {
            "tizen:buffer:size": "10",
            "tizen:buffer:timeout": "20",          
            "tizen:load": "logger:debug:Tizen player loaded.",
            "tizen:ready": "logger:debug:Tizen player ready.",
            "tizen:start": "logger:debug:Tizen player started.",            
            "button:content:icon": "build",
            "button:content:action": "content:request:interaction:init@http://msx.benzac.de/interaction/tizen.html"			
        }
    },
    "items": [{
            "icon": "msx-white-soft:movie",
            "title": "Video 1",
            "playerLabel": "Video 1",
            "action": "video:http://msx.benzac.de/media/video1.mp4"
        }, {
            "icon": "msx-white-soft:movie",
            "title": "Video 2",
            "playerLabel": "Video 2",
            "action": "video:http://msx.benzac.de/media/video2.mp4"
        }, {
            "icon": "msx-white-soft:movie",
            "title": "Video 3",
            "playerLabel": "Video 3",
            "action": "video:http://msx.benzac.de/media/video3.mp4"
        }, {
            "offset": "0,0,0,-1",
            "icon": "msx-white-soft:music-note",
            "background": "http://msx.benzac.de/img/bg1.jpg",
            "title": "Audio 1",
            "playerLabel": "Audio 1",
            "action": "audio:http://msx.benzac.de/media/audio1.mp3"
        }, {
            "offset": "0,0,0,-1",
            "icon": "msx-white-soft:music-note",
            "background": "http://msx.benzac.de/img/bg2.jpg",
            "title": "Audio 2",
            "playerLabel": "Audio 2",
            "action": "audio:http://msx.benzac.de/media/audio2.mp3"
        }, {
            "offset": "0,0,0,-1",
            "icon": "msx-white-soft:music-note",
            "background": "http://msx.benzac.de/img/bg3.jpg",
            "title": "Audio 3",
            "playerLabel": "Audio 3",
            "action": "audio:http://msx.benzac.de/media/audio3.mp3"
        }, {
            "icon": "msx-white-soft:subtitles",
            "title": "Sintel",      
            "titleFooter": "0.1.145+",
            "playerLabel": "Sintel © copyright Blender Foundation | durian.blender.org",
            "action": "video:http://msx.benzac.de/media/sintel/sintel.mp4",
            "properties": {
                "resume:position": "102",
                "label:extension": "{ico:msx-white:subtitles} EN",
                "tizen:subtitle:url": "http://msx.benzac.de/media/sintel/en.srt",          
                "button:content:icon": "build",
                "button:content:action": "content:request:interaction:init@http://msx.benzac.de/interaction/tizen.html",          
                "button:speed:icon": "subtitles",
                "button:speed:action": "panel:http://msx.benzac.de/info/xp/data/tizen_test_subtitles.json"
            }
        }]
}
Demo[edit]
- Launch via App: https://msx.benzac.de/?start=content:https://msx.benzac.de/info/xp/data/tizen_test.json
- Launch via Demo Page: https://msx.benzac.de/info/?start=content:https://msx.benzac.de/info/xp/data/tizen_test.json
Note: This demo will only work properly on a Samsung TV (2016+ model) with Media Station X 0.1.128 or higher.
