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 APIResources
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łówkaandroid/asset_manager.h
iandroid/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