KONTROL ET

ExoPlayer, DASH'i birden fazla kapsayıcı biçimiyle destekler. Medya akışları ayrıştırılmalıdır. Diğer bir deyişle video, ses ve metin DASH manifestinde farklı AdaptationSet öğelerinde tanımlanmalıdır (CEA-608, aşağıdaki tabloda açıklanan bir istisnadır). İçerdiği ses ve video örnek biçimleri de desteklenmelidir (ayrıntılar için örnek biçimler bölümüne bakın).

Özellik Destekleniyor Yorumlar
Kapsayıcılar
FMP4 EVET Yalnızca tekilleştirilmiş akışlar
WebM EVET Yalnızca tekilleştirilmiş akışlar
Matroska EVET Yalnızca tekilleştirilmiş akışlar
MPEG-TS HAYIR Planlanmış destek yok
Kapalı altyazılar
TTML EVET Ham veya ISO/IEC 14496-30'a göre FMP4'e yerleştirilmiştir
WebVTT EVET Ham veya ISO/IEC 14496-30'a göre FMP4'e yerleştirilmiştir
CEA-608 EVET SCTE erişilebilirlik tanımlayıcıları kullanılarak sinyal verildiğinde FMP4'e yerleştirilir
CEA-708 EVET SCTE erişilebilirlik tanımlayıcıları kullanılarak sinyal verildiğinde FMP4'e yerleştirilir
Meta veri
EMSG meta verileri EVET FMP4'e yerleştirilmiş
İçerik koruması
Widevine EVET "cenc" şeması: API 19+; "cbcs" şeması: API 25+
PlayHazır SL2000 EVET Android TV, yalnızca "cenc" şeması
Anahtarı Temizle EVET API 21+, yalnızca "cenc" şeması
Canlı oynatma
Düzenli canlı oynatma EVET
Ultra düşük gecikmeli CMAF canlı oynatma EVET
Common Media Client Data (CMCD) EVET Entegrasyon Rehberi

MediaItem kullanma

DASH akışını oynatmak için DASH modülüne güvenmeniz gerekir.

Kotlin

implementation("androidx.media3:media3-exoplayer-dash:1.3.1")

Modern

implementation "androidx.media3:media3-exoplayer-dash:1.3.1"

Daha sonra, DASH MPD URI'si için bir MediaItem oluşturup oynatıcıya iletebilirsiniz.

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri));
// Prepare the player.
player.prepare();

URI'nız .mpd ile bitmiyorsa içeriğin türünü açık bir şekilde belirtmek için MimeTypes.APPLICATION_MPD öğesini setMimeType/MediaItem.Builder geçirebilirsiniz.

ExoPlayer, hem kullanılabilir bant genişliğini hem de cihaz özelliklerini dikkate alarak manifestte tanımlanan gösterimler arasında otomatik olarak uyum sağlar.

DashMediaSource'u kullanma

Daha fazla özelleştirme seçeneği için DashMediaSource oluşturup MediaItem yerine doğrudan oynatıcıya aktarabilirsiniz.

Kotlin

val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a dash media source pointing to a dash manifest uri.
val mediaSource: MediaSource =
  DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri))
// Create a player instance which gets an adaptive track selector by default.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a dash media source pointing to a dash manifest uri.
MediaSource mediaSource =
    new DashMediaSource.Factory(dataSourceFactory)
        .createMediaSource(MediaItem.fromUri(dashUri));
// Create a player instance which gets an adaptive track selector by default.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

Manifeste erişme

Player.getCurrentManifest yöntemini çağırarak geçerli manifesti alabilirsiniz. DASH için döndürülen nesneyi DashManifest konumuna yayınlamanız gerekir. Manifest her yüklendiğinde Player.Listener için onTimelineChanged geri çağırması da çağrılır. Bu durum, seç-izle içeriklerde bir kez, canlı içeriklerde de pek çok kez gerçekleşir. Aşağıdaki kod snippet'i, manifest dosyası her yüklendiğinde bir uygulamanın nasıl işlem yapabileceğini göstermektedir.

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is DashManifest) {
        // Do something with the manifest.
      }
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          DashManifest dashManifest = (DashManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

Oynatmayı özelleştirme

ExoPlayer, oynatma deneyimini uygulamanızın ihtiyaçlarına göre uyarlamanız için çeşitli yollar sunar. Örnekler için Özelleştirme sayfasına bakın.