Rozpocznij

Ta sekcja zawiera informacje potrzebne do rozpoczęcia korzystania z interfejsów OpenSL ES API.

Dodaj OpenSL ES do swojej aplikacji

Możesz wywołać OpenSL ES zarówno z kodu w C, jak i C++. Aby dodać podstawowy element OpenSL ES funkcji zestawu w swojej aplikacji, dołącz plik nagłówka OpenSLES.h:

#include <SLES/OpenSLES.h>

Aby dodać rozszerzenia OpenSL ES na Androida: dołącz również plik nagłówka OpenSLES_Android.h:

#include <SLES/OpenSLES_Android.h>

Gdy dołączysz plik nagłówka OpenSLES_Android.h, zostaną użyte te nagłówki automatycznie:

#include <SLES/OpenSLES_AndroidConfiguration.h>
#include <SLES/OpenSLES_AndroidMetadata.h>

Uwaga: Te nagłówki nie są wymagane, ale są wyświetlane jako pomoc w nauce interfejsu API.

Kompilacja i debugowanie

Możesz włączyć OpenSL ES do kompilacji, określając go w Android.mk, który jest jednym z NDK w plikach mark w systemie kompilacji NDK. Dodaj następujący wiersz do Android.mk:

LOCAL_LDLIBS += -lOpenSLES

Aby przeprowadzić dokładne debugowanie, zalecamy zbadanie wartości SLresult, którą większość po powrocie interfejsów API OpenSL ES. Za pomocą asserts lub bardziej zaawansowaną logikę obsługi błędów na potrzeby debugowania; żadna z ofert nieodłączną zaletę współpracy z OpenSL ES, chociaż jeden z tych narzędzi może być bardziej odpowiedni dla konkretnego przypadku użycia.

Stosujemy asercje w naszych przykładów, bo pomagają wychwytywać nierealistyczne warunki, które wskazują na błąd w kodzie. Śr zastosowały jawną obsługę błędów w przypadku innych warunków, które z większym prawdopodobieństwem mogą wystąpić w środowisku produkcyjnym.

Wiele błędów interfejsu API powoduje dodanie wpisu w dzienniku jako uzupełnienie kodu wyniku o wartości innej niż zero. Takie wpisy logu mogą dostarczyć dodatkowe szczegóły, które są szczególnie przydatne w przypadku stosunkowo złożonych interfejsów API, takich jak Engine::CreateAudioPlayer

Dziennik możesz wyświetlić z poziomu wiersza poleceń lub w Android Studio. Aby sprawdzić dziennik z: w wierszu poleceń wpisz:

$ adb logcat

Aby sprawdzić dziennik w Android Studio, wybierz Widok > Okna narzędziowe > Logcat. Więcej informacji znajdziesz w artykule o zapisywaniu i wyświetlaniu logów za pomocą Logcat.

Przykładowy kod

Zalecamy użycie obsługiwanego i przetestowanego przykładowego kodu, którego można używać jako modelu własnego. który znajduje się w sekcji echo audio oraz natywna-audio android-ndk na GitHubie z repozytorium.

Uwaga: Specyfikacja OpenSL ES 1.0.1 zawiera w załącznikach przykładowy kod (zobacz Rejestr Khronos OpenSL ES ). Jednak przykłady w Dodatku B: Przykładowy kod i Załącznik C: przykładowy kod przypadku użycia – wykorzystuje funkcje, które nie są obsługiwane przez Androida. Niektóre przykłady zawierają też błędy typograficzne lub korzystają z interfejsów API, które prawdopodobnie ulegną zmianie. Wybierz podczas odnoszenia się do tych kwestii należy zachować ostrożność; chociaż kod może być pomocny w zrozumieniu pełnej wersji OpenSL ES standard, nie należy go używać w takiej postaci, w jakiej jest na Androidzie.

Treść audio

Oto niektóre z wielu sposobów łączenia treści audio w pakiety:

  • Zasoby: umieszczając pliki audio w folderze res/raw/, są łatwo dostępne dla powiązanych interfejsów API Resources Nie ma jednak bezpośredniego natywnego dostępu do zasobów, więc musisz napisać wersję w języku Java. kodu w języku programowania, aby skopiować je przed użyciem.
  • Zasoby: gdy umieścisz pliki audio w folderze assets/, są bezpośrednio dostępne dla natywnych interfejsów API Menedżera zasobów Androida. Zobacz pliki nagłówka android/asset_manager.h i android/asset_manager_jni.h, by uzyskać więcej informacji na ten temat API. Przykładowy kod znajdujący się w android-ndk, Repozytorium GitHub korzysta z tych natywnych interfejsów API menedżera zasobów w połączeniu z plikiem Androida lokalizator danych deskryptora.
  • Sieć: lokalizator danych URI umożliwia bezpośrednie odtwarzanie treści audio. z sieci. Przeczytaj jednak Zabezpieczenia i uprawnienia
  • Lokalny system plików: lokalizator danych URI obsługuje schemat file: w przypadku plików lokalnych, pod warunkiem że są one dostępne dla aplikacji. Pamiętaj, że Android platforma zabezpieczeń ogranicza dostęp do plików za pomocą mechanizmów identyfikatora użytkownika i identyfikatora grupy systemu Linux.
  • Nagrano: aplikacja może nagrywać dane dźwiękowe z wejścia mikrofonu. zapisać te treści i odtworzyć je później. Przykładowy kod korzysta z tej metody dla funkcji Odtwórz klip.
  • Skompilowane i wbudowane linki: swoje treści audio możesz dodać bezpośrednio do w bibliotece udostępnionej, a następnie odtworzyć ją w odtwarzaczu audio z lokalizatorem danych kolejki buforowania. Ten najlepiej sprawdza się w przypadku krótkich klipów w formacie PCM. W przykładowym kodzie zastosowano tę technikę w przypadku funkcji Klipy Hello i Android. Dane PCM zostały przekonwertowane na ciągi szesnastkowe za pomocą funkcji Narzędzie bin2c (brak w zestawie).
  • Synteza w czasie rzeczywistym: aplikacja może syntetyzować dane PCM na bieżąco oraz a potem odtwórz go w odtwarzaczu audio z lokalizatorem danych kolejki bufora. To dość zaawansowane rozwiązanie, i szczegóły syntezy dźwięku wykraczają poza zakres tego artykułu.

Uwaga: Znalezienie lub tworzenie przydatnych treści audio do zastosowania w Twojej aplikacji wykracza poza zakres tego artykułu. Możesz wyszukiwać hasła w internecie, np. dźwięk interaktywny, dźwięk z gry, dźwięk projektowania czy programowania audio, aby znaleźć więcej informacji.

Uwaga: to Ty ponosisz odpowiedzialność aby upewnić się, że możesz legalnie odtwarzać lub nagrywać treści. Obowiązująca prywatność uwarunkowaniami dotyczącymi nagrywania treści.

Przykładowe fragmenty kodu

Te przykładowe aplikacje są dostępne na naszej stronie GitHub:

  • echo audio tworzy pętlę danych wejściowych do wyjścia.
  • natywna-audio To prosty dyktafon/odtwarzacz dźwięku.

Implementacja NDK w Androidzie NDK w OpenSL ES różni się ze specyfikacji referencyjnej dla OpenSL ES 1.0.1 pod wieloma względami. Różnice te są ważnym powodem, dla którego przykładowy kod skopiowany bezpośrednio ze specyfikacji referencyjnej OpenSL ES może nie działać w Aplikacja na Androida.

Więcej informacji na temat różnic między specyfikacją referencyjną a Implementacja na Androida, zobacz OpenSL ES na Androida