เริ่มเลย

คำเตือน: OpenSL ES เลิกใช้งานแล้ว นักพัฒนาซอฟต์แวร์ควรใช้ไลบรารี Oboe แบบโอเพนซอร์สที่มีอยู่ใน GitHub Oboe เป็น Wrapper ของ C++ ที่มี API ที่คล้ายกับ AAudio มาก Oboe จะเรียกใช้ AAudio เมื่อ AAudio พร้อมใช้งาน และเปลี่ยนไปใช้ OpenSL ES หาก AAudio ไม่พร้อมใช้งาน

ส่วนนี้จะให้ข้อมูลที่จำเป็นในการเริ่มต้นใช้งาน API ของ OpenSL ES

เพิ่ม OpenSL ES ลงในแอป

คุณเรียกใช้ OpenSL ES ได้จากทั้งโค้ด C และ C++ หากต้องการเพิ่มชุดฟีเจอร์หลักของ OpenSL ES ลงในแอป ให้รวมไฟล์ส่วนหัว OpenSLES.h ต่อไปนี้

#include <SLES/OpenSLES.h>

หากต้องการเพิ่มส่วนขยาย Android ของ OpenSL ES ด้วย ให้ใส่ไฟล์ส่วนหัว 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 แม้ว่าวิธีใดวิธีหนึ่งอาจเหมาะกับ Use Case หนึ่งๆ มากกว่า

เราใช้การยืนยันใน ตัวอย่าง เนื่องจากช่วยจับเงื่อนไขที่ไม่สมจริงซึ่งบ่งบอกถึงข้อผิดพลาดในการเขียนโค้ด เราได้ใช้การจัดการข้อผิดพลาดอย่างชัดแจ้งสำหรับเงื่อนไขอื่นๆ ที่มีแนวโน้มว่าจะเกิดขึ้นในเวอร์ชันที่ใช้งานจริง

ข้อผิดพลาดของ API หลายรายการจะส่งผลให้มีรายการบันทึก นอกเหนือจากรหัสผลลัพธ์ที่ไม่ใช่ 0 รายการบันทึกดังกล่าวจะให้รายละเอียดเพิ่มเติมที่เป็นประโยชน์อย่างยิ่งสำหรับ API ที่ซับซ้อน เช่น Engine::CreateAudioPlayer

คุณสามารถดูบันทึกได้จากบรรทัดคำสั่งหรือจาก Android Studio หากต้องการตรวจสอบบันทึกจากบรรทัดคำสั่ง ให้พิมพ์ข้อมูลต่อไปนี้

$ adb logcat

หากต้องการตรวจสอบบันทึกจาก Android Studio ให้เลือกดู > หน้าต่างเครื่องมือ > Logcat โปรดดูข้อมูลเพิ่มเติมที่หัวข้อเขียนและดูบันทึกด้วย Logcat

โค้ดตัวอย่าง

เราขอแนะนำให้ใช้โค้ดตัวอย่างที่รองรับและทดสอบซึ่งใช้เป็นโมเดลสำหรับโค้ดของคุณเอง ซึ่งจะอยู่ในโฟลเดอร์ audio-echo และ native-audio ของที่เก็บ android-ndk GitHub

ข้อควรระวัง: ข้อกำหนดของ OpenSL ES 1.0.1 มีตัวอย่างโค้ดในภาคผนวก (ดูรายละเอียดเพิ่มเติมได้ที่Khronos OpenSL ES Registry) อย่างไรก็ตาม ตัวอย่างในภาคผนวก ข: โค้ดตัวอย่างและภาคผนวก ค: โค้ดตัวอย่างกรณีการใช้งานใช้ฟีเจอร์ที่ Android ไม่รองรับ ตัวอย่างบางส่วนยังมีข้อผิดพลาดในการพิมพ์หรือใช้ API ที่มีแนวโน้มที่จะเปลี่ยนแปลงด้วย โปรดใช้ความระมัดระวังเมื่อพูดถึงข้อกำหนดเหล่านี้ แม้ว่าโค้ดอาจมีประโยชน์ในการทำความเข้าใจมาตรฐาน OpenSL ES ฉบับเต็ม แต่ไม่ควรใช้โค้ดตามที่มีอยู่กับ Android

เนื้อหาเสียง

วิธีการต่างๆ ในการจัดแพ็กเกจเนื้อหาเสียงสำหรับแอปพลิเคชันของคุณมีดังนี้

  • แหล่งข้อมูล: เมื่อวางไฟล์เสียงไว้ในโฟลเดอร์ res/raw/ แล้ว API ที่เกี่ยวข้องจะเข้าถึงไฟล์เหล่านั้นได้ง่ายๆ สำหรับ Resources อย่างไรก็ตาม จะไม่มีสิทธิ์เข้าถึงทรัพยากรโดยตรง ดังนั้นคุณต้องเขียนโค้ดภาษาโปรแกรม Java เพื่อคัดลอกทรัพยากรออกมาก่อนใช้งาน
  • เนื้อหา: เมื่อวางไฟล์เสียงไว้ในโฟลเดอร์ assets/ API เครื่องมือจัดการเนื้อหาของ Android ดั้งเดิมจะเข้าถึงไฟล์เหล่านั้นได้โดยตรง ดูข้อมูลเพิ่มเติมเกี่ยวกับ API เหล่านี้ได้ในไฟล์ส่วนหัว android/asset_manager.h และ android/asset_manager_jni.h โค้ดตัวอย่างที่อยู่ในที่เก็บ android-ndk GitHub ใช้ API เครื่องมือจัดการเนื้อหาแบบเนทีฟเหล่านี้ร่วมกับตัวระบุตำแหน่งข้อมูลข้อบ่งชี้ไฟล์ Android
  • เครือข่าย: คุณสามารถใช้ตัวระบุตำแหน่งข้อมูล URI เพื่อเล่นเนื้อหาเสียงจากเครือข่ายได้โดยตรง อย่างไรก็ตาม โปรดอ่านความปลอดภัยและสิทธิ์
  • ระบบไฟล์ในเครื่อง: ตัวระบุตำแหน่งข้อมูล URI รองรับรูปแบบ file: สำหรับไฟล์ในเครื่อง ในกรณีที่แอปพลิเคชันเข้าถึงไฟล์ได้ โปรดทราบว่าเฟรมเวิร์กความปลอดภัยของ Android จะจํากัดการเข้าถึงไฟล์ผ่านกลไกรหัสผู้ใช้และรหัสกลุ่มของ Linux
  • บันทึกแล้ว: แอปพลิเคชันสามารถบันทึกข้อมูลเสียงจากอินพุตไมโครโฟน จัดเก็บเนื้อหานี้ แล้วเล่นในภายหลังได้ โค้ดตัวอย่างใช้วิธีการนี้กับคลิป การเริ่มเล่น
  • คอมไพล์และลิงก์อินไลน์: คุณลิงก์เนื้อหาเสียงไปยังไลบรารีที่ใช้ร่วมกันได้โดยตรง จากนั้นเล่นเนื้อหาโดยใช้โปรแกรมเล่นเสียงที่มีตัวระบุตำแหน่งข้อมูลคิวบัฟเฟอร์ ซึ่งเหมาะอย่างยิ่งสำหรับคลิป PCM สั้นๆ โค้ดตัวอย่างใช้เทคนิคนี้สำหรับคลิป Hello และ Android ข้อมูล PCM ได้รับการแปลงเป็นสตริงฐาน 16 โดยใช้เครื่องมือ bin2c (ไม่ได้ให้มา)
  • การสังเคราะห์แบบเรียลไทม์: แอปพลิเคชันสามารถสังเคราะห์ข้อมูล PCM ขณะเล่น แล้วเล่นโดยใช้โปรแกรมเล่นเสียงที่มีตัวระบุข้อมูลคิวบัฟเฟอร์ เทคนิคนี้เป็นเทคนิคที่ค่อนข้างขั้นสูง และรายละเอียดของการสังเคราะห์เสียงอยู่นอกเหนือขอบเขตของบทความนี้

หมายเหตุ: การค้นหาหรือสร้างเนื้อหาเสียงที่มีประโยชน์สำหรับแอปพลิเคชันอยู่นอกเหนือขอบเขตของบทความนี้ คุณสามารถใช้คําค้นหาบนเว็บ เช่น เสียงแบบอินเทอร์แอกทีฟ เสียงในเกม การออกแบบเสียง และการเขียนโปรแกรมเสียง เพื่อค้นหาข้อมูลเพิ่มเติม

ข้อควรระวัง: คุณมีหน้าที่ตรวจสอบว่าคุณได้รับอนุญาตให้เล่นหรือบันทึกเนื้อหาอย่างถูกกฎหมาย การบันทึกเนื้อหาอาจต้องคำนึงถึงความเป็นส่วนตัว

ตัวอย่างโค้ด

แอปตัวอย่างเหล่านี้มีอยู่ในหน้า GitHub

การใช้งาน OpenSL ES ของ Android NDK แตกต่างจากข้อกำหนดอ้างอิงสำหรับ OpenSL ES 1.0.1 ในหลายด้าน ความแตกต่างเหล่านี้เป็นเหตุผลสำคัญที่ทำให้โค้ดตัวอย่างที่คุณคัดลอกจากข้อกำหนดการอ้างอิง OpenSL ES โดยตรงอาจใช้งานไม่ได้ในแอป Android

ดูข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างข้อกำหนดอ้างอิงกับการใช้งาน Android ได้ที่ OpenSL ES สำหรับ Android