การแปลงสื่อที่เข้ากันได้

ใน Android 12 (API ระดับ 31) ขึ้นไป ระบบจะแปลงโดยอัตโนมัติ วิดีโอที่บันทึกในรูปแบบต่างๆ เช่น HEVC (H.265) ถึง AVC (H.264) เมื่อวิดีโอ เปิดโดยแอปที่ไม่รองรับ HEVC ฟีเจอร์นี้อนุญาตให้เล่นวิดีโอ จับภาพแอปเพื่อใช้การเข้ารหัสที่ทันสมัยและประหยัดพื้นที่เก็บข้อมูลสำหรับวิดีโอ บันทึกในอุปกรณ์โดยไม่ส่งผลกระทบต่อการใช้งานกับแอปอื่นๆ

รูปแบบต่อไปนี้สามารถแปลงโดยอัตโนมัติสำหรับเนื้อหาที่ สร้างในอุปกรณ์:

รูปแบบสื่อ แอตทริบิวต์ XML ประเภท MIME MediaFormat
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 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 ที่บันทึกในอุปกรณ์จะได้รับการแปลงเป็น แสดงวิดีโอ AVC SDR (Standard Dynamic Range) แต่วิดีโอ 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.
}

ตัวอย่างสถานการณ์

แผนภาพต่อไปนี้แสดงกรณีการใช้งานทั่วไป 2 กรณี ในทั้ง 2 กรณี วิดีโอต้นฉบับจะจัดเก็บไว้ในรูปแบบ HEVC และแอปแชร์วิดีโอจะไม่ รองรับ HEVC

ตัวอย่างที่ 1 ระบบเริ่มการแปลงโดยแอปจับภาพวิดีโอ ตัวอย่างที่ 1 แอปแชร์วิดีโอแจ้งว่าแอปไม่รองรับ HEVC ในสื่อ ไฟล์ทรัพยากรความสามารถ จากนั้นจะขอวิดีโอจากแอปจับภาพวิดีโอ การจับภาพวิดีโอ แอปจะจัดการคำขอและเปิดไฟล์โดยใช้ openTypedAssetFileDescriptor โดยระบุ UID ของแอปที่แชร์ ซึ่งจะเป็นการเริ่มกระบวนการแปลง เมื่อได้รับวิดีโอที่แปลงแล้ว วิดีโอจะส่งไปยังแอปการแชร์ ซึ่งจะอัปโหลดวิดีโอไปยังเซิร์ฟเวอร์ในระบบคลาวด์

ตัวอย่างที่ 2 การแปลงเริ่มโดยแอปการแชร์วิดีโอ ตัวอย่างที่ 2 แอปจับภาพวิดีโอแชร์วิดีโอกับแอปแชร์วิดีโอโดยใช้ URI MediaStore แอปแชร์วิดีโอจะเปิดไฟล์วิดีโอโดยใช้ openTypedAssetFileDescriptor ซึ่งระบุว่าแอปไม่รองรับ HEVC ในความสามารถด้านสื่อ ช่วงเวลานี้ เริ่มกระบวนการแปลงรหัส และเมื่อดำเนินการเสร็จสิ้น ไฟล์จะถูกอัปโหลดไปยัง เซิร์ฟเวอร์ในระบบคลาวด์

รูปแบบที่ไม่ได้ประกาศ

เปิดใช้การแปลงสื่อที่เข้ากันได้ทุกรูปแบบที่มีการประกาศ ไม่รองรับ และปิดใช้ในทุกรูปแบบที่ประกาศว่ารองรับ สำหรับ รูปแบบอื่นๆ ที่ไม่ได้ประกาศ แพลตฟอร์มจะตัดสินใจว่าจะแปลงหรือไม่ หรือไม่ ในการแปลง Android 12 ปิดใช้อยู่ สำหรับรูปแบบที่ไม่ได้ประกาศทั้งหมด ลักษณะการทำงานนี้อาจเปลี่ยนแปลงไปสำหรับรูปแบบใหม่ใน ในอนาคต

ตัวเลือกสำหรับนักพัฒนาแอป

คุณสามารถใช้ตัวเลือกสำหรับนักพัฒนาแอปต่อไปนี้เพื่อลบล้างค่าเริ่มต้นของ Android ลักษณะการแปลง:

  • ลบล้างค่าเริ่มต้นของการแปลง การตั้งค่านี้จะกำหนดว่าหรือไม่ แพลตฟอร์มจะควบคุมการแปลงอัตโนมัติ เมื่อลบล้าง เปิดใช้ ค่าเริ่มต้นของแพลตฟอร์มจะถูกละเว้น และฟังก์ชันเปิดใช้งาน การแปลงควบคุมการแปลงอัตโนมัติ ตัวเลือกนี้ปิดใช้อยู่โดย "ค่าเริ่มต้น"

  • เปิดใช้การแปลง การตั้งค่านี้จะระบุว่าไม่มีการประกาศ จะแปลงโดยอัตโนมัติ โดยจะเปิดใช้อยู่โดยค่าเริ่มต้น แต่จะเป็นเพียง จะมีผลหากเปิดใช้ลบล้างค่าเริ่มต้นในการแปลงด้วย

  • สมมติว่าแอปรองรับรูปแบบสมัยใหม่ การตั้งค่านี้จะควบคุมสิ่งที่จะเกิดขึ้นเมื่อ แอปจะพยายามเล่นรูปแบบที่ไม่ได้ประกาศ กรณีนี้จะเกิดขึ้นเมื่อไฟล์ Manifest ไม่ประกาศว่าแอปรองรับรูปแบบหนึ่งๆ หรือไม่ หรือ Google ยังไม่ได้เพิ่มแอปลงในรายการการบังคับแปลงฝั่งเซิร์ฟเวอร์ เมื่อตั้งค่า เปิดอยู่ แอปจะไม่แปลง เมื่อปิดใช้ แอปจะทำการแปลง Transcode ตัวเลือกนี้จะเปิดใช้โดยค่าเริ่มต้น

  • แสดงการแจ้งเตือนการแปลง เมื่อเปิดใช้ แอปจะแสดง การแจ้งเตือนความคืบหน้าในการแปลงเมื่อการแปลงถูกเรียกใช้โดยการอ่าน ไฟล์สื่อที่ไม่รองรับ ตัวเลือกนี้จะเปิดใช้โดยค่าเริ่มต้น

  • ปิดใช้แคชการแปลง หากเปิดใช้ แอปที่ต้องแปลงจะไม่ ใช้แคชการแปลง ซึ่งจะเป็นประโยชน์ระหว่างการพัฒนาเพื่อให้ เรียกใช้การแปลงในไฟล์สื่อที่ไม่รองรับ แต่อาจทำให้อุปกรณ์มีประสิทธิภาพต่ำ ด้านประสิทธิภาพ ตัวเลือกนี้จะปิดใช้โดยค่าเริ่มต้น