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

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

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

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

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