ใน Android 12 (API ระดับ 31) ขึ้นไป ระบบจะแปลงวิดีโอที่บันทึกในรูปแบบต่างๆ เช่น HEVC (H.265) เป็น AVC (H.264) โดยอัตโนมัติเมื่อแอปที่ไม่รองรับ HEVC เปิดวิดีโอ ฟีเจอร์นี้ช่วยให้แอปจับภาพวิดีโอใช้การเข้ารหัสที่ทันสมัยและประหยัดพื้นที่เก็บข้อมูลมากขึ้นสำหรับวิดีโอที่บันทึกในอุปกรณ์โดยไม่ส่งผลกระทบต่อการใช้งานร่วมกับแอปอื่นๆ
เนื้อหาที่สร้างขึ้นบนอุปกรณ์สามารถแปลงเป็นรูปแบบต่อไปนี้โดยอัตโนมัติ
รูปแบบสื่อ | แอตทริบิวต์ XML | ประเภท MIME ของ MediaFormat |
---|---|---|
HEVC (H.265) | HEVC | MediaFormat.MIMETYPE_VIDEO_HEVC |
HDR10 | HDR10 | MediaFeature.HdrType.HDR10 |
HDR10+ | HDR10Plus | MediaFeature.HdrType.HDR10_PLUS |
Android จะถือว่าแอปรองรับการเล่นสื่อทุกรูปแบบ ดังนั้นการแปลงสื่อที่เข้ากันได้จึงปิดอยู่โดยค่าเริ่มต้น
กรณีที่ควรใช้การแปลง
การแปลงเป็นรูปแบบอื่นเป็นการดำเนินการที่ต้องใช้การประมวลผลมากและทำให้เกิดความล่าช้าอย่างมากเมื่อเปิดไฟล์วิดีโอ ตัวอย่างเช่น ไฟล์วิดีโอ HEVC ความยาว 1 นาทีจะใช้เวลาประมาณ 20 วินาทีในการแปลงเป็น AVC ในโทรศัพท์ Pixel 3 คุณจึงควรแปลงไฟล์วิดีโอเฉพาะเมื่อส่งไฟล์ออกจากอุปกรณ์เท่านั้น เช่น เมื่อแชร์ไฟล์วิดีโอกับผู้ใช้คนอื่นๆ ของแอปเดียวกัน หรือเซิร์ฟเวอร์ระบบคลาวด์ที่ไม่รองรับรูปแบบวิดีโอสมัยใหม่
อย่าแปลงไฟล์เมื่อเปิดไฟล์วิดีโอเพื่อเล่นในอุปกรณ์หรือสร้างภาพขนาดย่อ
การกำหนดค่าการแปลง
แอปสามารถควบคุมลักษณะการแปลงรหัสได้โดยประกาศความสามารถของสื่อ การประกาศความสามารถเหล่านี้มี 2 วิธี ได้แก่ ในโค้ดหรือในทรัพยากร
ประกาศความสามารถในโค้ด
คุณประกาศความสามารถของสื่อในโค้ดได้โดยการสร้างอินสแตนซ์ของออบเจ็กต์ ApplicationMediaCapabilities
โดยใช้เครื่องมือสร้าง ดังนี้
Kotlin
val mediaCapabilities = ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build()
Java
ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder() .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10) .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS) .build();
ใช้ออบเจ็กต์นี้เมื่อเข้าถึงเนื้อหาสื่อผ่านเมธอด เช่น ContentResolver#openTypedAssetFileDescriptor()
:
Kotlin
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
Java
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on values defined in the // ApplicationMediaCapabilities provided. }
วิธีนี้ช่วยให้ควบคุมเส้นทางโค้ดที่เฉพาะเจาะจงได้อย่างละเอียด เช่น การเรียกใช้การแปลงเฉพาะเมื่อโอนไฟล์วิดีโอออกจากอุปกรณ์ ซึ่งจะมีความสําคัญเหนือกว่าวิธีการที่อธิบายไว้ด้านล่าง
ประกาศความสามารถในทรัพยากร
การประกาศความสามารถในทรัพยากรช่วยให้ควบคุมการแปลงได้แบบครอบคลุม คุณควรใช้วิธีนี้เฉพาะในกรณีที่เจาะจงมากเท่านั้น ตัวอย่างเช่น หากแอป รับเฉพาะไฟล์วิดีโอจากแอปอื่นๆ เท่านั้น (แทนการเปิดไฟล์โดยตรง) แล้วอัปโหลดไปยังเซิร์ฟเวอร์ที่ไม่รองรับตัวแปลงรหัสวิดีโอที่ทันสมัย (ดูสถานการณ์ตัวอย่าง 1 ด้านล่าง)
การใช้วิธีนี้เมื่อไม่จำเป็นอาจทำให้เกิดการแปลงในสถานการณ์ที่ไม่ตั้งใจ เช่น เมื่อสร้างภาพปกวิดีโอ ซึ่งส่งผลให้ประสบการณ์ของผู้ใช้แย่ลง
หากต้องการใช้วิธีนี้ ให้สร้างไฟล์ทรัพยากร media_capabilities.xml
โดยทำดังนี้
<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
<format android:name="HEVC" supported="true"/>
<format android:name="HDR10" supported="false"/>
<format android:name="HDR10Plus" supported="false"/>
</media-capabilities>
ในตัวอย่างนี้ วิดีโอ HDR ที่บันทึกไว้ในอุปกรณ์จะแปลงเป็นวิดีโอ AAVC SDR (Standard Dynamic Range) ได้อย่างราบรื่น ส่วนวิดีโอ HEVC จะไม่แปลงเป็นวิดีโอ HEVC
ใช้แท็ก property
ภายในแท็ก application
เพื่อเพิ่มการอ้างอิงไปยังไฟล์ความสามารถสื่อ เพิ่มพร็อพเพอร์ตี้ต่อไปนี้ลงในไฟล์ AndroidManifest.xml
<property
android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
android:resource="@xml/media_capabilities" />
การใช้ความสามารถด้านสื่อของแอปอื่นเพื่อเปิดไฟล์วิดีโอ
หากแอปของคุณแชร์ไฟล์วิดีโอกับแอปอื่น ไฟล์วิดีโออาจต้องได้รับการเปลี่ยนรูปแบบก่อนที่แอปฝั่งที่รับจะเปิดได้
คุณจัดการเคสนี้ได้โดยการเปิดไฟล์วิดีโอโดยใช้ openTypedAssetFileDescriptor
และระบุ UID ของแอปที่รับ ซึ่งดูได้โดยใช้ Binder.getCallingUid
จากนั้นแพลตฟอร์มจะใช้ความสามารถด้านสื่อของแอปที่ใช้รับสัญญาณเพื่อระบุว่า
ควรแปลงไฟล์วิดีโอหรือไม่
Kotlin
val providerOptions = Bundle().apply { putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()) } contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions) .use { fileDescriptor -> // Content will be transcoded based on the media capabilities of the // calling app. }
Java
Bundle providerOptions = new Bundle(); providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid()); try (AssetFileDescriptor fileDescriptor = contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) { // Content will be transcoded based on the media capabilities of the // calling app. }
ตัวอย่างสถานการณ์
แผนภาพต่อไปนี้แสดง Use Case 2 รายการที่พบได้บ่อย ไม่ว่าในกรณีใด วิดีโอต้นฉบับจะจัดเก็บในรูปแบบ HEVC และแอปแชร์วิดีโอไม่รองรับ HEVC
ตัวอย่างที่ 1 แอปจับภาพวิดีโอเป็นผู้เริ่มการแปลงไฟล์
แอปแชร์วิดีโอประกาศว่าไม่รองรับ HEVC ในไฟล์ทรัพยากรความสามารถของสื่อ จากนั้นแอปจะขอวิดีโอจากแอปจับภาพวิดีโอ แอปจับภาพวิดีโอจะจัดการคำขอและเปิดไฟล์โดยใช้ openTypedAssetFileDescriptor
โดยระบุ UID ของแอปการแชร์ ซึ่งจะเป็นการเริ่มกระบวนการเปลี่ยนรูปแบบ
เมื่อได้รับวิดีโอที่แปลงแล้ว ระบบจะส่งวิดีโอดังกล่าวไปยังแอปการแชร์ ซึ่งจะอัปโหลดวิดีโอไปยังเซิร์ฟเวอร์ในระบบคลาวด์
ตัวอย่างที่ 2 แอปแชร์วิดีโอจะเป็นผู้เริ่มการแปลงไฟล์
แอปจับภาพวิดีโอจะแชร์วิดีโอกับแอปแชร์วิดีโอโดยใช้ MediaStore
URI แอปการแชร์วิดีโอเปิดไฟล์วิดีโอโดยใช้ openTypedAssetFileDescriptor
โดยระบุว่าไม่รองรับ HEVC ในความสามารถของสื่อ ซึ่งจะเป็นการเริ่มกระบวนการแปลงไฟล์ และเมื่อแปลงเสร็จแล้ว ระบบจะอัปโหลดไฟล์ไปยังเซิร์ฟเวอร์ในระบบคลาวด์
รูปแบบที่ไม่ได้ประกาศ
ระบบเปิดใช้การแปลงสื่อที่เข้ากันได้กับทุกรูปแบบที่ประกาศว่าไม่รองรับ และจะปิดใช้ทุกรูปแบบที่ประกาศว่ารองรับ สำหรับรูปแบบอื่นๆ ที่ไม่ได้ประกาศ แพลตฟอร์มจะเป็นผู้ตัดสินใจว่าจะแปลงไฟล์หรือไม่ ใน Android 12 ระบบจะปิดใช้การแปลงไฟล์สำหรับรูปแบบทั้งหมดที่ไม่ได้ประกาศ ลักษณะการทำงานนี้อาจเปลี่ยนแปลงสำหรับรูปแบบใหม่ในอนาคต
ตัวเลือกสำหรับนักพัฒนาแอป
คุณใช้ตัวเลือกต่อไปนี้สำหรับนักพัฒนาซอฟต์แวร์ต่อไปนี้เพื่อลบล้างลักษณะการแปลงเริ่มต้นของ Android
ลบล้างค่าเริ่มต้นของการแปลง การตั้งค่านี้กำหนดว่าแพลตฟอร์มจะควบคุมการแปลงอัตโนมัติหรือไม่ เมื่อเปิดใช้การลบล้าง ระบบจะไม่สนใจค่าเริ่มต้นของแพลตฟอร์มและการตั้งค่าเปิดใช้การแปลงจะควบคุมการแปลงอัตโนมัติ ตัวเลือกนี้จะปิดใช้โดยค่าเริ่มต้น
เปิดใช้การแปลง การตั้งค่านี้จะระบุว่ารูปแบบที่ไม่ได้ประกาศจะได้รับการแปลงโดยอัตโนมัติหรือไม่ ตัวเลือกนี้จะเปิดใช้โดยค่าเริ่มต้น แต่จะมีผลก็ต่อเมื่อเปิดใช้ลบล้างค่าเริ่มต้นของการแปลงด้วย
ถือว่าแอปรองรับรูปแบบสมัยใหม่ การตั้งค่านี้ควบคุมสิ่งที่จะเกิดขึ้นเมื่อแอปพยายามเล่นรูปแบบที่ไม่ได้ประกาศ กรณีนี้จะเกิดขึ้นเมื่อไฟล์ Manifest ไม่ได้ประกาศว่าแอปรองรับรูปแบบหนึ่งๆ หรือไม่ หรือ Google ไม่ได้เพิ่มแอปลงในรายการบังคับให้แปลงฝั่งเซิร์ฟเวอร์ เมื่อเปิดใช้การตั้งค่า แอปจะไม่เปลี่ยนรูปแบบ แต่เมื่อปิดใช้ แอปจะเปลี่ยนรูปแบบ ตัวเลือกนี้จะเปิดใช้โดยค่าเริ่มต้น
แสดงการแจ้งเตือนการแปลง เมื่อเปิดใช้ แอปจะแสดงการแจ้งเตือนความคืบหน้าในการแปลงเมื่อการแปลงเริ่มต้นขึ้นจากการอ่านไฟล์สื่อที่ไม่รองรับ ตัวเลือกนี้จะเปิดใช้อยู่โดยค่าเริ่มต้น
ปิดใช้แคชสำหรับการแปลง หากเปิดใช้ แอปที่ต้องแปลงจะไม่ใช้แคชสำหรับการแปลง ซึ่งจะเป็นประโยชน์ในระหว่างการพัฒนาเพื่อให้ทริกเกอร์การแปลงในไฟล์สื่อที่ไม่รองรับได้โดยง่าย แต่อาจทำให้อุปกรณ์มีประสิทธิภาพไม่ดี ตัวเลือกนี้จะปิดไว้โดยค่าเริ่มต้น