Adding playback of Widevine encrypted content
To add playback of Widevine encrypted content to the player:
Add the dependency
com.google.protobuf:protobuf-lite:3.0.1
:GROOVYdependencies { implementation fileTree(dir: 'libs', include: ['*.aar']) implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'com.google.protobuf:protobuf-lite:3.0.1' }
In the
MainActivity.java
file, add the followingimports
:JAVAimport java.util.HashMap; import java.util.Map; import nagra.otv.sdk.OTVVideoView; import nagra.otv.sdk.drm.OTVHttpMediaDrmCallback;
Replace the following code:
JAVAstatic final String TAG = "MainActivity"; private OTVVideoView mOTVVideoView = null; private int mPausePos = 0; private String mVideoURI = "https://d3bqrzf9w11pn3.cloudfront.net/basic_dash_bbb_clear/bbb_public.mpd"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); OTVSDK.load(this); setContentView(R.layout.activity_main); mOTVVideoView = findViewById(R.id.otvVideoView); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; }
With:
JAVAprivate OTVVideoView mOTVVideoView = null; private int mPausePos = 0; private final String STREAM_URI = "https://d3bqrzf9w11pn3.cloudfront.net/basic_dash_bbb_encrypted/bbb_public_android.mpd"; private final String STREAM_TOKEN = "eyJraWQiOiI4MTI0MjUiLCJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ2ZXIiOiIxLjAiLCJ0eXAiOiJDb250ZW50QXV0aFoiLCJjb250ZW50UmlnaHRzIjpbeyJkdXJhdGlvbiI6NzIwMCwiZGVmYXVsdEtjSWRzIjpbIjAyMDgxMTNlLWU2ZTgtNDI0Mi04NjdjLWQ5NjNmNWQ3ODkyMyJdLCJjb250ZW50SWQiOiI0NjgyZjFkNi05ODIwLTQwNmEtOWJhMC03YzAzZGJjZjE5NmMiLCJzdG9yYWJsZSI6dHJ1ZSwiZW5jcnlwdGlvbk1ldGhvZCI6IlJBV19BRVNfMTI4X0NUUl9DRU5DIiwiZGVmYXVsdFVzYWdlUnVsZXMiOnsibWluTGV2ZWwiOjAsIndhdGVybWFya2luZ0VuYWJsZWQiOnRydWUsImltYWdlQ29uc3RyYWludCI6dHJ1ZSwiaGRjcFR5cGUiOiJUWVBFXzEiLCJ1bmNvbXByZXNzZWREaWdpdGFsQ2FwcGluZ1Jlc29sdXRpb24iOiJOT19SRVNUUklDVElPTlMiLCJ1bnByb3RlY3RlZEFuYWxvZ091dHB1dCI6dHJ1ZSwiYW5hbG9nQ2FwcGluZ1Jlc29sdXRpb24iOiJOT19SRVNUUklDVElPTlMiLCJoZGNwIjp0cnVlLCJkZXZpY2VDYXBwaW5nUmVzb2x1dGlvbiI6Ik5PX1JFU1RSSUNUSU9OUyIsImRpZ2l0YWxPbmx5IjpmYWxzZSwidW5wcm90ZWN0ZWREaWdpdGFsT3V0cHV0Ijp0cnVlfX1dfQ.fZpotjTjiddueE_nPVcON0FnJwBO4FecTcYIoMmocnw,eyJrY0lkcyI6WyIwMjA4MTEzZS1lNmU4LTQyNDItODY3Yy1kOTYzZjVkNzg5MjMiXSwidHlwIjoiSldUIiwiZW5jIjoiQTEyOENCQy1IUzI1NiIsImFsZyI6ImRpciIsImtpZCI6IjgxMjQyNSJ9..ntJUOAc-g8sXrGLjZhx-MQ.nHnm-aciNeCz6kwUZEjOQgg-1PsLN1Uc8eYihUv_OUK8EaBoFH7JcdIyB9igEFfR9Cufau_5H-EvTdrmws20_ViWKjUTOZmUn7xPQOmwSftb99-rgd3g4QZO0quHIDB5qiBoKmksts8qDbcMZbr_aKMFIOlzNUUcBwiOvmrGyzo.-zTh5sY7tmbe7Ow94EQT9A"; // The URI for PlayReady servers is different. In the example below replace wvls with prls private final String DRM_URI = "https://vsd02fy1.anycast.nagra.com/VSD02FY1/wvls/contentlicenseservice/v1/licenses"; private final Map<String, String> DRM_HEADERS = new HashMap<>(); { // Server headers // For PlayReady DRM servers, the 'Accept' and 'Content-Type' headers must be set to 'text/xml' instead. DRM_HEADERS.put("Accept", "application/octet-stream"); DRM_HEADERS.put("Content-Type", "application/octet-stream"); DRM_HEADERS.put("nv-tenant-id", "UEX3XJ0I"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mOTVVideoView = findViewById(R.id.otvVideoView); mOTVVideoView.setMediaDrmCallback(mDrmCallback); mOTVVideoView.setVideoPath(STREAM_URI); } private OTVHttpMediaDrmCallback mDrmCallback = new OTVHttpMediaDrmCallback(DRM_URI); { for (Map.Entry<String, String> pair : DRM_HEADERS.entrySet()) { mDrmCallback.setKeyRequestProperty(pair.getKey(), pair.getValue()); } mDrmCallback.setKeyRequestProperty("nv-authorizations", STREAM_TOKEN); // For PlayReady protected content, un-comment the line below to explicitly specify PlayReady DRM. // mDrmCallback.setDrmType(OTVMediaDrmCallback.OTV_DRMTYPE_PLAYREADY); }