Oynatıcı Arayüzü

Oynatıcı, uygulamanızın medya öğelerinin oynatılmasını kolaylaştıran bileşenidir. Media3 Player arayüzü, genellikle bir oynatıcının kullandığı işlevlerin ana hatlarını oluşturur. Bunlardan bazıları:

  • Oynatma, duraklatma ve sarma gibi oynatma kontrollerini etkileme
  • Oynatılmakta olan medyanın, oynatma konumu gibi özelliklerini sorgulama
  • Medya öğeleri oynatma listesini/sırasını yönetme
  • Karıştırma, tekrarlama, hız ve ses düzeyi gibi oynatma özelliklerini yapılandırma
  • Video ekranda oluşturuluyor

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

Bileşenler arasında ortak bir arayüz

Media3'teki bazı bileşenler Oynatıcı 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ını göndermek için bir MediaSession ile etkileşim kurar. Player ve MediaSession, oynatıcınızın kullanıcı arayüzünün bulunduğu Activity veya Fragment dışında bir Service içindeyse PlayerView kullanıcı arayüzünüz için MediaController öğenizi oynatıcı olarak atayabilirsiniz. Oynatma ve oynatma listesi yöntemi çağrıları, MediaSession aracılığıyla Player cihazınıza gönderilir.
MediaBrowser MediaController tarafından sunulan işlevlere ek olarak, mevcut medya içeriklerine göz atmak için bir MediaLibrarySession ile etkileşimde bulunur.
ForwardingPlayer Yöntem çağrılarını başka bir Player öğesine yönlendiren Player uygulaması. İlgili yöntemleri geçersiz kılarak belirli işlemleri gizlemek 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ı. MediaSession bağlamak istediğiniz özel oynatıcıyı kullanırken işinize yarar.
CastPlayer Cast alıcı uygulamasıyla iletişim kuran bir Player uygulaması. Davranış, temel Yayın oturumuna bağlıdır.

MediaSession, Player arayüzünü uygulamasa da oluştururken Player gerektirir. Amacı, diğer işlemlerden veya iş parçacıklarından Player öğesine erişim sağlamaktır.

Media3 oynatma mimarisi

Bir Player öğesine erişiminiz varsa oynatma komutları yayınlamak için doğrudan bu öğenin yöntemlerini çağırmanız gerekir. MediaSession kullanarak oynatmanızın reklamını yapabilir ve harici kaynaklara oynatma kontrolü verebilirsiniz. Bu harici kaynaklar, medya oturumuna bağlanmayı ve oynatma komutu istekleri yayınlamayı 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. Böylece oynatıcınızı, uygulamanızda oynatma kontrolü kullanıcı arayüzünü içeren Etkinlik'ten ayırabilirsiniz. Bu, bir medya denetleyici kullanmanızı gerektirebilir.

Media3 oynatma bileşenlerinin medya uygulaması mimarisiyle etkileşimini gösteren şema.
Ş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 esas olarak 4 bilgi kategorisinden oluşur:

  1. Oynatma durumu
  2. Medya öğeleri oynatma listesi
  3. Oynatma/duraklatma özellikleri. Örneğin:
    • playWhenReady: Kullanıcının, medyanın mümkün olduğunda oynatılmasını mı, yoksa duraklatılmış mı kalmasını istediğinin bir göstergesi
    • Oynatmayı engelleme nedeni: playWhenReady değeri true olsa bile, geçerliyse oynatmanın neden engellendiğine dair bir gösterge
    • isPlaying: Oynatıcının oynamakta olup olmadığının göstergesi. Bu gösterge, yalnızca oynatma durumu STATE_READY, playWhenReady true ise ve oynatma atlatılmamışsa true olur.
  4. Aşağıdakiler dahil oynatma konumu:

Buna ek olarak, Player arayüzü oynatmanın kullanılabilir parçalara, medya meta verilerine, oynatma hızına, ses düzeyine ve oynatmanın diğer yardımcı özelliklerine erişim sağlar.

Değişiklikleri dinleme

Player içindeki değişiklikleri dinlemek için Player.Listener kullanın. İşleyici oluşturma ve kullanma ile ilgili ayrıntılar için Oynatıcı etkinlikleri ile ilgili ExoPlayer belgelerine bakın.

İşleyici arayüzünün normal oynatma ilerlemesini izlemek için herhangi bir geri çağırma içermediğini unutmayın. İlerleme çubuğu kullanıcı arayüzü ayarlamak gibi işlemlerde oynatma ilerleme durumunu sürekli izlemek için geçerli 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);
}

Çalmayı denetleme

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

Özel Player uygulamaları

Özel oynatıcı oluşturmak için Media3'e dahil olan SimpleBasePlayer öğesini genişletebilirsiniz. Bu sınıf, uygulamanız gereken yöntem sayısını en aza indirmek için Player arayüzünün temel uygulamasını sağlar.

getState() yöntemini geçersiz kılarak başlayın. Bu yöntem, çağrıldığında mevcut oynatıcı durumunu aşağıdakilerle doldurur:

  • Kullanılabilir komutlar grubu
  • Oynatma durumu STATE_READY olduğunda oynatıcının oynamaya başlayıp başlamayacağı, şu anda oynatılan medya öğesinin dizini ve geçerli öğe içindeki 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ğerleri kombinasyonuyla oluşturulmasını zorunlu kılar. Ayrıca dinleyicileri ve dinleyicileri durum değişiklikleri hakkında bilgilendirir. Durum güncellemesini manuel olarak tetiklemeniz gerekiyorsa invalidateState() numaralı telefonu 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.