UYARI: OpenSL ES desteği sonlandırılmıştır. Geliştiriciler, GitHub'da bulunan açık kaynak Oboe kitaplığını kullanmalıdır. Oboe, AAudio'ya çok benzeyen bir API sağlayan bir C++ sarmalayıcısıdır. Obua, AAudio seçeneği etkin olduğunda AAudio'yu çağırır kullanılabilir ve AAudio yoksa OpenSL ES'ye geri döner.
Android için OpenSL ES, referans OpenSL ES spesifikasyonunun kapsamını genişleterek uyumlu hale getirir. sahip olması ve Android platformunun gücünden ve esnekliğinden yararlanmasını sağlıyor.
Android uzantılarının API'si OpenSLES_Android.h
ve bu dosyanın içerdiği başlık dosyalarında bulunur. Danışın: OpenSLES_Android.h
ziyaret edin. Bu dosya, yükleme kökünüzün altındaki sysroot/usr/include/SLES
dizininde bulunur. Aksi belirtilmedikçe tüm arayüzler açıktır.
Bu uzantılar, uygulamanızın taşınabilirliğini
diğer OpenSL ES uygulamalarıdır, çünkü bunlar Android'e özgüdür. Bu sorunu azaltmak için
kullanmaktan kaçının veya derleme sırasında hariç tutmak için #ifdef
kullanın.
Aşağıdaki tabloda, Android OpenSL ES'in her nesne türü için desteklediği Android'e özgü arayüzler ve veri bulucuları gösterilmektedir. Hücrelerdeki Evet değerleri, arayüzleri ve verileri belirtir. her nesne türü için kullanılabilir bulucular oluşturabilirsiniz.
Özellik | Ses çalar | Ses kaydedici | Motor | Çıkış karması |
---|---|---|---|---|
Android arabellek sırası | Evet: Kaynak (kod çözme) | Hayır | Hayır | Hayır |
Android yapılandırması | Evet | Evet | Hayır | Hayır |
Android etkisi | Evet | Hayır | Hayır | Evet |
Android efekti özellikleri | Hayır | Hayır | Evet | Hayır |
Android efekt gönderme | Evet | Hayır | Hayır | Hayır |
Android basit arabellek sırası | Evet: Kaynak (oynatma) veya alıcı (kod çözme) | Evet | Hayır | Hayır |
Android arabellek sırası veri bulucu | Evet: Kaynak (kod çözme) | Hayır | Hayır | Hayır |
Android dosya açıklayıcı veri bulucu | Evet: Kaynak | Hayır | Hayır | Hayır |
Android basit arabellek sırası veri bulucu | Evet: Kaynak (oynatma) veya alıcı (kod çözme) | Evet: Lavabo | Hayır | Hayır |
Android yapılandırma arayüzü
Android yapılandırma arayüzü, nesneler için platforma özgü parametreler ayarlama olanağı sunar. Bu arayüz diğer OpenSL ES'den farklıdır
İlgili nesneyi örneklendirmeden önce uygulamanızın bunu kullanabileceği arayüzler; Dolayısıyla,
nesneyi örneklendirmeden önce yapılandırabilirsiniz. /sysroot/usr/include/SLES
adresinde bulunan OpenSLES_AndroidConfiguration.h
başlık dosyası, aşağıdaki kullanılabilir yapılandırma anahtarlarını ve değerlerini belgeler:
- Ses çalarlar için akış türü (varsayılan
SL_ANDROID_STREAM_MEDIA
). - Ses kaydediciler için kayıt profili (varsayılan
SL_ANDROID_RECORDING_PRESET_GENERIC
).
Aşağıdaki kod snippet'inde, bir ses çalarda Android ses akışı türünün nasıl ayarlanacağına dair bir örnek gösterilmektedir:
// CreateAudioPlayer and specify SL_IID_ANDROIDCONFIGURATION // in the required interface ID array. Do not realize player yet. // ... SLAndroidConfigurationItf playerConfig; result = (*playerObject)->GetInterface(playerObject, SL_IID_ANDROIDCONFIGURATION, &playerConfig); assert(SL_RESULT_SUCCESS == result); SLint32 streamType = SL_ANDROID_STREAM_ALARM; result = (*playerConfig)->SetConfiguration(playerConfig, SL_ANDROID_KEY_STREAM_TYPE, &streamType, sizeof(SLint32)); assert(SL_RESULT_SUCCESS == result); // ... // Now realize the player here.
Ses kaydedicinin hazır ayarını yapılandırmak için benzer bir kod kullanabilirsiniz:
// ... obtain the configuration interface as the first four lines above, then: SLuint32 presetValue = SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION; result = (*playerConfig)->SetConfiguration(playerConfig, RECORDING_PRESET, &presetValue, sizeof(SLuint32));
Android efekt arayüzleri
Android'in efekt, efekt gönderme ve efekt yeteneklerinin arayüzleri uygulamanın cihaza özgü sorguları sorgulaması ve kullanması için genel bir mekanizma ses efektleri. Cihaz üreticileri, cihaza özel mevcut ses efektlerini belgelemelidir. yardımcı olur.
Taşınabilir uygulamalar, ses efektleri için Android yerine OpenSL ES 1.0.1 API'lerini kullanmalıdır ekleyebilirsiniz.
Android dosya açıklayıcı veri bulucu
Android dosya tanımlayıcısı veri bulucusu, ses oynatıcının kaynağını okuma erişimi olan açık bir dosya tanımlayıcısı olarak belirtmenize olanak tanır. Veri biçimi MIME olmalıdır.
Uygulama, öğeleri bir dosya tanımlayıcısı aracılığıyla APK'dan okuduğundan bu uzantı özellikle yerel öğe yöneticisiyle birlikte kullanışlıdır.
Android basit arabellek sırası veri bulucu ve arayüzü
OpenSL ES 1.0.1 referans spesifikasyonunda, arabellek sıraları yalnızca ses oynatıcılar için kullanılabilir ve PCM ile diğer veri biçimleriyle uyumludur. Android basit arabellek sırası veri bulucu ve arayüz spesifikasyonları, iki istisna dışında referans spesifikasyonla aynıdır:
- Android basit arabellek sıralarını ses kaydediciler ve ses çalarlarla kullanabilirsiniz.
- Bu sıralarla yalnızca PCM veri biçimini kullanabilirsiniz.
Uygulamanız, kayıt için boş arabellekleri sıraya almalıdır. Kayıtlı bir geri çağırma işlevi, sistemin bir arabelleğe veri yazmayı tamamladığına dair bir bildirim gönderdiğinde uygulama bu arabellekten veri okuyabilir.
Oynatma işlemi de aynı şekilde çalışır. Ancak gelecekteki kaynak kod uyumluluğu için uygulamaların OpenSL ES 1.0.1 arabellek sıraları yerine Android basit arabellek sıralarını kullanmasını öneririz.
Arabellek sırası davranışı
Android uygulaması
referans spesifikasyonunun, oynatma imlecinin başa dönmesi şartı
SL_PLAYSTATE_STOPPED
devreye girdiğinde o anda oynatılan arabelleğin
durumu. Bu uygulama bu davranışa uygun olabilir veya oynatma imlecinin konumunu değiştirmeden bırakabilir.
Sonuç olarak, uygulamanız iki davranışın da gerçekleştiğini varsayamaz. Bu nedenle, SL_PLAYSTATE_STOPPED
'a geçiş yaptıktan sonra BufferQueue::Clear()
yöntemini açıkça çağırmanız gerekir. Bu işlem, arabellek kuyruğunu bilinen bir duruma ayarlar.
Benzer şekilde, bir arabellek kuyruğu geri çağırma işlevinin tetikleyicisinin SL_PLAYSTATE_STOPPED
'e geçiş mi yoksa BufferQueue::Clear()
'un yürütülmesi mi olması gerektiğini düzenleyen bir spesifikasyon yoktur. Bu nedenle, kötü amaçlı yazılımdan farklı olarak
ikisinden birini seçin. uygulamanız her ikisini de işleyebilir.
Nesne oluşturma sırasında dinamik arayüzler
Kolaylık sağlaması açısından, OpenSL ES 1.0.1'in Android uygulaması
bir nesneyi örneklendirdiğinde uygulamanızın dinamik arayüzler belirtmesine izin verir.
Bu, örneklemeden sonra bu arayüzleri eklemek için DynamicInterfaceManagement::AddInterface()
kullanmaya alternatiftir.
Uzantıların raporlanması
Platformun Android uzantılarını destekleyip desteklemediğini sorgulamak için üç yöntem vardır. Bu yöntemleri şunlardır:
Engine::QueryNumSupportedExtensions()
Engine::QuerySupportedExtension()
Engine::IsExtensionSupported()
Bu yöntemlerden herhangi biri ANDROID_SDK_LEVEL_<API-level>
değerini döndürür. Burada API-level
, platform API seviyesidir (ör. ANDROID_SDK_LEVEL_23
).
Platform API düzeyinin 9 veya daha yüksek olması, platformun uzantıları desteklediği anlamına gelir.
Sesin kodunu PCM olarak çözün
Bu bölümde, kodlanmış bir akışın hemen oynatılmaksızın PCM'ye kodunun çözülmesi için OpenSL ES 1.0.1'de desteği sonlandırılan Android'e özel bir uzantı açıklanmaktadır. Aşağıdaki tabloda, bu uzantının ve alternatiflerinin kullanımıyla ilgili öneriler sunulmaktadır.
API seviyesi | Alternatifler |
---|---|
15 yaş ve altı | Uygun lisansa sahip açık kaynak kodlu bir codec |
16 ila 20 |
MediaCodec sınıfı veya uygun lisansa sahip açık kaynak codec
|
21 ve üzeri |
<media/NdkMedia*.h> başlık dosyalarında NDK MediaCodec,
MediaCodec sınıfı veya uygun lisansa sahip açık kaynak bir codec
|
Not:
MediaCodec
API'nin NDK sürümü için şu anda doküman bulunmamaktadır. Ancak,
bu belgeyi
yerel-codec örnek kodunu inceleyin.
Standart bir ses çalar, bir ses cihazına çalar ve çıkış mix'ini veri havuzu olarak belirtir. Android uzantısı, uygulama veri kaynağını URI olarak veya MIME veri biçimi kullanılarak açıklanan bir Android dosya tanımlayıcı veri bulucusu olarak belirtmişse ses oynatıcının kod çözücü olarak çalışmasıyla farklıdır. Böyle bir durumda veri havuzu PCM veri biçimini kullanan basit bir Android arabellek sırası veri bulucusu.
Bu özellik, öncelikle oyunların yeni bir oyun seviyesine geçerken ses öğelerini önceden yüklemesi için tasarlanmıştır. Bu özellik, SoundPool
sınıfının sunduğu işleve benzer.
Uygulama, ilk olarak Android basit sürümünde bir dizi boş arabelleği kuyruğa almalıdır. arabellek sırası. Ardından, uygulama arabellekleri PCM verileriyle doldurur. Android basit arabellek kuyruğu geri çağırma işlevi, her arabellek doldurulduktan sonra tetiklenir. Geri çağırma işleyici şu anda boş olan arabelleği yeniden sıraya alır ve daha sonra geri döner. Uygulama, kodu çözülmüş tamponların kaydını tutma geri çağırma parametresi listesi veya arabelleğin gösterilmesi için gereken verileri içeren tamponu sıraya alındı.
Veri kaynağı, akışın sonunu (EOS) dolaylı bir şekilde
SL_PLAYEVENT_HEADATEND
etkinliği var. Uygulama kodu çözdükten sonra
Android basit arabellek sırası geri çağırması için başka çağrı yapmaz.
Havuzun PCM veri biçimi, örnekleme hızı, kanal sayısı ve bit derinliği açısından genellikle kodlanmış veri kaynağınınkiyle eşleşir. Ancak, yine de kodu farklı bir örnek hızı, kanal sayısı veya bit derinliği gibi metrikler de dahildir. Gerçek PCM biçimini algılamayla ilgili hüküm hakkında bilgi edinmek için Meta veriler aracılığıyla kod çözülmüş PCM verilerinin biçimini belirleme başlıklı makaleyi inceleyin.
Android için OpenSL ES'in PCM kod çözme özelliği duraklatma ve ilk aramayı destekler. Ses seviyesi kontrolü, efektler, döngü veya oynatma hızı desteklenmez.
Platform uygulamasına bağlı olarak, kod çözme işlemi için boşta bırakılamayan kaynaklar gerekebilir. Bu nedenle, yeterli sayıda boş PCM arabelleği sağlamanız önerilir. Aksi takdirde, kod çözücü aç kalır. Örneğin, uygulamanız Android basit arabellek sırası geri çağırma işlevinden başka bir boş arabellek eklemeden dönerse bu durumla karşılaşabilirsiniz. Kod çözücü açlığının sonucu belirtilmemiştir ancak kod çözülmüş PCM verilerinin bırakılması, kod çözme işleminin duraklatılması veya kod çözücünün tamamen sonlandırılması bu sonuçlar arasında yer alabilir.
Not:
Şu cihazlarda çalışan uygulamalar için kodlanmış bir akışın kodunu PCM'ye çözmek ancak hemen oynatmamak için
Android 4.x (API düzeyleri 16-20), MediaCodec
sınıfını kullanmanızı öneririz.
Android 5.0 (API düzeyi 21) veya sonraki sürümlerde çalışan yeni uygulamalar için NDK'yı kullanmanızı öneririz
eşdeğeri, <NdkMedia*.h>
. Bu üstbilgi dosyaları,
media/
dizinini indirin.
ADTS AAC yayınını PCM olarak çözme
Veri kaynağı MIME veri biçimini kullanan Android arabellek sırası veri bulucu ve veriler Havuz, PCM veri biçimini kullanan basit bir Android arabellek sırası veri bulucudur. MIME veri biçimini aşağıdaki gibi yapılandırın:
- Kapsayıcı:
SL_CONTAINERTYPE_RAW
- MIME türü dizesi:
SL_ANDROID_MIME_AACADTS
Bu özellik genel olarak AAC ses ile uğraşmak ama özel ses işlemeyi oynatmadan önce kontrol edin. PCM'de ses kodunu çözmesi gereken çoğu uygulama PCM'de sesin kodunu çözme bölümünde açıklanan yöntemi kullanmalıdır: Çünkü bu yöntem daha basittir ve daha fazla ses biçimini işler. Açıklanan teknik Aşağıda daha özel bir yaklaşım ortaya çıkacak. Bu yaklaşım yalnızca koşullar geçerlidir:
- Sıkıştırılmış ses kaynağı, ADTS başlıklarında yer alan AAC karelerinin akışıdır.
- Bu akışı uygulama yönetir. Veriler, tanımlayıcısı URI olan bir ağ kaynağında veya tanımlayıcısı dosya tanımlayıcısı olan yerel bir dosyada bulunmamalıdır.
Uygulama, başlangıçta Android arabelleği kuyruğuna bir dizi dolu arabellek eklemelidir. Her arabellekte bir veya daha fazla eksiksiz ADTS AAC çerçevesi bulunur. Her arabellek boşaltıldıktan sonra Android arabellek sırası geri çağırması tetiklenir. Geri çağırma işleyicisi, arabelleği doldurup yeniden sıraya ekledikten sonra geri dönmelidir. Uygulamanın, kodlanmış arabellekleri takip etmesine gerek yoktur; geri çağırma parametresi listesi, daha sonra sıraya eklenmesi gereken tamponu belirtmek için yeterli bilgi içerir. Yayının sonu, bir EOS öğesi sıraya konarak açıkça işaretlendi. EOS'ten sonra başka video eklemeye izin verilmez.
Tam sayfa URL'lerini paylaştığınızdan kod çözücüye aç kalmamak için ADTS AAC arabelleklere eklenmelidir. Bu durum, örneğin uygulamanız başka bir tam arabellek eklemeden Android arabellek sırası geri çağırma işlevinden dönerse ortaya çıkabilir. Kod çözücü açlığının sonucu belirtilmemiş.
Veri kaynağı dışındaki tüm açılardan akış kod çözme yöntemi, Sesi PCM'ye kod çözme başlıklı makalede açıklanan yöntemle aynıdır.
Adların benzerliğine rağmen Android arabellek kuyruğu, Android basit arabellek kuyruğu ile aynı değildir. Akış kod çözücü, her iki tür arabellek kuyruğunu da kullanır: ADTS AAC veri kaynağı için bir Android arabellek kuyruğu ve PCM veri alıcısı için bir Android basit arabellek kuyruğu. Android basit arabellek sırası API'si hakkında daha fazla bilgi edinmek için Android
Basit arabellek sırası veri bulucusu ve arayüzü hakkında daha fazla bilgi edinin.
Android arabellek sırası API'si hakkında daha fazla bilgi için yükleme kök dizininin altındaki docs/Additional_library_docs/openmaxal/
dizininde bulunan index.html
dosyasına bakın.
Meta veriler aracılığıyla kod çözülmüş PCM verilerinin biçimini belirleme
SLMetadataExtractionItf
arayüzü, referans spesifikasyonunun bir parçasıdır.
Ancak, kod çözülmüş PCM verilerinin gerçek biçimini belirten meta veri anahtarları Android'e özgüdür. OpenSLES_AndroidMetadata.h
başlık dosyası bu meta veri anahtarlarını tanımlar.
Bu başlık dosyası, yükleme kökünüzün altındaki /sysroot/usr/include/SLES
dizininde bulunur.
Meta veri anahtarı dizinleri, bu işlemden hemen sonra
Object::Realize()
yöntemi yürütme işlemini tamamlar. Ancak ilişkili değerler, uygulama ilk kodlanmış verilerin kodunu çözene kadar kullanılamaz. Object::Realize
yöntemini çağırdıktan sonra ana iş parçacığında anahtar dizinlerini sorgulamak ve Android basit arabellek sırası geri çağırma işleyicisini ilk kez çağırırken PCM biçimindeki meta veri değerlerini okumak iyi bir uygulamadır. Bu arayüzle çalışma örnekleri için NDK paketindeki örnek koda bakın.
Meta veri anahtar adları sabit olsa da anahtar dizinleri belgelenmemiştir ve değişiklik gösterebilir. Uygulamalar, dizinlerin farklı yürütme çalıştırmalarında kalıcı olduğunu ve birden fazla nesne örneğinin aynı çalıştırmadaki dizinleri paylaştığını varsayamaz.
Kayan nokta verileri
Android 5.0 (API düzeyi 21) ve sonraki sürümleri çalıştıran bir uygulama, AudioPlayer'a tek hassasiyetli, kayan noktalı biçimde veri sağlayabilir.
Aşağıdaki örnek kodda, Engine::CreateAudioPlayer()
yöntemi bir ses çalar oluşturur
bir izleme kodu kullanmanızı öneririz:
#include <SLES/OpenSLES_Android.h> ... SLAndroidDataFormat_PCM_EX pcm; pcm.formatType = SL_ANDROID_DATAFORMAT_PCM_EX; pcm.numChannels = 2; pcm.sampleRate = SL_SAMPLINGRATE_44_1; pcm.bitsPerSample = 32; pcm.containerSize = 32; pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; pcm.representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT; ... SLDataSource audiosrc; audiosrc.pLocator = ... audiosrc.pFormat = &pcm;