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