Rozpocznij

W tej sekcji znajdziesz informacje, które pomogą Ci zacząć korzystać z interfejsów OpenSL ES API.

Dodaj OpenSL ES do swojej aplikacji

Możesz wywoływać OpenSL ES z kodu w języku C i C++. Aby dodać do aplikacji podstawowy zestaw funkcji OpenSL ES, dołącz plik nagłówka OpenSLES.h:

#include <SLES/OpenSLES.h>

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

#include <SLES/OpenSLES_Android.h>

Jeśli dodasz plik nagłówka OpenSLES_Android.h, te nagłówki będą dołączane 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 poznawaniu interfejsu API.

Tworzenie i debugowanie

Możesz włączyć OpenSL ES do swojej kompilacji, określając ją w pliku Android.mk, który służy jako jeden z plików MakeFile systemu kompilacji NDK. Dodaj ten wiersz do Android.mk:

LOCAL_LDLIBS += -lOpenSLES

W celu przeprowadzenia niezawodnego debugowania zalecamy sprawdzenie wartości SLresult zwracanej przez większość interfejsów API OpenSL ES. Do debugowania możesz używać assertów lub bardziej zaawansowanej logiki obsługi błędów. Żadna z nich nie zapewnia nieodłącznej przewagi przy pracy z OpenSL ES, ale jedna z nich może być bardziej odpowiednia w danym przypadku.

W naszych przykładach używamy asertów, ponieważ pomagają one wychwytywać nierealistyczne warunki wskazujące na błąd kodowania. Zastosowaliśmy bezpośrednią obsługę błędów w przypadku innych warunków, które mogą częściej występować w środowisku produkcyjnym.

Wiele błędów interfejsu API powoduje, że oprócz kodu wyniku o wartości innej niż 0 pojawia się wpis logu. Takie wpisy logu mogą dostarczyć dodatkowych szczegółów, które okażą się 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 w wierszu poleceń, wpisz:

$ adb logcat

Aby sprawdzić dziennik w Android Studio, kliknij Widok > Okna narzędzi > Logcat. Więcej informacji znajdziesz w artykule Zapisywanie i wyświetlanie logów przy użyciu Logcat.

Przykładowy kod

Zalecamy użycie obsługiwanego i przetestowanego przykładowego kodu, który może służyć jako model własnego kodu. Znajduje się on w folderach audio-echo i native-audio w repozytorium android-ndk na GitHubie.

Uwaga: specyfikacja OpenSL ES 1.0.1 zawiera w załącznikach przykładowy kod (więcej informacji znajdziesz w rejestrze Khronos OpenSL ES). Jednak w Załączniku B: przykładowy kod i Załączniku C: przykładowy kod z przykładu użycia wykorzystywane są 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 się zmienią. Odnosząc się do nich, zachowaj ostrożność. Chociaż kod może być pomocny w zrozumieniu pełnego standardu OpenSL ES, nie należy go używać z Androidem w obecnej postaci.

Treść audio

Oto niektóre sposoby pakowania treści audio do aplikacji:

  • Zasoby: gdy umieścisz pliki audio w folderze res/raw/, powiązane z nimi interfejsy API Resources będą mieć do nich łatwy dostęp. Nie ma jednak bezpośredniego dostępu natywnego do zasobów, więc musisz napisać kod w języku programowania Java, aby skopiować je przed użyciem.
  • Zasoby: po umieszczeniu plików audio w folderze assets/ będą one bezpośrednio dostępne dla interfejsów API menedżera zasobów natywnych na Androida. Więcej informacji o tych interfejsach API znajdziesz w plikach nagłówka android/asset_manager.h i android/asset_manager_jni.h. Przykładowy kod w repozytorium android-ndk na GitHubie korzysta z tych natywnych interfejsów API menedżera zasobów w połączeniu z lokalizatorem danych deskryptora plików Androida.
  • Sieć: używając lokalizatora danych URI, możesz odtwarzać treści audio bezpośrednio z sieci. Zapoznaj się jednak z artykułem Zabezpieczenia i uprawnienia.
  • Lokalny system plików: lokalizator danych URI obsługuje schemat file: dla plików lokalnych, o ile są one dostępne dla aplikacji. Pamiętaj, że platforma zabezpieczeń Androida ogranicza dostęp do plików za pomocą mechanizmów identyfikatora użytkownika i identyfikatora grupy w systemie Linux.
  • Nagrane: aplikacja może nagrywać dane dźwiękowe z wejścia mikrofonu, zapisywać te treści i odtwarzać je później. W przykładowym kodzie użyto tej metody w przypadku klipu z funkcją odtwarzania.
  • Skompilowane i połączone w tekście: możesz połączyć swoje treści audio bezpośrednio z zasobami współdzielonymi, a potem odtwarzać je za pomocą odtwarzacza audio z lokalizatorem danych kolejki bufora. Ta opcja najlepiej sprawdza się w przypadku krótkich klipów w formacie PCM. W przykładowym kodzie użyto tej techniki w klipach Hello i Android. Dane PCM zostały przekonwertowane na ciągi szesnastkowe za pomocą narzędzia bin2c (niedostarczono).
  • Synteza w czasie rzeczywistym: aplikacja może syntetyzować dane PCM na bieżąco, a następnie odtwarzać je za pomocą odtwarzacza audio z lokalizatorem danych kolejki bufora. Jest to stosunkowo zaawansowana technika, a szczegóły syntezy dźwięku wykraczają poza zakres tego artykułu.

Uwaga: ten artykuł nie dotyczy znajdowania ani tworzenia przydatnych treści audio do aplikacji. Aby znaleźć więcej informacji, możesz wyszukać w internecie takie hasła jak dźwięk interaktywny, dźwięk gry, projekt dźwiękowy lub programowanie audio.

Uwaga: to Ty odpowiadasz za sprawdzenie, czy masz uprawnienia do odtwarzania i nagrywania treści. Podczas nagrywania treści trzeba pamiętać o kwestiach związanych z ochroną prywatności.

Przykłady kodu

Na naszej stronie GitHub znajdziesz te przykładowe aplikacje:

  • audio-echo tworzy pętlę danych wejściowych i wyjściowych w obie strony.
  • native-audio to prosty rejestrator dźwięku i odtwarzacz.

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

Więcej informacji o różnicach między specyfikacją referencyjną a implementacją na Androida znajdziesz w artykule OpenSL ES na Androida.