Skip to content
On this page

ExoPlayer version 2.12.x to 2.15.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.12.0'
  // If you don't use feature license encrypt, please comment line below
  implementation 'com.sigma.packer:2.12.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);
      drmSessionManager =
        new DefaultDrmSessionManager.Builder()
            // FIXME: If you use license encrypt feature please uncomment line below
            // .setUuidAndExoMediaDrmProvider(drmSchemeUuid, SigmaMediaDrm.DEFAULT_PROVIDER)
            .setUuidAndExoMediaDrmProvider(drmSchemeUuid, FrameworkMediaDrm.DEFAULT_PROVIDER)
            .setMultiSession(true)
            .build(drmCallback);
    }
    catch (Exception ex) {
      drmSessionManager = null;
    }
  } else {
    drmSessionManager = null;
  }
  return drmSessionManager;
}

3.3. Create Media Item

java
private static List<MediaItem> createMediaItems(String mediaUrl) {
  List<MediaItem> mediaItems = new ArrayList<>();
  mediaItems.add(createMediaItem(mediaUrl));
  return mediaItems;
}

private static MediaItem createMediaItem(String mediaUrl) {
  MediaItem.Builder mediaItem = new MediaItem.Builder();
  mediaItem.setUri(Uri.parse(mediaUrl));
  mediaItem.setDrmUuid(Assertions.checkNotNull(Util.getDrmUuid("widevine")));
  mediaItem.setDrmLicenseUri(MediaInfo.getInstance().licenseUrl());
  mediaItem.setDrmMultiSession(true);
  return mediaItem.build();
}

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();
  trackSelector = new DefaultTrackSelector(this, new AdaptiveTrackSelection.Factory());
  DefaultTrackSelector.Parameters trackSelectionParameters =
    new DefaultTrackSelector.ParametersBuilder(this)
      .setAllowVideoMixedMimeTypeAdaptiveness(true)
      .setAllowVideoNonSeamlessAdaptiveness(true)
      .build();
  MediaSourceFactory mediaSourceFactory =
    new DefaultMediaSourceFactory(dataSourceFactory)
      .setDrmSessionManager(drmSessionManager)
      .setAdViewProvider(playerView);
  player =
    new SimpleExoPlayer.Builder(/* context= */ this, buildRenderersFactory.buildRenderersFactory(true))
      .setMediaSourceFactory(mediaSourceFactory)
      .setTrackSelector(trackSelector)
      .build();
  player.setPlayWhenReady(true);
  playerView.setPlayer(player);
  player.setMediaItems(createMediaItems(MEDIA_URL));
  player.prepare();
  return true;
}

4. Sample Code

Sample source code