ExoPlayer'ın ana demo uygulaması iki temel amaca hizmet eder:
- ExoPlayer kullanımıyla ilgili nispeten basit ancak tüm özelliklere sahip bir örnek sunmak. Demo uygulama, kendi uygulamanızı geliştirmek için kullanabileceğiniz kullanışlı bir başlangıç noktası olabilir.
- ExoPlayer'ı denemeyi kolaylaştırmak için. Demo uygulama, dahil edilen örneklere ek olarak kendi içeriğinizin oynatılmasını test etmek için kullanılabilir.
Bu sayfada demo uygulamasının nasıl alınacağı, derleneceği ve çalıştırılacağı açıklanmaktadır. Ayrıca, kendi medyanızı oynatmak için bu uygulamayı nasıl kullanacağınız da açıklanmaktadır.
Kodu alma
Ana demo uygulamasının kaynak kodunu GitHub projemizin demos/main
klasöründe bulabilirsiniz. Henüz yapmadıysanız projeyi yerel bir dizine klonlayın:
git clone https://github.com/androidx/media.git
Ardından, projeyi Android Studio'da açın. Android Projesi görünümünde (demo uygulamasının ilgili klasörleri genişletildi) aşağıdakileri görmeniz gerekir:
Derleniyor ve çalıştırılıyor
Demo uygulamayı derleyip çalıştırmak için Android Studio'da demo
yapılandırmasını seçip çalıştırın. Demo uygulama, bağlı bir Android cihaza yüklenir ve çalıştırılır.
Mümkünse fiziksel bir cihaz kullanmanızı öneririz. Bunun yerine bir emülatör kullanmak istiyorsanız lütfen Desteklenen cihazlar başlıklı makalenin emülatörler bölümünü okuyun ve Sanal Cihazınızın, API düzeyi en az 23 olan bir sistem görüntüsü kullandığından emin olun.
Demo uygulamasında bir örnek listesi (SampleChooserActivity
) sunulur. Bir örnek seçildiğinde oynatılmak üzere ikinci bir etkinlik (PlayerActivity
) açılır. Demoda oynatma kontrolleri ve parça seçimi işlevi yer alır. Ayrıca, sistem günlüğüne faydalı hata ayıklama bilgileri göndermek için ExoPlayer'ın EventLogger
yardımcı program sınıfını kullanır. Bu günlük kaydı, diğer etiketler için hata düzeyinde günlük kaydıyla birlikte aşağıdaki komutla görüntülenebilir:
adb logcat EventLogger:V *:E
Paketlenmiş kod çözücüleri etkinleştirme
ExoPlayer'da AV1, VP9, Opus, FLAC ve FFmpeg (yalnızca ses) gibi paketlenmiş yazılım kod çözücülerin kullanılmasına olanak tanıyan çeşitli uzantılar bulunur. Demo uygulaması, bu uzantıları aşağıdaki gibi içerecek ve kullanacak şekilde oluşturulabilir:
- Dahil etmek istediğiniz her uzantıyı oluşturun. Bunun manuel bir işlem
olduğunu unutmayın. Talimatlar için her uzantıda bulunan
README.md
dosyasını inceleyin. Android Studio'nun Derleme Varyantları görünümünde, demo modülü için derleme varyantını aşağıdaki resimde gösterildiği gibi
withDecoderExtensionsDebug
veyawithDecoderExtensionsRelease
olarak ayarlayın.demo
yapılandırmasını normal şekilde derleyin, yükleyin ve çalıştırın.
Varsayılan olarak, uzantı kod çözücü yalnızca uygun bir platform kod çözücü yoksa kullanılır. Aşağıdaki bölümlerde açıklandığı gibi, uzantı kod çözücülerin tercih edilmesi gerektiğini belirtebilirsiniz.
Kendi içeriğinizi oynatma
Demo uygulamasında kendi içeriğinizi oynatmanın birden fazla yolu vardır.
1. assets/media.exolist.json dosyasını düzenleme
Demo uygulamasında listelenen örnekler assets/media.exolist.json
adresinden yüklenir.
Bu JSON dosyasını düzenleyerek demo uygulamasına örnek ekleyebilir ve demo uygulamasından örnek kaldırabilirsiniz. Şema aşağıdaki gibidir. [O], isteğe bağlı bir özelliği gösterir.
[
{
"name": "Name of heading",
"samples": [
{
"name": "Name of sample",
"uri": "The URI of the sample",
"extension": "[O] Sample type hint. Values: mpd, ism, m3u8",
"clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
"clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
"drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
"drm_license_uri": "[O] URI of the license server if protected",
"drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
"drm_key_request_properties": "[O] Key request headers if protected",
"drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
"drm_multi_session": "[O] Enables key rotation if protected",
"subtitle_uri": "[O] The URI of a subtitle sidecar file",
"subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
"subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
"ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
},
...etc
]
},
...etc
]
Sana Özel oynatma listeleri aşağıdaki şema kullanılarak belirtilebilir:
[
{
"name": "Name of heading",
"samples": [
{
"name": "Name of playlist sample",
"playlist": [
{
"uri": "The URI of the first sample in the playlist",
"extension": "[O] Sample type hint. Values: mpd, ism, m3u8"
"clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
"clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
"drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
"drm_license_uri": "[O] URI of the license server if protected",
"drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
"drm_key_request_properties": "[O] Key request headers if protected",
"drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
"drm_multi_session": "[O] Enables key rotation if protected",
"subtitle_uri": "[O] The URI of a subtitle sidecar file",
"subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
"subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
},
{
"uri": "The URI of the second sample in the playlist",
...etc
},
...etc
]
},
...etc
]
},
...etc
]
Gerekirse anahtar isteği başlıkları, her başlık için dize özelliği içeren bir nesne olarak belirtilir:
"drm_key_request_properties": {
"name1": "value1",
"name2": "value2",
...etc
}
Örnek seçici etkinliğindeki taşma menüsünde, uzantı kod çözücülerin tercih edilip edilmeyeceğini belirtme seçenekleri bulunur.
Yerel dosya URI'leri ve kapsamlı depolama alanı kısıtlamaları
Demo uygulaması, yerel dosya URI'lerini belirtirken bu dosyaları okumak için gerekli depolama alanı erişim izinlerini ister. Ancak Android 13'ten itibaren, tipik bir medya dosyası uzantısıyla (.mp4
gibi) bitmeyen rastgele dosyaları yüklemek mümkün değildir. Böyle bir dosyayı yüklemeniz gerekiyorsa demo uygulamasının erişim kısıtlaması olmayan özel depolama dizinine yerleştirebilirsiniz. Bu dosya genellikle /sdcard/Android/data/androidx.media3.demo.main/files
adresinde bulunur.
2. Harici bir exolist.json dosyası yükleme
Demo uygulaması, yukarıdaki şemayı kullanarak ve *.exolist.json
kuralına göre adlandırılmış harici JSON dosyalarını yükleyebilir. Örneğin, bu tür bir dosyayı https://yourdomain.com/samples.exolist.json
adresinde barındırıyorsanız aşağıdakileri kullanarak demo uygulamasında açabilirsiniz:
adb shell am start -a android.intent.action.VIEW \ -d https://yourdomain.com/samples.exolist.json
Demo uygulamasının yüklü olduğu bir cihazda *.exolist.json
bağlantısı (ör. tarayıcıda veya e-posta istemcisinde) tıklandığında bağlantı, demo uygulamasında da açılır. Bu nedenle, *.exolist.json
JSON dosyası barındırmak, diğer kullanıcıların demo uygulamasında denemesi için içerik dağıtmanın basit bir yolunu sağlar.
3. Amaç etkinleştirme
Intent'ler, Sana Özel listesini atlamak ve doğrudan oynatmaya başlamak için kullanılabilir. Tek bir örnek çalmak için intent'in işlemini androidx.media3.demo.main.action.VIEW
olarak, veri URI'sini ise çalınacak örneğin URI'si olarak ayarlayın. Bu tür bir intent, terminalden aşağıdakiler kullanılarak tetiklenebilir:
adb shell am start -a androidx.media3.demo.main.action.VIEW \ -d https://yourdomain.com/sample.mp4
Tek bir örnek intent için desteklenen isteğe bağlı ekstralar şunlardır:
- Örnek yapılandırma ekstraları:
mime_type
[Dize] Örnek MIME türü ipucu. Örneğin, DASH içeriği içinapplication/dash+xml
.clip_start_position_ms
[Uzun] Milisaniye cinsinden, örneğin kesilmesi gereken başlangıç noktası.clip_end_position_ms
[Uzun] Milisaniye cinsinden, örneğin alınması gereken bitiş noktası.drm_scheme
[Dize] Korunuyorsa DRM şeması. Geçerli değerlerwidevine
,playready
veclearkey
değerleridir. DRM şeması UUID'leri de kabul edilir.drm_license_uri
[Dize] Korunuyorsa lisans sunucusunun URI'si.drm_force_default_license_uri
[Boole] Kendi lisans URI'lerini içeren anahtar istekleri içindrm_license_uri
'un kullanılmasını zorunlu kılma.drm_key_request_properties
[Dize dizisi] Korunuyorsa ad1, değer1, ad2, değer2 vb. olarak paketlenmiş anahtar istek üstbilgileri.drm_session_for_clear_content
[Boole] Video ve ses parçalarını temizlemek için DRM oturumu eklenip eklenmeyeceğini belirtir.drm_multi_session
[Boole] Korunuyorsa anahtar rotasyonunu etkinleştirir.subtitle_uri
[Dize] Altyazı yan dosyası URI'si.subtitle_mime_type
[Dize] subtitle_uri'nin MIME türü (subtitle_uri ayarlanmışsa gereklidir).subtitle_language
[Dize] Altyazı dosyasının BCP47 dil kodudur (subtitle_uri ayarlanmamışsa yoksayılır).ad_tag_uri
[Dize] [IMA uzantısı][] kullanılarak yüklenecek reklam etiketinin URI'sı.prefer_extension_decoders
[Boole] Platform kod çözücülerine kıyasla uzantı kod çözücülerin tercih edilip edilmeyeceğini belirtir.
Bir intent'i tetiklemek için adb shell am start
kullanılırken --es
ile isteğe bağlı bir dize eklenebilir (ör. --es extension mpd
). İsteğe bağlı bir Boole ekstrası, --ez
ile ayarlanabilir (ör. --ez prefer_extension_decoders TRUE
). --el
ile isteğe bağlı uzun bir ek ayarlanabilir (ör. --el clip_start_position_ms 5000
). --esa
ile isteğe bağlı bir dize dizisi eklenebilir (ör.
--esa drm_key_request_properties name1,value1
).
Sana Özel oynatma listesini çalmak için intent'in işlemini androidx.media3.demo.main.action.VIEW_LIST
olarak ayarlayın. Örnek yapılandırmadaki ekstralar, iki fark dışında androidx.media3.demo.main.action.VIEW
ile aynıdır:
- Ekstraların anahtarlarında alt çizgi ve son ek olarak örnek için 0 tabanlı dizin olmalıdır. Örneğin,
extension_0
ilk örnek için örnek türünü belirtir.drm_scheme_1
, ikinci örnek için DRM şemasını ayarlar. - Örneğin URI'si,
uri_<sample-index>
anahtarıyla fazladan bir öğe olarak iletilir.
Örneğe bağlı olmayan diğer ekstralar değişmez. Örneğin, ikinci öğenin uzantısını geçersiz kılarak iki öğe içeren bir oynatma listesini oynatmak için terminalde aşağıdaki komutu çalıştırabilirsiniz:
adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \ --es uri_0 https://a.com/sample1.mp4 \ --es uri_1 https://b.com/sample2.fake_mpd \ --es extension_1 mpd