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:
- 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ığı.
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();