คุณขยายคอมโพเนนต์ตัวแยกสื่อและตัวแปลงรหัสสื่อได้โดยใช้ส่วนขยายของผู้ให้บริการ
คุณปรับแต่ง MediaSession2 และ MediaParser API ไม่ได้ (แต่คุณ
สามารถส่งการเปลี่ยนแปลงไปยังต้นทางสำหรับ MediaPlayer
และ MediaSession
API เดิมได้)
หากต้องการรองรับสื่อประเภทอื่นๆ ในเฟรมเวิร์กสื่อของ Android คุณต้องสร้างตัวแยกและตัวถอดรหัสที่กำหนดเอง ตัวอย่างเช่น หากต้องการเพิ่มการรองรับวิดีโอ Windows Media ในไฟล์ AVI คุณต้องสร้าง Extractor ของ AVI และตัวถอดรหัสวิดีโอ 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
ซึ่งใช้โดยค่าเริ่มต้น