Ağ yığınları

ExoPlayer, genellikle internet üzerinden medya akışı yapmak için kullanılır. Desteklenen yapmak için birden fazla ağ yığını kullanır. Seçiminiz akış performansı üzerinde önemli bir etkiye sahip olabilir.

Bu sayfada, ağ yığınınızı kullanmak için ExoPlayer'ı nasıl yapılandıracağınız açıklanmaktadır. seçenekleri listeler, nasıl tercih edileceği konusunda yol gösterir ve akışlı uygulama için önbelleğe almayı nasıl etkinleştireceğinizi açıklar. medya

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 ayrıca yerel dosyalar gibi http(s) olmayan içeriği oynatması, DefaultDataSource.Factory:

Kotlin

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

Java

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

Bu örnekte PreferredHttpDataSource.Factory, cihazınıza karşılık gelen tercih edilen ağ yığını. DefaultDataSource.Factory katmanı destek ekler yerel dosyalar gibi http(s) olmayan kaynaklar için.

Aşağıdaki örnekte, Cronet kullanacak bir ExoPlayer öğesinin nasıl oluşturulacağı gösterilmektedir ağ yığınının yanı sıra http(s) olmayan içeriğin oynatılmasını da destekler.

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 için doğrudan destek sağlıyor yerleşik varsayılan ağ yığını. Dilerseniz ExoPlayer'ı genişleterek, Android'de çalışan başka bir ağ yığını.

HttpEngine

HttpEngine Android'de API 34 (veya S)'den önerilen varsayılan ağ yığınıdır uzantılar 7). Ç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. Şunları yapabilirsiniz: ExoPlayer'ı belirli ağ yığını.

Kronet

Cronet, Chromium ağ yığını, Android uygulamalarında kitaplık olarak kullanıma sunuldu. Cronet çekimler gecikmeyi azaltan ve gecikmeyi azaltan birden çok teknolojinin avantajından uygulamanızın çalışması için gereken ağ isteklerinin işleme hızı ExoPlayer tarafından geliştirilmiştir. 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'i Cronet kitaplığı. 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ığı. 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ığını kullanırken ağ yığını, uygulamasını indirin. Bu, Cronet Embedded'a benzer ancak OkHttp önemli ölçüde ve uygulamanıza 1 MB'ın altında ekler.

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

ExoPlayer, Android'in yerleşik ağ yığınının kapsamındaki DefaultHttpDataSource ve DefaultHttpDataSource.Factory temel ExoPlayer kitaplığıdır.

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 uygulayın. ve karşılık gelen bir HttpDataSource.Factory ile birlikte kullanılır. ExoPlayer'ın Cronet'i ve OkHttp kitaplıkları, bunun nasıl yapılacağına ilişkin iyi örneklerdir.

Sadece Java ağ yığınıyla entegrasyon yaparken, HttpDataSource uygulamanızı kontrol etmek için DataSourceContractTest doğru şekilde davrandığından emin olun. OkHttp kitaplığındaki OkHttpDataSourceContractTest, bir iyi bir örnek teşkil eder.

Ağ yığını seçme

Aşağıdaki tabloda, Google Ads tarafından desteklenen ağ yığınlarının avantajları ExoPlayer'a dokunun.

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
(<100 KB)
Google Play Hizmetleri gerekir. Cronet sürümü otomatik olarak güncellendi
Cronet (Yerleştirilmiş) 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
(<1 MB)
Yerleşik ağ yığını HTTP
(cihaza göre değişir)
Yok Uygulama cihaza göre değişiklik gösterir

QUIC protokolleri üzerinden HTTP/2 ve HTTP/3, medyayı önemli ölçüde iyileştirebilir akış performansı. Özellikle de akışta gösterilen uyarlanabilir medya akışı bir içerik dağıtım ağı (CDN) kullanılarak dağıtılmışsa, Bu protokollerin kullanılması, CDN'lerin çok daha verimli bir şekilde çalışmasına olanak tanır. Bu nedenle, HttpEngine's ve Cronet's desteği, hem HTTP/2 hem de HTTP/3'ü (ve OkHttp'nin HTTP/2 desteği), QUIC ile karşılaştırıldığında Android'in yerleşik ağ yığınını kullanarak tüm içerikler de bu protokolleri destekler.

Medya akışını izole olarak düşündüğünüzde, HttpEngine veya Google Play Hizmetleri tarafından sağlanan kronet: DefaultHttpDataSource Google Play Hizmetleri kullanılamıyorsa. 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. Google Play Hizmetleri'nin kullanılamayabileceği durumlar için uygulamanızı çalıştıracak cihazların önemli bir Cronet Embedded veya OkHttp kullanmak daha uygun olabilir. Yerleşik APK boyutu önemli bir sorunsa veya medya içeriği akış, uygulamanızın işlevlerinin yalnızca küçük bir kısmıdır.

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, aynı zamanda hızlı ve kolay bir şekilde medya içeriği veya aynı öğeyi tekrarlama.

Ö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();