Skip to content
On this page

ExoPlayer version 2.10.x ​

1. Require ​

Some general requirement is here

Prerequisite

  • Add a dependency in the build.gradle file of your app module. The following will add a dependency to the full library:
java
implementation 'com.google.android.exoplayer:exoplayer:2.10.0'
  // If you don't use feature license encrypt, please comment line below
  implementation 'com.sigma.packer:2.10.x:1.0.3'

2. Integrate MediaDrmCallback ​

Please see at MediaCallback

3. Create PlayerActivity using WidevineMediaDrmCallback ​

If you have experience with Exoplayer, then please avoid this chapter.

3.1. Create MediaDrmCallback ​

java
private WidevineMediaDrmCallback createMediaDrmCallback(
  String licenseUrl, String[] keyRequestPropertiesArray) {
  HttpDataSource.Factory licenseDataSourceFactory =
    buildHttpDataSourceFactory();
  WidevineMediaDrmCallback drmCallback =
      new WidevineMediaDrmCallback(licenseUrl, licenseDataSourceFactory);
  if (keyRequestPropertiesArray != null) {
      for (int i = 0; i < keyRequestPropertiesArray.length - 1; i += 2) {
          drmCallback.setKeyRequestProperty(keyRequestPropertiesArray[i],
              keyRequestPropertiesArray[i + 1]);
      }
  }
  return drmCallback;
}

3.2. Create DrmSessionManager ​

java
private DrmSessionManager createDrmSessionManager() {
  DrmSessionManager drmSessionManager;
    if (Util.SDK_INT >= 18) {
      try {
        UUID drmSchemeUuid = Assertions.checkNotNull(Util.getDrmUuid("widevine"));
        MediaDrmCallback drmCallback =
            createMediaDrmCallback(LICENSE_URL, null);
        // FIXME: If you use license encrypt feature please uncomment line below
        // drmSessionManager = new DefaultDrmSessionManager<>(drmSchemeUuid, SigmaMediaDrm.newInstance(drmSchemeUuid), drmCallback, null, true);
        drmSessionManager = new DefaultDrmSessionManager<>(drmSchemeUuid, FrameworkMediaDrm .newInstance(drmSchemeUuid), drmCallback, null, true);
      }
      catch (Exception ex) {
        drmSessionManager = null;
      }
    } else {
      drmSessionManager = null;
    }
    return drmSessionManager;
}

3.3. Integrate DrmSessionManager to MediaSource ​

java
private MediaSource createMediaSource(String mediaUrl) {
    MediaSource mediaSource;
    Uri uri = Uri.parse(mediaUrl);
    @C.ContentType int type = Util.inferContentType(uri, "");
    if (type == C.TYPE_DASH) {
        mediaSource =
            new DashMediaSource.Factory(dataSourceFactory)
                .createMediaSource(uri);
    } else if (type == C.TYPE_OTHER) {
        mediaSource =
            new ProgressiveMediaSource.Factory(dataSourceFactory)
                .createMediaSource(uri);
    } else {
        throw new IllegalStateException();
    }
    return mediaSource;
}

3.4. Build Factory ​

java
public HttpDataSource.Factory buildHttpDataSourceFactory() {
  return new DefaultHttpDataSourceFactory(userAgent);
}
private DataSource.Factory buildDataSourceFactory() {
  DefaultDataSourceFactory upstreamFactory =
    new DefaultDataSourceFactory(this, buildHttpDataSourceFactory());
  return buildReadOnlyCacheDataSource(upstreamFactory, getDownloadCache());
}
private RenderersFactory buildRenderersFactory(boolean preferExtensionDecoders) {
  int extensionRendererMode =
    useExtensionRenderers()
      ? (preferExtensionRenderer
      ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER
      : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
      : DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF;
  return new DefaultRenderersFactory(/* context= */ this)
      .setExtensionRendererMode(extensionRendererMode);
}

3.5. Init Player with MediaSource ​

java
protected boolean initializePlayer() {
  DrmSessionManager drmSessionManager = createDrmSessionManager();

  DataSource.Factory dataSourceFactory = buildDataSourceFactory();
  MediaSource mediaSource = createMediaSource(MEDIA_URL);
  trackSelector = new DefaultTrackSelector(new AdaptiveTrackSelection.Factory());
  DefaultTrackSelector.Parameters trackSelectionParameters =
      new DefaultTrackSelector.ParametersBuilder()
          .setAllowVideoMixedMimeTypeAdaptiveness(true)
          .setAllowVideoNonSeamlessAdaptiveness(true)
          .build();
  player = ExoPlayerFactory.newSimpleInstance(
      /* context= */ this, buildRenderersFactory(true), trackSelector, drmSessionManager);
  playerView.setPlayer(player);
  player.setPlayWhenReady(true);
  player.prepare(mediaSource, true, false);
  return true;
}

4. Sample Code ​

Sample source code