Android için OpenSL ES

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.

Nesneler ve arayüzler için Android NDK desteği.

Ö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.

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 ve SLBufferQueueState.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 ve SLchar * 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 olan SLchar 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 ve SLDataLocator_URI.URI, pURI olarak yeniden adlandırılacak. İlk kullanıma hazırlamanızı öneririz SLDataFormat_MIME ve SLDataLocator_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ğundan samplesPerSec 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.