Android uzantıları

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;
Kayan nokta sesi hakkında daha fazla bilgi edinin. kullanarak bir örnek oluşturun.