The Transport Stream (TS) protocol specifies a container format for encapsulating packetized elementary streams, with error correction and synchronization pattern features.
Samsung Hospitality Display devices support RTP/UDP live streaming in the following ways:
In addition, you can play content in several rotation modes, or control closed captions within the streaming content.
udp://IP:Port
rtp://IP:Port
Multicast address rules: The address range between 234.0.0.0 and 238.255.255.255 is recommended for streaming. The first 3 octets of the IPv4 address range must be same for a group, and the last octet needs to be unique for multicast streams. For example, 235.10.1.xxx The address ranges 224.x.x.x and 239.x.x.x must not be used for multicast streams.
Multicast address rules:
Clear Transport Stream playback refers to playing streaming content without DRM.
To play streaming content without DRM, use the AVPlayExtension API.
To use this API, include the "avplayextension.js" file in the "index.html" file.
<script type="text/javascript" src="$WEBAPIS/avplayextension/avplayextension.js"></script>
Sample code:
var player = webapis.avplay; var url ="udp://<IP>:<Port>"; var listener = function() { onevent: function(eventType, eventData) { console.log("event type error : " + eventType + ", data: " + eventData); }, ondrmevent: function(drmEvent, drmData) { console.log("DRM callback: " + drmEvent + ", data: " + drmData); }, onerror: function(eventType) { console.log("event type error : " + eventType); } } try { player.open(url); player.setDisplayRect(0, 0, 1920, 1080); player.setListener(listener); player.prepareAsync(function() { player.play(); }); } catch (error) { console.log("Error name = "+ error.name + ", Error message = " + error.message); }
You can also play streaming content that has been encrypted with DRM. You can refer to the supported streaming protocols and DRMs here.
Before you can play encrypted content, you must first execute the setDrm() method.
setDrm()
The security privilege must be declared in the "config.xml" file:
<tizen privilege name="http://developer.samsung.com/privilege/drmplay"/>
var player = webapis.avplay; var url = "udp://231.1.1:12345"; var listener = function() { onevent: function(eventType, eventData) { console.log("event type error : " + eventType + ", data: " + eventData); }, ondrmevent: function(drmEvent, drmData) { console.log("DRM callback: " + drmEvent + ", data: " + drmData); }, onerror: function(eventType) { console.log("event type error : " + eventType); } } var drmParam = { LYNKServer:"NONE", // No LYNK server required type: "1" }; try { player.open(url); player.setDisplayRect(0, 0, 1920, 1080); player.setListener(listener); player.setDrm("LYNK", "Initialize", JSON.stringify(drmParam)); player.prepareAsync(function() { player.play(); }); } catch (error) { console.log("Error name = "+ error.name + ", Error message = " + error.message); }
You can change the streaming content orientation using the setDisplayRotation() method of the AVPlay API.
setDisplayRotation()
The following orientation values are supported:
PLAYER_DISPLAY_ROTATION_NONE
PLAYER_DISPLAY_ROTATION_90
PLAYER_DISPLAY_ROTATION_180
PLAYER_DISPLAY_ROTATION_270
webapis.avplay.setDisplayRotation("PLAYER_DISPLAY_ROTATION_NONE");
The TvInfo API is needed to enable or disable captions in streams containing them. This API is supported for US device models.
Use the AVPlayExtension API to play streaming content.
Use the TvInfo API to enable or disable closed captions in the stream.
To use these APIs, include the WebAPI libraries in the "index.html" file.
<head> <script type="text/javascript" src="$WEBAPIS/webapis/webapis.js"></script> </head>
var player = webapis.avplay; var url = "udp://231.1.1.21:12345"; var rtpUrl = "rtp://239.10.10.21:12345"; //Listener for Player var listener = { onbufferingstart: function() { console.log("Buffering started"); }, onbufferingprogress: function(percent) { document.getElementById('test').innerHTML = '<br/>'+'Buffering progress, '+percent+' percent<br/>'; console.log("Buffering progress "+percent+" percent"); }, onbufferingcomplete: function() { console.log("Buffering completed"); }, oncurrentplaytime: function(currentTime) { //console.log("current playtime :: " + currentTime); }, onevent: function(eventType, eventData) { console.log("onevent " + eventType + " data " + eventData); }, onstreamcompleted: function() { console.log("Stream completed"); }, onerror: function(eventType) { console.log("Error has occurred: "+eventType); }, onsubtitlechange: function(duration, text, data3, data4) { console.log("Subtitle changed: duration = "+duration+" | text = "+text+" | data3 = "+data3+" | data4 = "+data4); }, ondrmevent: function(drmEvent, drmData) { console.log("DRM callback: " + drmEvent + ", data: " + drmData); } }; // Start playback for streaming var play = function(url) { try { player.open(url); player.setDisplayRect(0, 0, 1920, 1080); player.setListener(listener); player.prepareAsync(function() { player.play(); }); } catch (error) { console.log("Could not play the requested URL: "+url+" - exception occurred:"+error+" Error name = "+ error.name + ", Error message = " + error.message); } }; // Stop playback for streaming function stop() { try { if (player.getState() !== 'NONE') { player.stop(); } } catch (error) { console.log("Could not stop the requested URL: "+url+" - exception occurred:"+error+" Error name = "+ error.name + ", Error message = " + error.message); } } // Call sequence for enabling closed captions in streaming var key = webapis.tvinfo.TvInfoMenuKey.CAPTION_ONOFF_KEY; console.log('key:'+ key); var value = webapis.tvinfo.TvInfoMenuValue.CAPTION_ON; console.log('value:'+ value); var onsuccess = function() { console.log("Captions enabled"); }; var onerror = function() { console.log("Error has occurred"); }; webapis.tvinfo.setMenuValue(key, value, onsuccess, onerror); // Call sequence for disabling closed captions in streaming var key = webapis.tvinfo.TvInfoMenuKey.CAPTION_ONOFF_KEY; console.log('key:'+ key); var value = webapis.tvinfo.TvInfoMenuValue.CAPTION_OFF; console.log('value:'+ value); var onsuccess = function() { console.log("Captions disabled"); }; var onerror = function() { console.log("Error has occurred"); }; webapis.tvinfo.setMenuValue(key, value, onsuccess, onerror);