Bu sayfada, OpenSL'nin NDK uygulaması ESTM, OpenSL ES 1.0.1'in referans spesifikasyonundan farklıdır. JavaScript'ten örnek kod kullanırken bu özellikleri Android'de çalışacak şekilde değiştirmeniz gerekebilir.
Aksi belirtilmedikçe tüm özellikler Android 2.3 (API düzeyi 9) ve sonraki sürümlerde kullanılabilir. Bazı özellikler yalnızca Android 4.0 (API düzeyi 14) sürümünde kullanılabilir. bunlara dikkat edin.
Not: Android Uyumluluk Tanımlama Belgesi (CDD), donanım ve yazılımları numaralandırır. gereksinimlerine uygun olmalıdır. Görüntüleyin Android Uyumluluğu genel uyumluluk programı hakkında daha fazla bilgi için CDD'yi gönderin.
OpenSL ES, bir C sağlar C++ ile de erişilebilen bir dil arayüzü sunar. Seslere benzer özellikleri gösterir bazı bölümlerini deneyin:
Tüm Android Native Development Kit'te (NDK) olduğu gibi, OpenSL ES'nin Android, Java Yerel kullanılarak çağrılacak paylaşılan kitaplıkların uygulanmasını kolaylaştırmaktır Arayüz (JNI) ) tıklayın. NDK, tam C/C++ uygulamaları yazmak için tasarlanmamıştır. Ancak OpenSL ES, tam özellikli bir API sağlıyor. Sesle ilgili ihtiyaçlarınızın çoğunu karşılayabilmenizi bekliyoruz. yalnızca bu API'yi kullanarak, Android çalışma zamanında kod çalıştırılmasına gerek kalmadan.
Not: OpenSL ES'ye dayalı olsa da Android yerel ses (yüksek performanslı ses) API'si Herhangi bir OpenSL ES 1.0.1 profilinin (oyun, müzik veya telefon) uygun şekilde uygulanması. Çünkü Android, profillerden herhangi birinin gerektirdiği tüm özellikleri uygulamaz. Bilinen tüm durumlar Android'in buradaki spesifikasyondan farklı davrandığı uygulamalar Android uzantıları sayfasına gidin.
Referans spesifikasyonundan devralınan özellikler
OpenSL ES'nin Android NDK uygulaması, özelliklerin büyük bir kısmını referans spesifikasyonu, belirli sınırlamalarla.
Global giriş noktaları
Android için OpenSL ES, Android spesifikasyonundaki tüm genel giriş noktalarını destekler. Bu giriş noktaları şunlardır:
slCreateEngine
slQueryNumSupportedEngineInterfaces
slQuerySupportedEngineInterfaces
Nesneler ve arayüzler
Aşağıdaki tabloda, Android NDK uygulamasının OpenSL ES destekler. Hücrede Evet görünüyorsa özellik bu hakkında bilgi edindiniz.
Özellik | Ses çalar | Ses kaydedici | Motor | Çıkış karması |
---|---|---|---|---|
Güçlü bas | Evet | Hayır | Hayır | Evet |
Arabellek sırası | Evet | Hayır | Hayır | Hayır |
Arabellek sırası veri bulucu | Evet: Kaynak | Hayır | Hayır | Hayır |
Dinamik arayüz yönetimi | Evet | Evet | Evet | Evet |
Efekt gönderme | Evet | Hayır | Hayır | Hayır |
Motor | Hayır | Hayır | Evet | Hayır |
Çevresel yankı | Hayır | Hayır | Hayır | Evet |
Ekolayzer | Evet | Hayır | Hayır | Evet |
G/Ç cihazı veri bulucu | Hayır | Evet: Kaynak | Hayır | Hayır |
Meta veri ayıklama | Evet: PCM'nin kodunu çöz | Hayır | Hayır | Hayır |
Tek kişinin sesini kapat | Evet | Hayır | Hayır | Hayır |
Nesne | Evet | Evet | Evet | Evet |
Çıkış karması bulucu | Evet: Lavabo | Hayır | Hayır | Hayır |
Oynat | Evet | Hayır | Hayır | Hayır |
Oynatma hızı | Evet | Hayır | Hayır | Hayır |
Önceden getirme durumu | Evet | Hayır | Hayır | Hayır |
Hazır yankı | Hayır | Hayır | Hayır | Evet |
Kaydet | Hayır | Evet | Hayır | Hayır |
Ara | Evet | Hayır | Hayır | Hayır |
URI veri bulucu | Evet: Kaynak | Hayır | Hayır | Hayır |
Sanallaştırıcı | Evet | Hayır | Hayır | Evet |
Ses | Evet | Hayır | Hayır | Hayır |
Sonraki bölümde bu özelliklerden bazılarına ilişkin sınırlamalar açıklanmaktadır.
Sınırlamalar
Tablo 1'de yer alan özellikler için belirli sınırlamalar vardır. Bu sınırlamalar ve referans spesifikasyonundan farkları temsil eder. Bu bölümün geri kalanında öğrenebilirsiniz.
Dinamik arayüz yönetimi
Android için OpenSL ES, RemoveInterface
veya
ResumeInterface
.
Efekt kombinasyonları: ortam yankısı ve önceden ayarlanmış yankı
Aynı çıkış karmasında hem çevresel yankı hem de önceden ayarlanmış yankı bulunamaz.
Platform, değişikliğin ne kadarının işleme alınacağını tahmin ediyorsa CPU yükü çok fazla olacaktır.
Efekt gönderme
SetSendLevel()
, ses çalar başına tek bir gönderme düzeyini destekler.
Çevresel yankı
Ortam yankısı reflectionsDelay
desteklemiyor.
reflectionsLevel
veya reverbDelay
alanı
SLEnvironmentalReverbSettings
yapısı.
MIME veri biçimi
MIME veri biçimini yalnızca URI veri bulucuyla ve yalnızca ses dosyaları için kullanabilirsiniz oynatıcıya gitmiş olur. Bu veri biçimini ses kaydedici için kullanamazsınız.
OpenSL ES'nin Android uygulaması için mimeType
öğesini başlatmanız gerekir.
NULL
veya geçerli bir UTF-8 dizesine dönüştürmeniz gerekir. Ayrıca,
containerType
değerini geçerli bir değere ayarlayın.
Diğer kullanıcılara taşınabilirlik gibi diğer hususların
uygulamanın veya içerik biçimlerinin başlık,
bunu tek bir yerden
mimeType
değerini NULL
ve containerType
olarak ayarla
Hedef: SL_CONTAINERTYPE_UNSPECIFIED
.
Android için OpenSL ES aşağıdaki ses biçimlerini destekler Android platformu da bunları destekler:
- WAV PCM'dir.
- WAV alaw.
- WAV ulaw.
- MP3 Ogg Vorbis.
- AAC LC.
- HE-AACv1 (AAC+).
- HE-AACv2 (geliştirilmiş AAC+).
- AMR
- FLAC ile uyumludur.
Not: Android'in desteklediği ses biçimlerinin listesi için bkz. Desteklenen medya biçimleri.
Bu belgede bu ve diğer biçimlerin işlenmesinde aşağıdaki sınırlamalar geçerlidir: OpenSL ES uygulanması:
- AAC biçimleri, MP4 veya ADTS kapsayıcısında bulunmalıdır.
- Android için OpenSL ES desteklenmez MIDI
- WMA, AOSP'nin bir parçası değildir. Henüz Android için OpenSL ES ile uyumlu olduğunu doğrulamamıştır.
- OpenSL ES'nin Android NDK uygulaması doğrudan desteklenmez veya şifrelenmiş içeriğin oynatılması. Korunan ses içeriğini oynatmak için şunları yapmanız gerekir: Uygulamanız herhangi bir DRM'yi zorunlu kılarak, oynatmadan önce uygulamanızda şifrenin şifresini çözün kısıtlamalar.
Nesneyle ilgili yöntemler
Android için OpenSL ES, nesneleri değiştirmeye yönelik aşağıdaki yöntemleri desteklemez:
Resume()
RegisterCallback()
AbortAsyncOperation()
SetPriority()
GetPriority()
SetLossOfControlInterfaces()
PCM veri biçimi
Arabellek sıralarıyla kullanabileceğiniz tek veri biçimi PCM'dir. Desteklenen PCM oynatma yapılandırmaları aşağıdaki özelliklere sahiptir:
- 8 bit imzasız veya 16 bit imzalı.
- Mono veya stereo.
- Küçük uç bayt sırası.
- Örnek hızları:
- 8000 Hz
- 11.025 Hz.
- 12.000 Hz
- 16.000 Hz
- 22.050 Hz.
- 24.000 Hz.
- 32.000 Hz
- 44.100 Hz.
- 48.000 Hz.
Android için OpenSL ES'nin kayıt için desteklediği yapılandırmalar şunlardır: cihaza bağlı; genellikle cihazdan bağımsız olarak 16.000 Hz mono/16 bit imzalı mevcuttur.
Yanıltıcı olmasına rağmen samplesPerSec
alanının değeri miliHz birimi cinsindendir
dokunun. Yanlışlıkla yanlış değerin kullanılmasını önlemek için bu alanı
bu amaç için tanımlanan sembolik sabitlerden biri, örneğin SL_SAMPLINGRATE_44_1
.
Android 5.0 (API düzeyi 21) ve sonraki sürümleri desteği kayan nokta verileri.
Oynatma hızı
OpenSL ES oynatma hızı, bir öğenin nesne, verileri normal hızın binde biri cinsinden veya binde bir ifade olarak sunar. Örneğin, bin gösterim başına 1.000 oynatma hızı 1.000/1.000, yani normal bir hızdır. Hız aralığı, olası oynatma hızları aralığını ifade eden kapalı bir aralıktır.
Oynatma hızı aralıkları ve diğer özellikler için destek, bağlı olarak değişebilir
ve uygulamaya dair
bilgi edineceksiniz. Uygulamanız, çalışma zamanında bu özellikleri belirlemek için
PlaybackRate::GetRateRange()
veya
Cihazı sorgulamak için PlaybackRate::GetCapabilitiesOfRate()
.
Bir cihaz genellikle PCM biçimindeki bir veri kaynağı için aynı hız aralığını ve birim oranı destekler diğer biçimler için binde 1.000 ile 1.000 arasında değişmelidir; yani birim oranı aralığı etkili bir şekilde kullanır.
Kaydet
Android için OpenSL ES, SL_RECORDEVENT_HEADATLIMIT
dilini desteklemez
veya SL_RECORDEVENT_HEADMOVING
etkinlik.
Ara
SetLoop()
yöntemi, tüm dosya döngüsünü etkinleştirir. Döngüyü etkinleştirmek için
startPos
parametresini 0 ve endPos
parametresini
alıcı: SL_TIME_UNKNOWN
.
Arabellek sırası veri bulucu
Arabellek sırası için veri bulucu içeren ses çalar veya kaydedici yalnızca PCM veri biçimini destekler.
G/Ç cihazı veri bulucu
Android için OpenSL ES, G/Ç cihaz veri bulucu kullanımını yalnızca
bulucuyu Engine::CreateAudioRecorder()
için veri kaynağı olarak belirtti.
Aşağıdaki kod snippet'inde bulunan değerleri kullanarak cihaz veri bulucuyu başlatın:
SLDataLocator_IODevice loc_dev = {SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};
URI veri bulucu
Android için OpenSL ES, yalnızca MIME veri biçimine sahip URI veri bulucuyu kullanabilir.
Yalnızca ses çalarlarda oynanabilir. Ses kaydediciler için URI veri bulucu kullanamazsınız. URI yalnızca
http:
ve file:
şemalarını kullanın. https:
gibi diğer şemalar
ftp:
veya
content:
kullanılamaz.
Android platformunda rtsp:
için işitsel desteği doğrulamadık.
Veri yapıları
Android şu OpenSL ES 1.0.1 veri yapılarını destekler:
SLDataFormat_MIME
SLDataFormat_PCM
SLDataLocator_BufferQueue
SLDataLocator_IODevice
SLDataLocator_OutputMix
SLDataLocator_URI
SLDataSink
SLDataSource
SLEngineOption
SLEnvironmentalReverbSettings
SLInterfaceID
Platform yapılandırması
Android için OpenSL ES, çok iş parçacıklı uygulamalar için tasarlanmıştır ve iş parçacığı açısından güvenlidir. Chrome'u destekler uygulama başına tek bir motor ve motor başına en fazla 32 nesne. Kullanılabilir cihaz belleği ve CPU kullanılabilir nesne sayısını daha fazla kısıtlamanız gerekir.
Bu motor seçenekleri tanınır ancak slCreateEngine
tarafından yok sayılır:
SL_ENGINEOPTION_THREADSAFE
SL_ENGINEOPTION_LOSSOFCONTROL
OpenMAX AL ve OpenSL ES, aynı uygulamada birlikte kullanılabilir. Bu durumda, tek bir paylaşılan motor nesnesi dahili olarak oluşturulur ve 32 nesne sınırı OpenMAX AL arasında paylaşılır ve OpenSL ES. Uygulama her iki motoru da oluşturmalı, her iki motoru da kullanmalı ve son olarak da iki motoru da yok edebileceksiniz. Uygulama, paylaşılan motorda bir referans sayısını tutar ve böylece sırasında, ikinci yok etme işlemi sırasında doğru şekilde imha edildi.
Programlama notları
OpenSL ES programlama notları OpenSL ES'nin doğru uygulanmasını sağlayacak ek bilgiler sağlar.
Not:
Size kolaylık sağlamak amacıyla, NDK ile birlikte OpenSL ES 1.0.1 spesifikasyonunun bir kopyasını
docs/opensles/OpenSL_ES_Specification_1.0.1.pdf
.
Platform sorunları
Bu bölümde, bu API'leri destekleyen ilk platform sürümündeki bilinen sorunlar açıklanmaktadır.
Dinamik arayüz yönetimi
DynamicInterfaceManagement::AddInterface
çalışmıyor. Bunun yerine arayüzü
ortam yankısı için örnek kodda gösterildiği gibi Create()
işlevine iletilen dizidir.
Gelecekteki OpenSL ES sürümlerini planlayın
Android yüksek performanslı ses API'leri, Khronos Grubu OpenSL ES 1.0.1 şartlarında belirtilmiştir. Khronos, standardın düzeltilmiş 1.1 sürümünü yayınladı. İlgili içeriği oluşturmak için kullanılan Düzeltilmiş sürüm yeni özellikleri, açıklamaları, yazım hatalarının düzeltmelerini ve uyumsuzluklar yaşar. Beklenen uyumsuzlukların çoğu nispeten küçüktür veya Android'de desteklenmeyen OpenSL ES alanları olabilir.
Uygulama Android platformunun gelecekteki sürümlerinde çalışması gerektiğini lütfen unutmayın: İkili sistem için planlama bölümünde özetlenen yönergelere uyumluluk bölümünü inceleyin.
Not: Gelecekteki kaynak uyumluluğu bir hedef değildir. Yani NDK'nın daha yeni bir sürümüne geçerseniz uygulamanızın kaynak kodunu yeni API'ye uyacak şekilde değiştirmeniz gerekebilir. Çoğu durumda, bu tür değişiklikler küçük olacaktır; aşağıdaki ayrıntılara göz atın.
İkili program uyumluluğunu planlayın
Gelecekteki ikili program uyumluluğunu iyileştirmek için uygulamanızın şu yönergelere uymasını öneririz:
- Yalnızca OpenSL ES 1.0.1 sürümünde Android tarafından desteklenen özelliklerin belgelenen alt kümesini kullanın.
- Başarısız bir işlem için belirli bir sonuç koduna güvenmeyin; başa çıkmak için farklı bir sonuç koduyla sorgulayabiliriz.
- Uygulama geri çağırma işleyicileri genellikle kısıtlı bir bağlamda çalışır. Bu özellikler geri dönüp en kısa sürede geri dönmelerini isteyebilir. Karmaşık işlemler çalıştırma test eder. Örneğin, arabellek sırası tamamlama geri çağırması kapsamında başka bir arabelleği sıraya alabilirsiniz, ancak ses çalar oluşturmayın.
- Geri arama işleyicilerin ve tanımadıkları etkinlik türlerini yoksayar. Şu özelliklere sahip geri çağırmalar: etkinleştirilmiş etkinlik türlerinden oluşan bir etkinlik maskesiyle yapılandırıldığı için ve aynı anda ayarlanmış birden çok etkinlik türü bitiyle "&" işaretini kullanma her etkinlik bitini test etmek yerine anahtar kılıfı.
- Önceden getirme durumunu ve geri çağırmaları ilerlemenin genel göstergesi olarak kullanın ancak belirli sabit kodlu dolgu düzeyleri veya geri çağırma sıraları kullanabilirsiniz. Önceden getirme durumu doldurmanın anlamı ve önceden getirme sırasında tespit edilen hataların davranışı değişebilir.
Not: Daha fazla bilgi için Arabellek sırası davranışı başlıklı bölüme bakın.
Kaynak uyumluluğunu planlayın
Belirtildiği gibi, OpenSL ES'nin bir sonraki sürümünde kaynak kodu uyumsuzluklarının Khronos Grubu. Olası değişim alanları şunlardır:
- Arabellek sırası arayüzünde, özellikle
(
BufferQueue::Enqueue
),slBufferQueueCallback
için parametre listesi veSLBufferQueueState.playIndex
alanının adı. Uygulama kodunuzun Bunun yerine Android basit arabellek sıraları. Örnekte kodu; oynatma için Android basit arabellek sıralarını ve budur. (Ayrıca PCM'ye kayıt yapmak ve kodu çözmek için Android basit arabellek sırası kullanıyoruz, ancak standart OpenSL ES 1.0.1'in arabellek sırası verilerini kaydetmeyi veya bu verilerin kodunu çözmeyi desteklememesidir gider.) - Referans yoluyla iletilen giriş parametrelerine
const
eklenecek veSLchar *
struct alanları için giriş değeri olarak kullanılır. Bu durumda, kodunuz. - Şu anda imzalı olan bazı parametreler, imzasız türlerin yerini alacaktır.
SLint32
olan bir parametre türünüSLuint32
veya benzeri bir parametre olarak değiştirmeniz gerekebilir. bir yayın ekleyin. Equalizer::GetPresetName
, dizeyi döndürmek yerine uygulama belleğine kopyalar uygulama belleğine bir işaretçidir. Bu önemli bir değişiklik olacağından, ya bu yöntemi çağırmaktan kaçının ya da bu yöntemi kullanımınızı ayırın.- struct türlerinde ek alanlar olacaktır. Çıkış parametreleri için bu yeni alanlar yoksayılabilir, ancak giriş parametreleri için yeni alanların başlatılması gerekir. Neyse ki bu alanların tümünün Android tarafından desteklenmeyen alanlarda olması beklenir.
- Arayüz GUID'ler değişir. Ardışık düzendeki hataları önlemek için arayüzleri GUID yerine sembolik adlarıyla desteklenmektedir.
unsigned char
olanSLchar
fiyatıchar
olarak değiştirilecek. Bu, öncelikli olarak URI veri konum belirleyici ve MIME veri biçimi.SLDataFormat_MIME.mimeType
,pMimeType
olarak yeniden adlandırılacak veSLDataLocator_URI.URI
,pURI
olarak yeniden adlandırılacak. İlk kullanıma hazırlamanızı öneririzSLDataFormat_MIME
veSLDataLocator_URI
veri yapılarını kodunuzu izole etmek için alan adı yerine köşeli parantez içine alınmış, virgülle ayrılmış değer listesi dikkate almalısınız. Bu teknik, örnek kodda kullanılır.SL_DATAFORMAT_PCM
, uygulamanın imzalanmış tam sayı, imzasız tam sayı veya kayan nokta olarak kullanılabilir. Android'e geçiş 8 bit verilerin imzasız tam sayı ve 16 bitlik imzalı tam sayı olduğunu varsayar. Ayrıca, alan Gerçek birimler milli Hz olduğundansamplesPerSec
yanlış bir addır. Bu sorunların olması beklenen bir durumdur yeni bir genişletilmiş PCM verisi sunacak olan bir sonraki OpenSL ES sürümünde ele alınacaktır. biçimi, uygulamanın açıkça gösterimi açıkça belirtmesine ve alan adı. Bu yeni bir veri biçimi olacağından mevcut PCM veri biçimi de (kullanımdan kaldırılmış olmasına rağmen) kodunuzda acil değişiklik gerektirmemelidir.