Ağ yığınları

ExoPlayer, genellikle internet üzerinden medya aktarmak için kullanılır. Desteklenen yapmak için birden fazla ağ yığını kullanır. Ağ yığını seçiminiz, akış performansını önemli ölçüde etkileyebilir.

Bu sayfada, ExoPlayer'ın tercih ettiğiniz ağ yığınını kullanacak şekilde nasıl yapılandırılacağı ana hatlarıyla açıklanmakta, mevcut seçenekler listelenmekte, uygulamanız için ağ yığınını nasıl seçeceğiniz konusunda bazı bilgiler verilmekte ve aktarılan medya için önbelleğe alma özelliğinin nasıl etkinleştirileceği açıklanmaktadır.

ExoPlayer'ı belirli bir ağ yığınını kullanacak şekilde yapılandırma

ExoPlayer, verileri DataSource bileşeni üzerinden yükler. Bu bileşen Uygulama kodundan yerleştirilen DataSource.Factory örnek.

Uygulamanızın yalnızca http(s) içeriğini oynatması gerekiyorsa bir ağ seçin yığını, seçtiğiniz DataSource.Factory örneğini güncellemek kadar basittir: uygulaması HttpDataSource.Factory öğesinin örneklerine yerleştirilir ağ yığınına karşılık gelen bir satır öğesi seçin. Uygulamanızın yerel dosyalar gibi http(s) dışı içerikleri de oynatması gerekiyorsa DefaultDataSource.Factorykullanın:

Kotlin

DefaultDataSource.Factory(
  ...
  /* baseDataSourceFactory= */ PreferredHttpDataSource.Factory(...))

Java

new DefaultDataSource.Factory(
    ...
    /* baseDataSourceFactory= */ new PreferredHttpDataSource.Factory(...));

Bu örnekte PreferredHttpDataSource.Factory, tercih ettiğiniz ağ yığınına karşılık gelen fabrikadır. DefaultDataSource.Factory katmanı, yerel dosyalar gibi http(s) dışı kaynaklar için destek ekler.

Aşağıdaki örnekte, Cronet ağ yığınını kullanacak ve http(s) dışındaki içeriklerin oynatılmasını da destekleyecek bir ExoPlayer'nin nasıl oluşturulacağı gösterilmektedir.

Kotlin

// Given a CronetEngine and Executor, build a CronetDataSource.Factory.
val cronetDataSourceFactory = CronetDataSource.Factory(cronetEngine, executor)

// Wrap the CronetDataSource.Factory in a DefaultDataSource.Factory, which adds
// in support for requesting data from other sources (such as files, resources,
// etc).
val dataSourceFactory =
  DefaultDataSource.Factory(context, /* baseDataSourceFactory= */ cronetDataSourceFactory)

// Inject the DefaultDataSource.Factory when creating the player.
val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(
      DefaultMediaSourceFactory(context).setDataSourceFactory(dataSourceFactory)
    )
    .build()

Java

// Given a CronetEngine and Executor, build a CronetDataSource.Factory.
CronetDataSource.Factory cronetDataSourceFactory =
    new CronetDataSource.Factory(cronetEngine, executor);

// Wrap the CronetDataSource.Factory in a DefaultDataSource.Factory, which adds
// in support for requesting data from other sources (such as files, resources,
// etc).
DefaultDataSource.Factory dataSourceFactory =
    new DefaultDataSource.Factory(
        context, /* baseDataSourceFactory= */ cronetDataSourceFactory);

// Inject the DefaultDataSource.Factory when creating the player.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setDataSourceFactory(dataSourceFactory))
        .build();

Desteklenen ağ yığınları

ExoPlayer; HttpEngine, Cronet, OkHttp ve Android'in yerleşik varsayılan ağ yığını için doğrudan destek sağlar. ExoPlayer, Android'de çalışan diğer tüm ağ yığınlarını desteklemek için de genişletilebilir.

HttpEngine

HttpEngine, API 34'ten (veya S uzantıları 7'den) itibaren Android'de önerilen varsayılan ağ yığınıdır. Çoğu durumda Cronet ağı yığınını dahili olarak kullanır. QUIC protokolleri üzerinden HTTP, HTTP/2 ve HTTP/3'ü destekler.

ExoPlayer, HttpEngineDataSource.Factory ile HttpEngine'i destekler. Bu veri kaynağı fabrikasını, ExoPlayer'ı belirli bir ağ yığınını kullanacak şekilde yapılandırma bölümünde açıklandığı gibi ekleyebilirsiniz.

Cronet

Cronet, Android uygulamalarına kitaplık olarak sunulan Chromium ağ yığınıdır. Cronet, ExoPlayer tarafından oluşturulanlar da dahil olmak üzere uygulamanızın çalışması için ihtiyaç duyduğu ağ isteklerinin gecikmesini azaltan ve aktarım hızını artıran birden fazla teknolojiden yararlanır. QUIC üzerinden HTTP, HTTP/2 ve HTTP/3'ü yerel olarak destekler. çok önemlidir. Cronet, dünyanın en büyük yayın uygulamalarından bazıları tarafından kullanılır. YouTube da dahil.

ExoPlayer, Cronet kitaplığı aracılığıyla Cronet'i destekler. Nasıl kullanılacağına dair ayrıntılı talimatlar için kitaplığın README.md dokümanına bakın somut olarak ortaya koyar. Cronet kitaplığının temelde üç tane temel Cronet gibi çeşitli özelliklerden bahsedeceğiz:

  1. Google Play Hizmetleri: Bu uygulamayı çoğu yerde kullanmanızı öneririz ve Android'in yerleşik ağ yığınına dönüşüyor Google Play Hizmetleri kullanılamıyorsa (DefaultHttpDataSource).
  2. Kronet Yerleştirilmiş: Kullanıcılarınızın büyük bir yüzdesi varsa iyi bir seçim olabilir Google Play Hizmetleri'nin yaygın olarak kullanılamadığı pazarlarda bulunursanız veya kullanılan Cronet uygulamasının tam sürümünü kontrol etmek istiyorsunuz. İlgili içeriği oluşturmak için kullanılan Cronet Embedded'ın en büyük dezavantajı ise görevlerine yaklaşık 8 MB ek sağlaması en iyi şekilde yararlanabilirsiniz.
  3. Cronet Fallback: Cronet yedek uygulaması, Android'in yerleşik ağ yığınının etrafında bir sarmalayıcı olarak Cronet API'si. Uygulama Android'in yerleşik ağ yığını kullanıldığından ExoPlayer ile birlikte kullanılmamalıdır doğrudan (DefaultHttpDataSource kullanarak) daha verimlidir.

OkHttp

OkHttp, kullanılan başka bir modern ağ yığınıdır. pek çok popüler Android uygulaması tarafından yaygın olarak kullanılmaktadır. HTTP ve HTTP/2, ancak henüz QUIC üzerinden HTTP/3 desteklememektedir.

ExoPlayer, OkHttp kitaplığı aracılığıyla OkHttp'yi destekler. Nasıl kullanılacağına dair ayrıntılı talimatlar için kitaplığın README.md dokümanına bakın somut olarak ortaya koyar. OkHttp kitaplığı kullanıldığında ağ yığını uygulamaya yerleştirilir. Bu, Cronet Embedded'e benzer ancak OkHttp çok daha küçüktür ve uygulamanıza 1 MB'dan az ekler.

Android'in yerleşik ağ yığını

ExoPlayer, temel ExoPlayer kitaplığının bir parçası olan DefaultHttpDataSource ve DefaultHttpDataSource.Factory ile Android'in yerleşik ağ yığınının kullanılmasını destekler.

Ağ yığınının tam olarak uygulanması, temel alınan bir yazılımdır. Çoğu cihazda yalnızca HTTP desteklenir (yani QUIC üzerinden HTTP/2 ve HTTP/3 desteklenmez).

Diğer ağ yığınları

Uygulamalar, ExoPlayer ile diğer ağ yığınlarını da entegre edebilir. Bunu yapmak için, ağ yığınını sarmalayan bir HttpDataSource ile ilgili HttpDataSource.Factory uygulayın. ExoPlayer'ın Cronet'i ve OkHttp kitaplıkları, bunun nasıl yapılacağına ilişkin iyi örneklerdir.

Saf Java ağ yığınıyla entegrasyon yaparken HttpDataSource uygulamanızın doğru şekilde davranıp davranmadığını kontrol etmek için bir DataSourceContractTest uygulamak iyi bir fikirdir. OkHttp kitaplığındaki OkHttpDataSourceContractTest, bunu nasıl yapacağınıza dair iyi bir örnektir.

Ağ yığınını seçme

Aşağıdaki tabloda, ExoPlayer tarafından desteklenen ağ yığınlarının avantajları ve dezavantajları özetlenmiştir.

Ağ yığını Protokoller APK boyutunun etkisi Notlar
HttpEngine HTTP
HTTP/2
QUIC üzerinden HTTP/3
Yok Yalnızca API 34 veya S Uzantıları 7'de kullanılabilir
Cronet (Google Play Hizmetleri) HTTP
HTTP/2
QUIC üzerinden HTTP/3
Küçük
(<100KB)
Google Play Hizmetleri gerekir. Cronet sürümü otomatik olarak güncellendi
Cronet (Yerleşik) HTTP
HTTP/2
QUIC üzerinden HTTP/3
Büyük
(~8 MB)
Uygulama geliştirici tarafından kontrol edilen Cronet sürümü
Cronet (Yedek) HTTP
(cihaza göre değişir)
Küçük
(<100 KB)
ExoPlayer için önerilmez
OkHttp HTTP
HTTP/2
Küçük
(<1MB)
Yerleşik ağ yığını HTTP
(cihaza göre değişir)
Yok Uygulama cihaza göre değişiklik gösterir

QUIC üzerinden HTTP/2 ve HTTP/3 protokolleri, medya aktarma performansını önemli ölçüde artırabilir. Özellikle, içerik yayınlama ağı (CDN) kullanılarak dağıtılan uyarlanabilir medyayı yayınlarken bu protokollerin kullanılmasının CDN'lerin çok daha verimli çalışmasına olanak tanıyabileceği durumlar vardır. Bu nedenle, HttpEngine ve Cronet'in QUIC üzerinden hem HTTP/2 hem de HTTP/3'ü (ve OkHttp'nin HTTP/2'yi) desteklemesi, içeriğin barındırıldığı sunucuların da bu protokolleri desteklemesi koşuluyla Android'in yerleşik ağ yığınını kullanmaya kıyasla önemli bir avantajdır.

Medya aktarımını tek başına ele alırken Google Play Hizmetleri tarafından sağlanan HttpEngine veya Cronet'i kullanmanızı öneririz. Google Play Hizmetleri kullanılamıyorsa DefaultHttpDataSourceye geri döner. Bu öneri iyi bir sonuç veriyor çoğu cihazda QUIC üzerinden HTTP/2 ve HTTP/3 kullanımını etkinleştirme ve APK boyutunda önemli bir artışın önüne geçmeyin. Bunun istisnaları var, öneririz. Uygulamanızı çalıştıracak cihazların önemli bir kısmında Google Play Hizmetleri'nin kullanılamaması muhtemel durumlarda Cronet Embedded veya OkHttp kullanmak daha uygun olabilir. APK boyutu kritik bir sorunsa veya medya aktarımı, uygulamanızın işlevinin yalnızca küçük bir parçasıysa yerleşik ağ yığınının kullanılması kabul edilebilir.

Medyanın ötesinde, genellikle tek bir ağ yığını seçmek iyi bir fikirdir Bu, uygulamanızın gerçekleştirdiği tüm ağ işlevleridir. Bu, kaynakların verimli bir şekilde bir havuzda toplanıp ExoPlayer ve diğer cihazlar arasında paylaşılması için (ör. yuvalar) uygulama bileşenlerini etkinleştireceğiz.

Çünkü uygulamanızın büyük olasılıkla bununla ilgili olmayan ağ iletişimi gerçekleştirmesi ağ yığını seçiminiz, medya oynatma için yukarıdaki önerilerimiz yoksa, ağ iletişimi yapan diğer bileşenleri ve bunların projeniz için göreceli önemini uygulamasını indirin.

Medyayı önbelleğe alma

ExoPlayer, sürekli yüklemeyi önlemek için, yüklenen baytların diske önbelleğe alınmasını destekler aynı bayt olabilir. Bu, mevcut medya öğesinde geri arama yaparken veya aynı öğeyi tekrarlarken kullanışlıdır.

Önbelleğe alma için özel bir önbelleğe işaret eden SimpleCache örneği gerekir dizini ve bir CacheDataSource.Factory:

Kotlin

// Note: This should be a singleton in your app.
val databaseProvider = StandaloneDatabaseProvider(context)

// An on-the-fly cache should evict media when reaching a maximum disk space limit.
val cache =
    SimpleCache(
        downloadDirectory, LeastRecentlyUsedCacheEvictor(maxBytes), databaseProvider)

// Configure the DataSource.Factory with the cache and factory for the desired HTTP stack.
val cacheDataSourceFactory =
    CacheDataSource.Factory()
        .setCache(cache)
        .setUpstreamDataSourceFactory(httpDataSourceFactory)

// Inject the DefaultDataSource.Factory when creating the player.
val player =
    ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            DefaultMediaSourceFactory(context).setDataSourceFactory(cacheDataSourceFactory))
        .build()

Java

// Note: This should be a singleton in your app.
DatabaseProvider databaseProvider = new StandaloneDatabaseProvider(context);

// An on-the-fly cache should evict media when reaching a maximum disk space limit.
Cache cache =
    new SimpleCache(
        downloadDirectory, new LeastRecentlyUsedCacheEvictor(maxBytes), databaseProvider);

// Configure the DataSource.Factory with the cache and factory for the desired HTTP stack.
DataSource.Factory cacheDataSourceFactory =
    new CacheDataSource.Factory()
        .setCache(cache)
        .setUpstreamDataSourceFactory(httpDataSourceFactory);

// Inject the DefaultDataSource.Factory when creating the player.
ExoPlayer player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context).setDataSourceFactory(cacheDataSourceFactory))
        .build();