ปรับแต่งส่วนประกอบสื่อ

คุณสามารถขยายส่วนประกอบตัวแยกสื่อและตัวแปลงสัญญาณสื่อได้โดยใช้ส่วนขยายของผู้จำหน่าย ไม่สามารถปรับแต่ง MediaSession2 และ MediaParser API ได้ (แต่คุณสามารถเปลี่ยนแปลงอัปสตรีมสำหรับ MediaPlayer และ MediaSession API รุ่นเก่าได้)

หากต้องการรองรับสื่อประเภทเพิ่มเติมในเฟรมเวิร์กสื่อ Android คุณต้องสร้าง ตัวแยก และ ตัวถอดรหัส แบบกำหนดเอง ตัวอย่างเช่น หากต้องการเพิ่มการรองรับวิดีโอ Windows Media ในไฟล์ AVI คุณต้องสร้าง AVI Extractor และ Windows Media Video Decoder

เกี่ยวกับส่วนขยาย

หากตัวแยกสื่อเริ่มต้นไม่ตรงตามความต้องการของคุณ คุณสามารถวางปลั๊กอินตัวแยกแบบกำหนดเองใน /system/lib[64]/extractors/ กระบวนการแยกข้อมูลจะโหลดปลั๊กอินแยกข้อมูลโดยอัตโนมัติจากแพ็คเกจ APEX ที่ Google จัดเตรียมไว้ให้ และจาก /system/lib[64]/extractors/

ในทำนองเดียวกัน คุณสามารถตั้งค่าบริการตัวแปลงสัญญาณสื่อแบบกำหนดเองที่ใช้อินเทอร์เฟซ Codec 2.0 ที่กำหนดไว้ใน frameworks/av/media/codec2/core/ สำหรับการใช้งานขั้นพื้นฐาน โปรดดูที่ frameworks/av/media/codec2/hidl/services/ จุดเข้าใช้งานไลบรารีคืออินเทอร์เฟซ C2ComponentStore ตัวอย่างเช่น อ้างถึงการใช้งานร้านค้าตัวแปลงสัญญาณซอฟต์แวร์เริ่มต้นที่ frameworks/av/media/codec2/vndk/C2Store.cpp

เมื่อใช้ APEX ของคุณเอง ให้จัดโครงสร้างบริการตัวแปลงสัญญาณและโหลดไฟล์ APEX โดยใช้กระบวนการเดียวกันกับบริการ mediaswcodec ในการทำเช่นนั้น ให้กำหนดไลบรารีที่ใช้ร่วมกันระดับบนสุดที่รับผิดชอบในการลงทะเบียนส่วนประกอบ C2 ทั้งหมด จากนั้นสร้างแพ็คเกจ APEX (ที่มีการขึ้นต่อกันแบบสกรรมกริยา) ที่อยู่ในพาร์ติชันผู้จำหน่าย เมื่อเริ่มกระบวนการบริการตัวแปลงสัญญาณของผู้จัดจำหน่าย ก็สามารถโหลดจุดเข้าใช้งานระดับบนสุดนี้ได้

สร้างเครื่องแยก

เมื่อเพิ่มตัวแยกข้อมูลสำหรับรูปแบบใหม่ ตรวจสอบให้แน่ใจว่าตัวแยกข้อมูลจะขึ้นอยู่กับ NDK API ที่เสถียรเท่านั้น และไม่ได้ขึ้นอยู่กับ API ส่วนตัวใดๆ ตัวแยกควรใช้ API ที่กำหนดโดย frameworks/av/include/media/MediaExtractorPluginApi.h และสามารถใช้ตัวห่ออำนวยความสะดวก C++ ใน frameworks/av/include/media/MediaExtractorPluginHelper.h เนื่องจาก Android 10 ขึ้นไปรองรับเฉพาะ Extractor API เวอร์ชันสูงสุดเท่านั้น โปรดแน่ใจว่าได้สร้างโมเดล Extractor ของคุณตามหลัง Extractor ด้วยหมายเลขเวอร์ชัน API สูงสุด

วางตัวแยกแบบกำหนดเองใน /system/lib/64/extractors หรือผู้จำหน่าย APEX ซึ่งเปิดพร้อมกับ Google APEX ที่มีตัวแยกข้อมูลของ Google ในการตรวจสอบเฟรมเวิร์กที่โหลดตัวแยกข้อมูลของคุณให้รันคำสั่งต่อไปนี้

adb shell dumpsys media.extractor

คุณควรได้รับรายการตัวแยกที่มีอยู่ซึ่งคล้ายกับรายการต่อไปนี้

Available extractors:
AAC Extractor: plugin\_version(2), uuid(4fd80eae03d24d729eb948fa6bb54613), version(1), path(/system/lib64/extractors/libaacextractor.so)
AMR Extractor: plugin\_version(2), uuid(c86639c92f3140aca715fa01b4493aaf), version(1), path(/system/lib64/extractors/libamrextractor.so)
FLAC Extractor: plugin\_version(2), uuid(1364b048cc454fda9934327d0ebf9829), version(1), path(/system/lib64/extractors/libflacextractor.so)
MIDI Extractor: plugin\_version(2), uuid(ef6cca0af8a243e6ba5fdfcd7c9a7ef2), version(1), path(/system/lib64/extractors/libmidiextractor.so)
MP3 Extractor: plugin\_version(2), uuid(812a3f6cc8cf46deb5293774b14103d4), version(1), path(/system/lib64/extractors/libmp3extractor.so)
MP4 Extractor: plugin\_version(2), uuid(27575c6744174c548d3d8e626985a164), version(2), path(/system/lib64/extractors/libmp4extractor.so)
MPEG2-PS/TS Extractor: plugin\_version(1), uuid(3d1dcfebe40a436da574c2438a555e5f), version(1), path(/system/lib64/extractors/libmpeg2extractor.so)
Matroska Extractor: plugin\_version(2), uuid(abbedd9238c44904a4c1b3f45f899980), version(1), path(/system/lib64/extractors/libmkvextractor.so)
Ogg Extractor: plugin\_version(2), uuid(8cc5cd06f772495e8a62cba9649374e9), version(1), path(/system/lib64/extractors/liboggextractor.so)
WAV Extractor: plugin\_version(3), uuid(7d61385858374a3884c5332d1cddee27), version(1), path(/system/lib64/extractors/libwavextractor.so)

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

เมื่อเฟรมเวิร์กสื่อโหลดตัวแยกข้อมูลของคุณ (จาก /system/lib/64/extractors หรือจากผู้จำหน่าย APEX) ระบบจะจดจำไฟล์และรับข้อมูลเกี่ยวกับเนื้อหาในนั้น ขั้นตอนต่อไปคือการเพิ่มตัวถอดรหัสสำหรับรูปแบบเพื่อให้เฟรมเวิร์กสามารถเข้าใจวิธีแยกวิเคราะห์เนื้อหาไฟล์ได้

สร้างตัวถอดรหัสแบบกำหนดเอง

คุณต้องมีตัวถอดรหัสที่กำหนดเองสำหรับรูปแบบใดๆ ที่ตัวถอดรหัสที่ Google เตรียมไว้ให้ยังไม่รองรับ ตัวอย่างเช่น:

  • หากต้องการเพิ่มการรองรับกรอบงานสื่อสำหรับไฟล์ AVI ที่มี MP3 คุณต้องมีโปรแกรมแยกไฟล์ AVI แต่ไม่จำเป็นต้องใช้ตัวถอดรหัส MP3 เนื่องจากมีอยู่แล้ว

  • หากต้องการเพิ่มการรองรับกรอบงานสื่อสำหรับไฟล์ AVI ที่มี Windows Media คุณต้องมีทั้งตัวแยก AVI และตัวถอดรหัส Windows Media

การเพิ่มตัวถอดรหัสใหม่จะคล้ายกับการเพิ่มตัวถอดรหัสฮาร์ดแวร์ของคุณเองสำหรับ AVC หรือ HEVC

แม้ว่าตัวแยกจะเผยแพร่แทร็กสื่อประเภท MIME ที่มีอยู่ แต่ต้องมีตัวแปลงสัญญาณที่รองรับประเภท MIME เหล่านี้เพื่อให้ไฟล์ได้รับการสนับสนุนอย่างสมบูรณ์ สตริงประเภท MIME จริงที่ใช้นั้นเป็นข้อตกลงระหว่างตัวแยกและตัวแปลงสัญญาณอย่างเคร่งครัด (ไม่จำเป็นต้องเพิ่มสตริงลงในไฟล์ MediaDefs.h )

บูรณาการกับเครื่องสแกนสื่อ

เครื่องสแกนสื่อจะค้นหาไฟล์ประเภทใหม่และเพิ่มลงในฐานข้อมูลสื่อ หากต้องการให้เครื่องสแกนสื่อจัดการกับประเภทไฟล์ที่คุณกำหนดเอง เครื่องสแกนจำเป็นต้องทราบเรื่องนี้ ใน Android 10 หรือสูงกว่า MimeUtils (ใน libcore ) จะรักษาการแมป MIME-to-extension ก่อนหน้านี้ การแมปนี้ได้รับการจัดการในไฟล์ MediaFile.java ซึ่งยังคงมีการแมปจากประเภท MIME ไปจนถึงค่าคงที่ของรูปแบบ MTP

โปรแกรมแยกไฟล์สามารถส่งออกรายการนามสกุลไฟล์ที่รองรับ (เช่น MP3 หรือ MP4) อย่างไรก็ตาม มีเพียง LegacyMediaScanner เท่านั้นที่ใช้สิ่งนั้น ไม่มีผลกับ ModernMediaScanner ซึ่งใช้เป็นค่าเริ่มต้น