PageSourceSearch

https://www.vdocipher.com/docs/assets/js/354f7076.c517cbb4.js

js vdocipher.com collected 2026-10-02 02:45:54 UTC 6,151 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[5987],{28453:(e,n,a)=>{a.d(n,{R:()=>o,x:()=>r});var i=a(96540);const t={},s=i.createContext(t);function o(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),i.createElement(s.Provider,{value:n},e.children)}},71945:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>s,metadata:()=>r,toc:()=>h});var i=a(74848),t=a(28453);const s={title:"Making of a DRM player",hide_table_of_contents:!0,slug:"/drm/player"},o=void 0,r={id:"drm/player/overview",title:"Making of a DRM player",description:"A video player should be capable of handling DRM key exchanges for it to be able",source:"@site/docs/drm/player/overview.md",sourceDirName:"drm/player",slug:"/drm/player",permalink:"/docs/drm/player",draft:!1,unlisted:!1,tags:[],version:"current",frontMatter:{title:"Making of a DRM player",hide_table_of_contents:!0,slug:"/drm/player"},sidebar:"drm",previous:{title:"Periodic Key Renewal heart-beat",permalink:"/docs/drm/license/heart-beat"},next:{title:"Widevine quick sample",permalink:"/docs/drm/player/shaka-wv-sample"}},l={},h=[{value:"Recommendations",id:"recommendations",level:2},{value:"Shaka player",id:"shaka-player",level:3},{value:"DashIF Player",id:"dashif-player",level:3},{value:"About the key exchange",id:"about-the-key-exchange",level:2},{value:"Doing it yourself",id:"doing-it-yourself",level:2}];function d(e){const n={a:"a",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",ul:"ul",...(0,t.R)(),...e.components},{Head:a}=n;return a||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex"})}),"\n",(0,i.jsx)(n.p,{children:"A video player should be capable of handling DRM key exchanges for it to be able\nto play encryption videos. This is how a typical workflow looks like."}),"\n",(0,i.jsx)("img",{src:"/img/player-drm-sequence.png",style:{maxWidth:"min(800px, 100%)"},alt:"Player flow diagram"}),"\n",(0,i.jsx)(n.p,{children:"When playing a DRM encrypted video, a video player will ask for three things"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"URL to the manifest file of the video"}),"\n",(0,i.jsx)(n.li,{children:"Name of the DRM system to use"}),"\n",(0,i.jsx)(n.li,{children:"URL of the License"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Out of the above, the manifest URL and DRM system does not change for each session. DRM system is to be evaluated\nbased on the browser and DRM availability. Chrome, Firefox and Edge support Widevine while Safari supports Fairplay."}),"\n",(0,i.jsxs)(n.p,{children:["The license URL should change for each playback session. It contains a very short-term authorisation to play the\nvideo. Each time the player loads, it should fetch this URL from the backend. The URL consists of two parts, a\npolicy and a signature. The policy defines the restrictions applied to the URL. The signature is generated on the\napplication server. The application server should be configured to generate this URL only after the logged-in user\nhas been authenticated, and the access to the content has been verified.\n",(0,i.jsx)(n.a,{href:"/docs/drm/license",children:"Instructions for generating License URL"})]}),"\n",(0,i.jsx)(n.h2,{id:"recommendations",children:"Recommendations"}),"\n",(0,i.jsx)(n.h3,{id:"shaka-player",children:"Shaka player"}),"\n",(0,i.jsx)(n.p,{children:"Shaka player is a video player maintained by google which supports multiple DRM systems including Widevine and Fairplay.\nThe player provides a number of configuration options along with a native looking UI."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://shaka-player-demo.appspot.com/docs/api/index.html",children:"Official docs"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://shaka-player-demo.appspot.com/demo",children:"Demo"})}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"dashif-player",children:"DashIF Player"}),"\n",(0,i.jsx)(n.p,{children:"This is another player maintained by a consortium of different c
1ompanies (called DASH Industry Forum). It also has many\nAPI options and UI to get you started in no time."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://dashif.org/software/",children:"Official docs"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://reference.dashif.org/dash.js/latest/samples/index.html",children:"Demo"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"about-the-key-exchange",children:"About the key exchange"}),"\n",(0,i.jsx)(n.p,{children:"During DRM playback, there is a key-exchange that happens between the CDM and the license server. Check the exchange\nbetween the player, browser and VdoCipher in the diagram above."}),"\n",(0,i.jsx)(n.p,{children:"The key exchange for Widevine is pretty straight-forward and even without any options, there is a simple exchange of\nbinary blobs that take place by default. If you use one of the sample page, this is API which will be used. In the\ncase of Fairplay, the key-exchange itself is not standardised as in Widevine. There is an API which will give the\nlicense-request and another which consumes the license-response. The exchange of this information is brokered by the\njavascript application. To make this easier, we also provide a javascript code to make the playback simple."}),"\n",(0,i.jsx)(n.h2,{id:"doing-it-yourself",children:"Doing it yourself"}),"\n",(0,i.jsx)(n.p,{children:"It is possible to skip on other video players and make it yourself. You can use the EME extensions to make it work.\nHowever, we recommend using one of the existing open-source players to begin with."})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.