คุณขยายเครื่องมือแยกสื่อและคอมโพเนนต์ตัวแปลงรหัสสื่อได้โดยใช้ส่วนขยายผู้ให้บริการ MediaSession2 และ MediaParser API ปรับแต่งไม่ได้ (แต่คุณอัปสตรีมการเปลี่ยนแปลงสำหรับ API MediaPlayer
และ MediaSession
เดิมได้)
หากต้องการรองรับประเภทสื่อเพิ่มเติมในเฟรมเวิร์กสื่อของ Android คุณต้องสร้างเครื่องมือแยกและโปรแกรมถอดรหัสที่กำหนดเอง ตัวอย่างเช่น หากต้องการเพิ่มการรองรับวิดีโอ Windows Media ในไฟล์ AVI คุณต้องสร้าง AVIExtractor และDecoder วิดีโอ 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 ขึ้นไปรองรับเฉพาะ 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 เป็นส่วนขยาย ก่อนหน้านี้ การแมปนี้ได้รับการจัดการในไฟล์ MediaFile.java
ซึ่งยังคงมีการแมปจากประเภท MIME ไปยังค่าคงที่ของรูปแบบ MTP
เครื่องมือแยกสามารถส่งออกรายการนามสกุลไฟล์ที่รองรับ (เช่น MP3 หรือ MP4) อย่างไรก็ตาม มีเพียง LegacyMediaScanner
เท่านั้นที่ใช้รูปแบบดังกล่าว ซึ่งไม่ส่งผลกับ ModernMediaScanner
ซึ่งใช้โดยค่าเริ่มต้น