هشدار: OpenSL ES منسوخ شده است. توسعه دهندگان باید از کتابخانه منبع باز Oboe استفاده کنند که در GitHub در دسترس است. Oboe یک بسته بندی C++ است که یک API ارائه می دهد که بسیار شبیه به AAudio است. زمانی که AAudio در دسترس باشد Oboe با AAudio تماس می گیرد و اگر AAudio در دسترس نباشد به OpenSL ES برمی گردد.
این بخش اطلاعات مورد نیاز برای شروع استفاده از OpenSL ES APIها را ارائه می دهد.
OpenSL ES را به برنامه خود اضافه کنید
می توانید با کدهای C و C++ OpenSL ES تماس بگیرید. برای افزودن مجموعه ویژگی اصلی OpenSL ES به برنامه خود، فایل هدر OpenSLES.h
را اضافه کنید:
#include <SLES/OpenSLES.h>
برای افزودن برنامههای افزودنی OpenSL ES Android نیز، فایل هدر OpenSLES_Android.h
را اضافه کنید:
#include <SLES/OpenSLES_Android.h>
هنگامی که فایل هدر OpenSLES_Android.h
را اضافه می کنید، سرصفحه های زیر به طور خودکار اضافه می شوند:
#include <SLES/OpenSLES_AndroidConfiguration.h> #include <SLES/OpenSLES_AndroidMetadata.h>
توجه: این هدرها مورد نیاز نیستند، اما به عنوان کمکی در یادگیری API نشان داده می شوند.
بسازید و اشکال زدایی کنید
میتوانید OpenSL ES را با مشخص کردن آن در فایل Android.mk
که به عنوان یکی از فایلهای ساخت سیستم NDK عمل میکند، در ساخت خود بگنجانید. خط زیر را به Android.mk
اضافه کنید:
LOCAL_LDLIBS += -lOpenSLES
برای اشکالزدایی قوی، توصیه میکنیم مقدار SLresult
را که اکثر APIهای OpenSL ES برمیگردانند، بررسی کنید. میتوانید از استدلالها یا منطق مدیریت خطای پیشرفتهتر برای اشکالزدایی استفاده کنید. هیچ یک مزیت ذاتی برای کار با OpenSL ES ارائه نمی دهد، اگرچه ممکن است یکی یا دیگری برای یک مورد خاص مناسب تر باشد.
ما در مثالهای خود از دعوی استفاده میکنیم، زیرا آنها به گرفتن شرایط غیرواقعی کمک میکنند که نشاندهنده یک خطای کدگذاری است. ما از مدیریت خطای صریح برای سایر شرایطی که احتمال وقوع آنها در تولید بیشتر است استفاده کرده ایم.
بسیاری از خطاهای API علاوه بر کد نتیجه غیر صفر، منجر به یک ورودی گزارش می شوند. چنین ورودیهای گزارش میتوانند جزئیات بیشتری را ارائه دهند که به ویژه برای APIهای نسبتاً پیچیده مانند Engine::CreateAudioPlayer
مفید است.
شما می توانید گزارش را از طریق خط فرمان یا از Android Studio مشاهده کنید. برای بررسی لاگ از خط فرمان، عبارت زیر را تایپ کنید:
$ adb logcat
برای بررسی گزارش از Android Studio، View > Tool Windows > Logcat را انتخاب کنید. برای اطلاعات بیشتر، به نوشتن و مشاهده گزارشها با Logcat مراجعه کنید.
کد نمونه
توصیه می کنیم از کد نمونه پشتیبانی شده و آزمایش شده استفاده کنید که به عنوان یک مدل برای کد شما قابل استفاده است، که در پوشه های audio-echo و native-audio مخزن android-ndk GitHub قرار دارد.
احتیاط: مشخصات OpenSL ES 1.0.1 حاوی کد نمونه در ضمائم است (برای جزئیات بیشتر به رجیستری Khronos OpenSL ES مراجعه کنید). با این حال، مثالهای ضمیمه B: Sample Code و Appendix C: Use Case Sample Code از ویژگیهایی استفاده میکنند که توسط Android پشتیبانی نمیشوند. برخی از نمونهها حاوی خطاهای تایپی هستند یا از APIهایی استفاده میکنند که احتمالاً تغییر میکنند. هنگام مراجعه به این موارد با احتیاط عمل کنید. اگرچه این کد ممکن است در درک استاندارد کامل OpenSL ES مفید باشد، اما نباید از آن همانطور که در اندروید است استفاده کرد.
محتوای صوتی
در زیر برخی از روشهای مختلف برای بستهبندی محتوای صوتی برای برنامه شما آمده است:
- منابع : با قرار دادن فایل های صوتی خود در پوشه
res/raw/
، می توان به راحتی توسط API های مرتبط برایResources
به آنها دسترسی داشت. با این حال، هیچ دسترسی بومی مستقیمی به منابع وجود ندارد، بنابراین باید کد زبان برنامه نویسی جاوا را بنویسید تا قبل از استفاده آنها را کپی کنید. - دارایی ها : با قرار دادن فایل های صوتی خود در پوشه
assets/
، به طور مستقیم توسط API های مدیریت دارایی بومی Android قابل دسترسی هستند. برای اطلاعات بیشتر در مورد این APIها به فایل های هدرandroid/asset_manager.h
وandroid/asset_manager_jni.h
مراجعه کنید. کد مثال واقع در مخزن Android-ndk GitHub از این APIهای مدیریت دارایی بومی در ارتباط با مکان یاب داده توصیفگر فایل Android استفاده می کند. - شبکه : می توانید از مکان یاب داده URI برای پخش مستقیم محتوای صوتی از شبکه استفاده کنید. با این حال، حتما امنیت و مجوزها را بخوانید.
- سیستم فایل محلی : مکان یاب داده URI از طرح
file:
برای فایل های محلی پشتیبانی می کند، مشروط بر اینکه فایل ها توسط برنامه قابل دسترسی باشند. توجه داشته باشید که چارچوب امنیتی اندروید دسترسی به فایل را از طریق مکانیسمهای شناسه کاربر لینوکس و شناسه گروه محدود میکند. - ضبط شده : برنامه شما میتواند دادههای صوتی را از ورودی میکروفون ضبط کند، این محتوا را ذخیره کند و بعداً آن را پخش کند. کد مثال از این روش برای کلیپ Playback استفاده می کند.
- کامپایلشده و پیوند درونخط : میتوانید محتوای صوتی خود را مستقیماً به کتابخانه مشترک پیوند دهید و سپس آن را با استفاده از پخشکننده صوتی با مکان یاب داده صف بافر پخش کنید. این برای کلیپ های کوتاه با فرمت PCM مناسب است. کد مثال از این تکنیک برای کلیپ های Hello و Android استفاده می کند. دادههای PCM با استفاده از ابزار
bin2c
(ارائه نشده) به رشتههای هگزا تبدیل شد. - سنتز بلادرنگ : برنامه شما میتواند دادههای PCM را در لحظه سنتز کند و سپس آن را با استفاده از پخشکننده صوتی با مکان یاب داده صف بافر پخش کند. این یک تکنیک نسبتا پیشرفته است و جزئیات سنتز صدا خارج از حوصله این مقاله است.
توجه: یافتن یا ایجاد محتوای صوتی مفید برای برنامه شما خارج از حوصله این مقاله است. برای یافتن اطلاعات بیشتر می توانید از عبارات جستجوی وب مانند صدای تعاملی ، صدای بازی ، طراحی صدا و برنامه نویسی صوتی استفاده کنید.
احتیاط: این مسئولیت شماست که اطمینان حاصل کنید که از نظر قانونی مجاز به پخش یا ضبط محتوا هستید. ممکن است ملاحظات حفظ حریم خصوصی برای ضبط محتوا وجود داشته باشد.
نمونه کد
این نمونه برنامه ها در صفحه GitHub ما در دسترس هستند:
- audio-echo یک حلقه رفت و برگشت ورودی به خروجی ایجاد می کند.
- native-audio یک ضبط / پخش کننده صوتی ساده است.
اجرای Android NDK OpenSL ES با مشخصات مرجع OpenSL ES 1.0.1 از جهات مختلفی متفاوت است. این تفاوتها دلیل مهمی است که چرا نمونه کدی که مستقیماً از مشخصات مرجع OpenSL ES کپی میکنید ممکن است در برنامه Android شما کار نکند.
برای اطلاعات بیشتر در مورد تفاوتهای بین مشخصات مرجع و اجرای Android، به OpenSL ES برای Android مراجعه کنید.