ExoPlayer, birden fazla kapsayıcı biçimiyle DASH'i destekler. Medya akışları demux edilmelidir. Yani video, ses ve metin, DASH manifestinde ayrı AdaptationSet öğelerinde tanımlanmalıdır (CEA-608, aşağıdaki tabloda açıklandığı gibi 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 ayrıştırılmış akışlar |
| WebM | EVET | Yalnızca ayrıştırılmış akışlar |
| Matroska | EVET | Yalnızca ayrıştırılmış akışlar |
| MPEG-TS | HAYIR | Destek planlanmadı |
| Altyazılar | ||
| TTML | EVET | ISO/IEC 14496-30'a göre ham veya FMP4'e yerleştirilmiş |
| WebVTT | EVET | ISO/IEC 14496-30'a göre ham veya FMP4'e yerleştirilmiş |
| 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+ |
| PlayReady SL2000 | EVET | Android TV, yalnızca "cenc" şeması |
| ClearKey | EVET | API 21+, yalnızca "cenc" şeması |
| Reklam ekleme | ||
| Çok dönemli oynatma | EVET | |
| Sunucu destekli reklam ekleme (xlinks) | HAYIR | |
| IMA sunucu tarafı ve istemci tarafı reklamlar | EVET | Reklam ekleme kılavuzu |
| Canlı oynatma | ||
| Normal canlı oynatma | EVET | |
| Ultra düşük gecikmeli CMAF canlı oynatma | EVET | |
| Ortak Medya İstemci Verileri (CMCD) | EVET | CMCD entegrasyon kılavuzu |
MediaItem'ı kullanma
DASH akışını oynatmak için DASH modülünü kullanmanız gerekir.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
Modern
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
Ardından, DASH MPD URI için bir MediaItem oluşturup bunu 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ça belirtmek için MediaItem.Builder öğesinin setMimeType parametresine MimeTypes.APPLICATION_MPD değerini iletebilirsiniz.
ExoPlayer, hem kullanılabilir bant genişliğini hem de cihaz özelliklerini dikkate alarak manifestte tanımlanan temsiller arasında otomatik olarak uyum sağlar.
DashMediaSource kullanma
Daha fazla özelleştirme seçeneği için DashMediaSource oluşturabilir ve MediaItem yerine doğrudan oynatıcıya iletebilirsiniz.
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 işlevini çağırarak mevcut manifesti alabilirsiniz.
DASH için döndürülen nesneyi DashManifest olarak yayınlamanız gerekir. Player.Listener öğesinin onTimelineChanged geri çağırma işlevi, manifest her yüklendiğinde de çağrılır. Bu, seç-izle içerikler için bir kez, canlı içerikler için ise muhtemelen birçok kez gerçekleşir. Aşağıdaki kod snippet'i, manifest yüklendiğinde uygulamanın nasıl işlem yapabileceğini gösterir.
Kotlin
player.addListener( object : Player.Listener { override fun onTimelineChanged( timeline: Timeline, @Player.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 birden fazla yöntem sunar. Örnekler için Özelleştirme sayfası'na bakın.