ExoPlayer, internet üzerinden medya akışı için yaygın olarak kullanılır. Temel ağ isteklerini yapmak için birden fazla ağ yığınını destekler. Ağ yığını seçimi, akış performansını önemli ölçüde etkileyebilir.
Bu sayfada, ExoPlayer'ı tercih ettiğiniz ağ yığınını kullanacak şekilde nasıl yapılandıracağınız açıklanmakta, mevcut seçenekler listelenmekte, uygulamanız için bir ağ yığını seçme konusunda bazı bilgiler verilmekte ve yayınlanan medya için önbelleğe almayı nasıl etkinleştireceğiniz açıklanmaktadır.
ExoPlayer'ı belirli bir ağ yığınını kullanacak şekilde yapılandırma
ExoPlayer, verileri DataSource bileşenleri aracılığıyla yükler. Bu bileşenleri, uygulama kodundan yerleştirilen DataSource.Factory örneklerinden alır.
Uygulamanızın yalnızca http(s) içeriğini oynatması gerekiyorsa bir ağ yığını seçmek, uygulamanızın kullandığınız ağ yığınına karşılık gelen HttpDataSource.Factory örnekleri olacak şekilde eklediği tüm DataSource.Factory örneklerini güncellemek kadar basittir. 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 fabrika anlamına gelir. 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ışı içeriklerin oynatılmasını da destekleyecek bir ExoPlayer oluşturma işlemi 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ı destekleyecek şekilde de genişletilebilir.
HttpEngine
HttpEngine
API 34'ten (veya S
uzantıları 7) itibaren Android'de önerilen varsayılan ağ yığınıdır. Çoğu durumda, dahili olarak Cronet ağ yığınını kullanır ve QUIC protokolleri üzerinden HTTP, HTTP/2 ve HTTP/3'ü destekler.
ExoPlayer, HttpEngineDataSource.Factory ile HttpEngine'ı 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 yerleştirebilirsiniz.
Cronet
Cronet, Android uygulamalarına kitaplık olarak sunulan Chromium ağ yığınıdır. Cronet, uygulamanızın çalışması için gereken ağ isteklerinin (ExoPlayer tarafından yapılanlar dahil) gecikmesini azaltan ve verimini artıran birden fazla teknolojiden yararlanır. HTTP, HTTP/2 ve QUIC üzerinden HTTP/3 protokollerini doğal olarak destekler. Cronet, YouTube dahil olmak üzere dünyanın en büyük yayın uygulamalarından bazıları tarafından kullanılır.
ExoPlayer, Cronet kitaplığı aracılığıyla Cronet'i destekler.
Kitaplığın README.md bölümünde nasıl kullanılacağına ilişkin ayrıntılı talimatlar yer alır. Cronet kitaplığının üç temel Cronet uygulamasını kullanabildiğini unutmayın:
- Google Play Hizmetleri: Çoğu durumda bu uygulamayı kullanmanızı ve Google Play Hizmetleri kullanılamıyorsa Android'in yerleşik ağ yığınını (
DefaultHttpDataSource) kullanmanızı öneririz. - Yerleşik Cronet: Kullanıcılarınızın büyük bir yüzdesi Google Play Hizmetleri'nin yaygın olarak kullanılmadığı pazarlardaysa veya kullanılan Cronet uygulamasının tam sürümünü kontrol etmek istiyorsanız iyi bir seçenek olabilir. Cronet Embedded'in en büyük dezavantajı, uygulamanıza yaklaşık 8 MB eklemesidir.
- Cronet Geri Dönüşü: Cronet'in geri dönüş uygulaması, Cronet'in API'sini Android'in yerleşik ağ yığını etrafında bir sarmalayıcı olarak uygular. Android'in yerleşik ağ yığınını doğrudan kullanmak (
DefaultHttpDataSourcekullanılarak) daha verimli olduğundan ExoPlayer ile kullanılmamalıdır.
OkHttp
OkHttp, birçok popüler Android uygulaması tarafından yaygın olarak kullanılan başka bir modern ağ yığınıdır. HTTP ve HTTP/2'yi destekler ancak henüz QUIC üzerinden HTTP/3'ü desteklemez.
ExoPlayer, OkHttp kitaplığı aracılığıyla OkHttp'yi destekler.
Kitaplığın README.md bölümünde nasıl kullanılacağına ilişkin ayrıntılı talimatlar yer alır. OkHttp kitaplığı kullanılırken ağ yığını uygulamaya yerleştirilir. Bu, Cronet Embedded'e benzer ancak OkHttp önemli ölçüde daha küçüktür ve uygulamanıza 1 MB'tan daha az yer kaplar.
Android'in yerleşik ağ yığını
ExoPlayer, Android'in yerleşik ağ yığınını DefaultHttpDataSource ve DefaultHttpDataSource.Factory ile birlikte kullanmayı destekler. Bu kitaplıklar, temel ExoPlayer kitaplığının bir parçasıdır.
Ağ yığını uygulamasının tam olarak nasıl yapılacağı, temel cihazda çalışan yazılıma bağlıdı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 ve buna karşılık gelen bir HttpDataSource.Factory uygulayın. ExoPlayer'ın Cronet ve OkHttp kitaplıkları, bu işlemin nasıl yapılacağına dair iyi bir örnektir.
Tamamen Java ağ yığınıyla entegrasyon yaparken DataSourceContractTest uygulamanızın HttpDataSource doğru şekilde çalıştığını kontrol etmek için bir uygulama oluşturmanız önerilir. OkHttp kitaplığındaki OkHttpDataSourceContractTest, bunun nasıl yapılacağına dair iyi bir örnektir.
Ağ yığı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 boyutu etkisi | Notlar |
|---|---|---|---|
| HttpEngine | HTTP HTTP/2 HTTP/3 over QUIC |
Yok | Yalnızca API 34 veya S Extensions 7'de kullanılabilir. |
| Cronet (Google Play Hizmetleri) | HTTP HTTP/2 HTTP/3 over QUIC |
Küçük (<100 KB) |
Google Play Hizmetleri gerektirir. Cronet sürümü otomatik olarak güncellendi |
| Cronet (Yerleşik) | HTTP HTTP/2 HTTP/3 over QUIC |
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şir. |
QUIC üzerinden HTTP/2 ve HTTP/3 protokolleri, medya akışı performansını önemli ölçüde artırabilir. Özellikle, içerik dağıtım ağı (CDN) kullanılarak dağıtılan uyarlanabilir medya yayınlanırken bu protokollerin kullanılması, CDN'lerin çok daha verimli çalışmasına olanak tanıyabilir. Bu nedenle, içeriklerin barındırıldığı sunucular da bu protokolleri desteklediği sürece, Android'in yerleşik ağ yığınını kullanmaya kıyasla HttpEngine ve Cronet'in QUIC üzerinden hem HTTP/2 hem de HTTP/3'ü (ve OkHttp'nin HTTP/2'yi) desteklemesi büyük bir avantajdır.
Medya akışını tek başına değerlendirirken Google Play Hizmetleri tarafından sağlanan HttpEngine veya Cronet'in kullanılmasını ve Google Play Hizmetleri kullanılamıyorsa DefaultHttpDataSource'e geri dönülmesini öneririz. Bu öneri, çoğu cihazda QUIC üzerinden HTTP/2 ve HTTP/3 kullanımını etkinleştirme ile APK boyutunda önemli bir artışı önleme arasında iyi bir denge kurar. Bu önerinin istisnaları vardır. Google Play Hizmetleri'nin uygulamanızı çalıştıracak cihazların önemli bir bölümünde kullanılamayacağı durumlarda, Cronet Embedded veya OkHttp kullanmak daha uygun olabilir. APK boyutu kritik bir sorunsa veya medya akışı, uygulamanızın işlevinin yalnızca küçük bir bölümünü oluşturuyorsa yerleşik ağ yığınını kullanmak kabul edilebilir.
Yalnızca medya dışında, uygulamanızın gerçekleştirdiği tüm ağ işlemleri için tek bir ağ yığını seçmek genellikle iyi bir fikirdir. Bu sayede, yuvalar gibi kaynaklar ExoPlayer ile diğer uygulama bileşenleri arasında verimli bir şekilde havuzlanabilir ve paylaşılabilir.
Uygulamanızın büyük olasılıkla medya oynatmayla ilgili olmayan ağ işlemleri yapması gerekeceğinden, ağ yığını seçiminizi yaparken nihayetinde yukarıda medya akışıyla ilgili olarak tek başına verdiğimiz önerileri, ağ işlemleri yapan diğer bileşenlerin gereksinimlerini ve uygulamanız için göreceli önemlerini göz önünde bulundurmanız gerekir.
Medya dosyalarını önbelleğe alma
ExoPlayer, aynı baytların ağdan tekrar tekrar yüklenmesini önlemek için yüklenen baytların diske önbelleğe alınmasını destekler. Bu özellik, mevcut medyada geri sarmak veya aynı öğeyi tekrarlamak istediğinizde kullanışlıdır.
Önbelleğe alma işlemi için özel bir önbellek dizinini işaret eden bir SimpleCache örneği ve bir CacheDataSource.Factory gerekir:
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();