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ına ilişkin API'nin tanımı OpenSLES_Android.h
içinde bulunur
ve içerdiği başlık dosyalarını da içerir. Danışın: OpenSLES_Android.h
ziyaret edin. Bu dosya, yükleme kökünüzün altında,
sysroot/usr/include/SLES
dizini. Aksi takdirde
tüm arayüzlerin açık olduğu da belirtilmiştir.
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'nin desteklediği Android'e özgü arayüzler ve veri bulucular gösterilmektedir eklemeyi deneyin. 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 havuz (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 havuz (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. 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. İlgili içeriği oluşturmak için kullanılan
OpenSLES_AndroidConfiguration.h
üstbilgi dosyası,
/sysroot/usr/include/SLES
,
aşağıdaki kullanılabilir yapılandırma anahtarlarını ve değerleri belgeler:
- Ses çalarlar için akış türü (varsayılan
SL_ANDROID_STREAM_MEDIA
). - Ses kaydediciler için profili kaydet (varsayılan
SL_ANDROID_RECORDING_PRESET_GENERIC
).
Aşağıdaki kod snippet'inde, sesteki Android ses yayını türünün nasıl ayarlanacağına dair bir örnek gösterilmektedir oynatıcı:
// 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.
Bir ses kaydedici için hazır ayarı yapılandırmak üzere aşağıdakine 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 açıklayıcı veri bulucusu, bir dosyanın ses çaları, okuma erişimi olan açık bir dosya tanımlayıcı olarak değiştirir. Veri biçimi MIME olmalıdır.
Bu uzantı, özellikle yerel öğe yöneticisiyle birlikte kullanışlıdır. Uygulama, APK'daki öğeleri bir dosya tanımlayıcı aracılığıyla okur.
Android basit arabellek sırası veri bulucu ve arayüzü
OpenSL ES 1.0.1 referans spesifikasyonuna göre arabellek sıraları yalnızca ses çalarlar için kullanılabilir ve PCM ve diğer veri biçimleriyle uyumludur. Android basit arabellek sırası veri bulucu ve arayüz özellikleri, referans spesifikasyonuyla aynıdır, ancak şu iki istisna mevcuttur:
- Android basit arabellek sıralarını ses kaydediciler ve ses çalarlarla kullanabilirsiniz.
- Bu sıralarla yalnızca PCM veri biçimini kullanabilirsiniz.
Kayıt için uygulamanız boş arabellekleri sıraya almalıdır. Kayıtlı bir geri arama, uygulamanın arabelleğe veri yazmayı tamamladığını belirten bir bildirim okuyabilir.
Oynatma da aynı şekilde çalışır. Gelecekteki kaynak kodu için Ancak, uygulamaların akıllı telefonlardan Android basit arabellek sıralarının kullanılmasına izin verir.
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, söz konusu davranışa uygun olabilir veya videonun konumundan ayrılabilir
imleç değişmedi.
Sonuç olarak, uygulamanız iki davranışın da gerçekleştiğini varsayamaz. Dolayısıyla,
BufferQueue::Clear()
SL_PLAYSTATE_STOPPED
. Bu işlem, arabellek sırası bilinen bir duruma ayarlanır.
Benzer şekilde, bir arabellek sırası geri çağırması için tetikleyicinin
SL_PLAYSTATE_STOPPED
ürününe geçiş veya
BufferQueue::Clear()
. Bu nedenle, kötü amaçlı yazılımdan farklı olarak
ikisinden birini seçin. uygulamanız her ikisini de işleyebilir.
Nesne oluşturulurken 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, DynamicInterfaceManagement::AddInterface()
kullanımına alternatiftir
örneklendirmeden sonra bu arayüzleri eklemek için kullanılır.
Uzantıların raporlanması
Platformun Android uzantılarını destekleyip desteklemediğini sorgulamanın üç yöntemi 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
, platformun API düzeyidir; örneğin, 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 OpenSL ES 1.0.1 için desteği sonlandırılmış Android'e özgü bir uzantı açıklanmaktadır kodlu akışın kodunu hemen oynatmadan PCM'ye çözmeyi sağlar. Aşağıdaki tabloda, bu uzantının ve alternatiflerinin kullanımıyla ilgili öneriler sunulmaktadır.
API seviyesi | Alternatifler |
---|---|
15 ve altı | Uygun lisansa sahip açık kaynak bir codec |
16 - 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:
Şu anda MediaCodec
API'nin NDK sürümüyle ilgili belge yok. 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ı, bunun yerine ses çalardan farklıdır Uygulama, veri kaynağını bir URI veya Android olarak belirtmişse kod çözücü görevi görür MIME veri biçimi kullanılarak tanımlanan dosya tanımlayıcı veri bulucu. Böyle bir durumda veri havuzu PCM veri biçimini kullanan basit bir Android arabellek sırası veri bulucusu.
Bu özellik, birincil olarak oyunların bir sürüme geçerken ses öğelerini önceden yüklemesi için tasarlanmıştır.
Bu, SoundPool
tarafından sağlanan işleve benzer yeni bir oyun seviyesi.
sağlar.
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 kampanyası arabellek sırası geri çağırması, 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, genellikle kodlanmış veri kaynağının biçimiyle eşleşir örnek hızı, kanal sayısı ve bit derinliği açısından önemlidir. Ancak, yine de kodu farklı bir örnek hızı, kanal sayısı veya bit derinliği gibi metrikler de dahildir. Gerçek PCM biçiminin algılanması için gerekli olan hüküm hakkında daha fazla bilgi için bkz. Kodu çözülmüş PCM verilerinin biçimini meta veriler aracılığıyla belirleme.
Android için OpenSL ES'nin PCM kod çözme özelliği, duraklatma ve ilk arama özelliklerini destekler; desteklemiyor ses denetimi, efektler, döngü veya oynatma hızı.
Platformun uygulamasına bağlı olarak, kod çözme işlemi için kaynaklar gerekebilir. bu reklamlar boşta bırakılamayacak. Bu nedenle, sorunlarınızı giderdikten sonra yeterli sayıda boş PCM arabelleği; Aksi takdirde, kod çözücü aç kalır. Böyle bir durumda, Örneğin, uygulamanız Android basit arabellek sırası geri çağırmasından boş bir tamponu sıraya sokmaktır. Kod çözücü açlığının sonucu belirtilmemiş, ancak şunları içerebilir: kodu çözülmüş halinin bırakılması PCM verileri, kod çözme işlemini duraklatma veya kod çözücüyü tamamen sonlandırma.
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'den PCM'ye akışın kodunu çöz
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 şu şekilde 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 şu mesafe içinde yer almaz: tanımlayıcısı URI olan bir ağ kaynağı veya tanımlayıcısını içeren yerel bir dosya kullanabilirsiniz.
Uygulama başlangıçta, doldurulmuş bir arabellek grubunu Android arabellek sırasında sıraya almalıdır. 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şleyici, arabelleği yeniden doldurmalı ve yeniden sıraya koymalı ve ardından 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'tan sonra başka sıraya izin verilmez.
Tam sayfa URL'lerini paylaştığınızdan kod çözücüye aç kalmamak için ADTS AAC arabelleklere eklenmelidir. Örneğin, uygulamanız başka bir tam arabelleği sıraya almadan Android arabellek sırası geri çağrısından döndürülür. Kod çözücü açlığının sonucu belirtilmemiş.
Veri kaynağı dışında tüm açılardan akış kodu çözme yöntemi Sesin kodunu PCM'ye çözme bölümünde açıklanan kod.
Adlar benzer olsa da Android arabellek sırası aynı
Android basit arabellek sırası ile aynıdır. Akış kod çözücü
Her iki tür arabellek sırası kullanır: ADTS için Android arabellek sırası
AAC veri kaynağı ve PCM verileri için Android basit arabellek sırası
lazım. 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 şu adresteki index.html
dosyasına bakın:
docs/Additional_library_docs/openmaxal/
dizinini indirin.
Kodu çözülmüş PCM verilerinin biçimini meta veriler aracılığıyla belirleme
SLMetadataExtractionItf
arayüzü, referans spesifikasyonunun bir parçasıdır.
Bununla birlikte, kodu çözülmüş PCM verilerinin gerçek biçimini gösteren meta veri anahtarları
Android Bu meta veri anahtarlarını OpenSLES_AndroidMetadata.h
başlık dosyası tanımlar.
Bu başlık dosyası, yükleme kökünüzün altında,
/sysroot/usr/include/SLES
dizini.
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ılabilir. İyi
alıştırma, Object::Realize
yöntemini çağırdıktan sonra ana iş parçacığındaki temel dizinleri sorgulamak ve Android basit sürümünde PCM biçimi meta veri değerlerini okumaktır.
arabellek sırası geri çağırma işleyicisi'ni ayarlar. Destek için:
örnek kod
NDK paketine bakın.
Meta veri anahtar adları sabittir ancak temel dizinler belgelenmemiştir. ve değişikliğe tabidir. Uygulama, indekslerin farklı yürütme çalıştırmalarında ısrarcıdır ve her anahtarın birden fazla nesne örneği aynı çalıştırmada dizinleri paylaşır.
Kayan nokta verileri
Android 5.0 (API düzeyi 21) ve sonraki sürümlerde çalışan bir uygulama, AudioPlayer'a tek duyarlıklı, kayan nokta biçimindedir.
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;