Skip to content
On this page

ExoPlayer phiên bản 2.10.x

1. Yêu cầu

Những yêu cầu chung xem ở đây

Yêu cầu khác

  • Thêm địa chi kho chứa thư viện vào tệp build.gradle trong thư mục app.
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. Tích hợp MediaDrmCallback

Vui lòng xem tại MediaCallback

3. Khởi tạo PlayerActivity sử dụng WidevineMediaDrmCallback

Nếu bạn đã có kinh nghiệm sử dụng Exoplayer, vui lòng bỏ qua phần này.

3.1. Khởi tạo 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. Khởi tạo 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. Tích hợp DrmSessionManager vào 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. Tạo ra các 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. Khởi tạo Player với 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. Mã nguồn mẫu

Mã nguồn mẫu