Oynatıcı Arayüzü

Oynatıcı, uygulamanızda medya öğelerinin oynatılmasını kolaylaştıran bileşendir. Media3 Player arayüzü, genellikle bir oynatıcı tarafından işlenen işlevler için bir ana hat oluşturur. Buna aşağıdakiler dahildir:

  • Oynatma, duraklatma ve sarma gibi oynatma kontrollerini etkileme
  • O anda oynatılan medyanın oynatma konumu gibi özelliklerini sorgulama
  • Medya öğelerinden oluşan bir oynatma listesini/sırayı yönetme
  • Karıştırma, tekrarlama, hız ve ses düzeyi gibi oynatma özelliklerini yapılandırma
  • Videoyu ekrana oluşturma

Media3, Player arayüzünün ExoPlayer adlı bir uygulamasını da sağlar.

Bileşenler arasında ortak bir arayüz

Media3'teki çeşitli bileşenler Player arayüzünü uygular. Örneğin:

Bileşen Açıklama ve davranış notları
ExoPlayer Bir medya oynatıcı API'si ve Player arayüzünün varsayılan uygulaması.
MediaController Oynatma komutları göndermek için MediaSession ile etkileşim kurar. Player ve MediaSession'unuz, oyuncunuzun kullanıcı arayüzünün bulunduğu Activity veya Fragment'ten ayrı bir Service'deyse MediaController'inizi PlayerView kullanıcı arayüzünüzün oyuncusu olarak atayabilirsiniz. Oynatma ve oynatma listesi yöntemi çağrıları, MediaSession üzerinden Player'ünüze gönderilir.
MediaBrowser MediaController tarafından sunulan işlevlere ek olarak, mevcut medya içeriğine göz atmak için MediaLibrarySession ile etkileşim kurar.
ForwardingPlayer Yöntem çağrılarını başka bir Player'e yönlendiren bir Player uygulaması. İlgili yöntemleri geçersiz kılarak belirli işlemleri engellemek veya değiştirmek için bu sınıfı kullanın.
SimpleBasePlayer Uygulanacak yöntem sayısını en aza indiren bir Player uygulaması. Bir MediaSession cihazına bağlamak istediğiniz özel oynatıcı kullanırken faydalıdır.
CastPlayer Cast alıcı uygulamasıyla iletişim kuran bir Player uygulaması. Davranış, temel Cast oturumuna bağlıdır.

MediaSession, Player arayüzünü uygulamasa da oluşturulurken bir Player gerektirir. Amacının, diğer işlemlerden veya iş parçalarından Player'e erişim sağlamak olduğunu belirtmek isteriz.

Media3 oynatma mimarisi

Bir Player'e erişiminiz varsa oynatma komutları vermek için doğrudan yöntemlerini çağırmanız gerekir. MediaSession uygulayarak oynatma işleminizin reklamını yapabilir ve harici kaynaklara oynatma kontrolü verebilirsiniz. Bu harici kaynaklar, medya oturumuna bağlanmayı ve oynatma komutu isteklerini göndermeyi kolaylaştıran bir MediaController uygular.

Arka planda medya oynatırken medya oturumunuzu ve oynatıcınızı ön plan hizmeti olarak çalışan bir MediaSessionService veya MediaLibraryService içinde barındırmanız gerekir. Bunu yaparsanız oynatıcınızı, oynatma kontrolü için kullanıcı arayüzünü içeren uygulamanızdaki Etkinlik'ten ayırabilirsiniz. Bu durumda bir medya kumandası kullanmanız gerekebilir.

Media3 oynatma bileşenlerinin bir medya uygulaması mimarisine nasıl yerleştirildiğini gösteren bir diyagram.
Şekil 1: Player arayüzü, Media3'ün mimarisinde önemli bir rol oynar.

Oynatıcı durumu

Player arayüzünü uygulayan bir medya oynatıcının durumu temel olarak 4 bilgi kategorisinden oluşur:

  1. Oynatma durumu
  2. Medya öğelerinin oynatma listesi
  3. Oynatma/duraklatma özellikleri (ör. şu emojiler):
    • playWhenReady: Kullanıcının medyanın mümkün olduğunda oynatılmasını mı yoksa duraklatılmış kalmasını mı istediğini gösteren bir gösterge
    • Oynatma engelleme nedeni: playWhenReady true olsa bile oynatmanın neden engellendiğini belirten bir gösterge
    • isPlaying: Oynatıcının o anda oynatıp oynamadığını gösteren bir gösterge. Yalnızca oynatma durumu STATE_READY, playWhenReady true ve oynatma devre dışı bırakılmamışsa true değeri gösterilir.
  4. Aşağıdakiler dahil olmak üzere oynatma konumu:

Ayrıca Player arayüzü, mevcut parçalara, medya meta verilerine, oynatma hızına, ses seviyesine ve oynatmanın diğer yardımcı özelliklerine erişmenize olanak tanır.

Değişiklikleri dinleyin

Player'daki değişiklikleri dinlemek için Player.Listener kullanın. Dinleyici oluşturma ve kullanmayla ilgili ayrıntılar için ExoPlayer'ın Oynatıcı etkinlikleri ile ilgili belgelerini inceleyin.

İşleyici arayüzünün normal oynatma ilerlemesini izlemek için geri çağırma içermediğini unutmayın. Oynatma ilerlemesini sürekli olarak izlemek için (ör. ilerleme çubuğu kullanıcı arayüzü oluşturmak için) mevcut konumu uygun aralıklarla sorgulamanız gerekir.

Kotlin

val handler = Handler(Looper.getMainLooper())
fun checkPlaybackPosition(delayMs: Long): Boolean =
  handler.postDelayed(
    {
      val currentPosition = player.currentPosition
      // Update UI based on currentPosition
      checkPlaybackPosition(delayMs)
    },
    delayMs)

Java

Handler handler = new Handler(Looper.getMainLooper());
boolean checkPlaybackPosition(long delayMs) {
    return handler.postDelayed(() -> {
        long currentPosition = player.getCurrentPosition();
        // Update UI based on currentPosition
        checkPlaybackPosition(delayMs);
    }, delayMs);
}

Oynatma seçeneklerini kontrol etme

Player arayüzü, durumu değiştirmek ve oynatmayı kontrol etmek için birçok yol sunar:

Özel Player uygulamaları

Özel bir oynatıcı oluşturmak için Media3'e dahil edilen SimpleBasePlayer öğesini genişletebilirsiniz. Bu sınıf, uygulamanız gereken yöntem sayısını minimuma indirmek için Playerarabirimini temel bir şekilde uygular.

getState() yöntemini geçersiz kılarak başlayın. Bu yöntem, çağrıldığında mevcut oyuncu durumunu doldurmalıdır. Şunlar dahildir:

  • Kullanılabilir komutlar grubu
  • Oynatma durumu STATE_READY olduğunda oynatıcının oynatmaya başlayıp başlamaması, oynatılan medya öğesinin dizini ve mevcut öğedeki oynatma konumu gibi oynatma özellikleri

Kotlin

class CustomPlayer : SimpleBasePlayer(looper) {
  override fun getState(): State {
    return State.Builder()
      .setAvailableCommands(...) // Set which playback commands the player can handle
      // Configure additional playback properties
      .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
      .setCurrentMediaItemIndex(0)
      .setContentPositionMs(0)
      .build()
  }
}

Java

public class CustomPlayer extends SimpleBasePlayer {
  public CustomPlayer(Looper looper) {
    super(looper);
  }

  @Override
  protected State getState() {
    return new State.Builder()
      .setAvailableCommands(...) // Set which playback commands the player can handle
      // Configure additional playback properties
      .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
      .setCurrentMediaItemIndex(0)
      .setContentPositionMs(0)
      .build();
  }
}

SimpleBasePlayer, State öğesinin geçerli bir durum değerlerinin kombinasyonuyla oluşturulmasını zorunlu kılar. Aynı zamanda dinleyicileri ve durum değişiklikleri konusunda dinleyicileri de bilgilendirecek. Durum güncellemesini manuel olarak tetiklemeniz gerekiyorsa invalidateState() numaralı telefondan bizi arayın.

getState() yönteminin ötesinde, yalnızca oynatıcınızın kullanılabilir olduğunu belirttiği komutlar için kullanılan yöntemleri uygulamanız gerekir. Uygulamak istediğiniz işleve karşılık gelen geçersiz kılınabilir işleyici yöntemini bulun. Örneğin, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM ve COMMAND_SEEK_TO_NEXT_MEDIA_ITEM gibi işlemleri desteklemek için handleSeek() yöntemini geçersiz kılın.