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.
Oynatıcı durumu
Player
arayüzünü uygulayan bir medya oynatıcının durumu esas olarak 4 bilgi kategorisinden oluşur:
- Oynatma durumu
getPlaybackState()
ile alın.- Arayüz tarafından tanımlanan durum değeri
STATE_IDLE
,STATE_BUFFERING
,STATE_READY
veSTATE_ENDED
şeklindedir.
- Medya öğeleri oynatma listesi
- Oynatma için
MediaItem
örnek dizisi. getCurrentTimeline()
ile alPlayer
örnekleri,MediaItem
ekleme veya kaldırma gibi oynatma listesi işlem yöntemleri vegetCurrentMediaItem()
gibi kolaylık yöntemleri sağlayabilir.
- Oynatma için
- 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ğeritrue
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 durumuSTATE_READY
,playWhenReady
true
ise ve oynatma atlatılmamışsatrue
olur.
- Aşağıdakiler dahil oynatma konumu:
- Geçerli medya öğesi dizini:
Oynatma listesindeki geçerli
MediaItem
öğesinin dizini. isPlayingAd
: Araya eklenen bir reklamın oynatılıp oynatılmadığının göstergesi.- Mevcut oynatma konumu:
Geçerli
MediaItem
veya eklenen reklam içindeki mevcut oynatma konumu.
- Geçerli medya öğesi dizini:
Oynatma listesindeki geçerli
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:
play()
,pause()
,prepare()
vestop()
gibi temel oynatma kontrolleri.addMediaItem()
veyaremoveMediaItem()
gibi oynatma listesi işlemleri.- Geçerli öğeyi veya konumu değiştirmek için Aranıyor.
- Tekrar modlarını ve karıştırma modunu ayarlayın.
- Kanal seçimi tercihlerini güncelleyin.
- Oynatma hızını ayarlayın.
Ö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.