{"id":2201,"date":"2021-10-09T11:28:52","date_gmt":"2021-10-09T09:28:52","guid":{"rendered":"https:\/\/alax.info\/blog\/?p=2201"},"modified":"2021-10-09T11:28:52","modified_gmt":"2021-10-09T09:28:52","slug":"playready-drm-in-streamingserver-application-via-mse-eme","status":"publish","type":"post","link":"https:\/\/alax.info\/blog\/2201","title":{"rendered":"PlayReady DRM in StreamingServer application via MSE\/EME"},"content":{"rendered":"\n<p>One more video streaming scenario is added to PoC StreamingServer\u00c2\u00a0application: ability to stream DRM-enabled content with playback via <a href=\"https:\/\/www.w3.org\/TR\/media-source\/\">Media Source Extensions (MSE)<\/a> and <a href=\"https:\/\/w3c.github.io\/encrypted-media\/\">Encrypted Media Extensions EME<\/a> interface and by-frame data appendage in JavaScript.<\/p>\n\n\n\n<p>DRM scenarios are typically handled by JavaScript streaming media players such as <a href=\"https:\/\/castlabs.com\/prestoplay\/web-apps\/\">castLabs PRESTOplay for Web Apps<\/a>, where JavaScript player gets evrything together: the player, HTML MSE\/EME, support for streaming media formats, player experience, advanced features, visual styling, DRM server integration.<\/p>\n\n\n\n<p>Opposite to this, StreamingServer is generating <a href=\"https:\/\/www.microsoft.com\/playready\/\">PlayReady<\/a> protected video stream live and client side JavaScript code handles EME in vanilla JavaScript.<\/p>\n\n\n\n<p>Microsoft Edge navigated to http:\/\/localhost\/hls\/playready-A.html picks a page with the code and loads live-generated video frame by frame from an application integrated with web server, then feeds data into HTML5 video element handling EME events as they appear.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1540\" style=\"aspect-ratio: 2408 \/ 1540;\" width=\"2408\" controls src=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2021\/10\/3.mp4\"><\/video><figcaption>HTML5 MSE\/EME PlayReady DRM aware player<\/figcaption><\/figure>\n\n\n\n<p>The video above, of course, does not show the video itself because DRM-enabled content is rednered with restrictions:  no snapshots allowed, and APIs like <a href=\"https:\/\/docs.microsoft.com\/en-us\/windows-hardware\/drivers\/display\/desktop-duplication-api\">Desktop Duplication<\/a> and <a href=\"https:\/\/docs.microsoft.com\/en-us\/uwp\/api\/windows.graphics.capture\">Windows.Graphics.Capture<\/a> have the repsective regions blacked out. <a href=\"https:\/\/www.microsoft.com\/en-us\/p\/simple-screen-recorder\/9n5mvvbd0tgw\">Simple Screen Recorder<\/a> used to take video above shows black where the content is visible physically.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Download links<\/h3>\n\n\n\n<p>Binaries:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li> 64-bit: <a href=\"https:\/\/alax.info\/blog\/wp-content\/uploads\/2021\/10\/StreamingServer-20211009-d287fa9c7dd8280d2d5d4a5a5625879afdaef048.zip\">StreamingServer.exe<\/a> (in .ZIP archive)<\/li><li> License: This software is free to use; builds have time based expiration<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>One more video streaming scenario is added to PoC StreamingServer\u00c2\u00a0application: ability to stream DRM-enabled content with playback via Media Source Extensions (MSE) and Encrypted Media Extensions EME interface and by-frame data appendage in JavaScript. DRM scenarios are typically handled by JavaScript streaming media players such as castLabs PRESTOplay for Web Apps, where JavaScript player gets&hellip; <\/p>\n<p><a class=\"moretag\" href=\"https:\/\/alax.info\/blog\/2201\">Read the full article<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[622,564,597,611,615],"class_list":["post-2201","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-eme","tag-html5","tag-mse","tag-playready","tag-streamingserver"],"_links":{"self":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/2201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/comments?post=2201"}],"version-history":[{"count":0,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/posts\/2201\/revisions"}],"wp:attachment":[{"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/media?parent=2201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/categories?post=2201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alax.info\/blog\/wp-json\/wp\/v2\/tags?post=2201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}