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

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

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

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

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

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

สร้างเครื่องมือแยกข้อมูล

เมื่อเพิ่มเครื่องมือแยกสำหรับรูปแบบใหม่ ให้ตรวจสอบว่าเครื่องมือแยกข้อมูลใช้ NDK API ที่เสถียรเท่านั้นและไม่อาศัย 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 ของผู้ให้บริการ ซึ่งจะเปิดพร้อมกับ 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 เป็นส่วนขยาย ก่อนหน้านี้จะมีการจัดการการแมปนี้ในไฟล์ MediaFile.java ซึ่งยังคงมีการแมปจากประเภท MIME เป็นค่าคงที่ของรูปแบบ MTP ต่อไป

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