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.Factory
kullanı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:
- 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
). - 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.
- 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 DefaultHttpDataSource
ye 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();