ปรับแต่งคอมโพเนนต์สื่อ

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

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

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

หากตัวแยกสื่อเริ่มต้นไม่ตรงตามข้อกำหนด คุณสามารถวางปลั๊กอินตัวแยกที่กำหนดเองไว้ใน /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 (ที่มีทรัพยากร Dependency แบบส่งต่อ) ที่อยู่ในพาร์ติชันของผู้ให้บริการ เมื่อกระบวนการบริการตัวแปลงสัญญาณของผู้ให้บริการเริ่มต้นขึ้น ก็จะโหลดจุดแรกเข้าระดับบนสุดนี้ได้

สร้างตัวแยก

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

วางตัวแยกที่กำหนดเองไว้ใน /system/lib/64/extractors หรือ APEX ของผู้ให้บริการ ซึ่งจะเปิดขึ้นพร้อมกับ APEX ของ Google ที่มีตัวแยกของ 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 กับนามสกุล ก่อนหน้านี้ การแมปนี้ได้รับการจัดการในไฟล์ MediaFile.java ซึ่งยังคงมีการแมปจากประเภท MIME ไปยังค่าคงที่รูปแบบ MTP

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