Chuyển mã tệp đa phương tiện tương thích

Trên Android 12 (API cấp 31) trở lên, hệ thống có thể tự động chuyển đổi video được quay ở các định dạng như HEVC (H.265) sang AVC (H.264) khi video được mở bằng một ứng dụng không hỗ trợ HEVC. Tính năng này cho phép phát video ghi lại ứng dụng để sử dụng chế độ mã hoá hiện đại và tiết kiệm dung lượng hơn cho video được ghi lại trên thiết bị mà không làm giảm khả năng tương thích với các ứng dụng khác.

Các định dạng sau đây có thể được tự động chuyển mã cho nội dung được tạo trên thiết bị:

Định dạng nội dung đa phương tiện Thuộc tính XML Loại MIME của MediaFormat
HEVC (H.265) chuẩn HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

Android giả định rằng ứng dụng có thể hỗ trợ phát mọi định dạng nội dung nghe nhìn. Vì vậy, chuyển mã tệp đa phương tiện tương thích bị tắt theo mặc định.

Trường hợp sử dụng phương thức chuyển mã

Chuyển mã là một thao tác tính toán tốn kém và đóng góp đáng kể khi mở tệp video. Ví dụ: tệp video HEVC 1 phút mất khoảng 20 giây để chuyển mã thành AVC trên điện thoại Pixel 3. Vì lý do này, bạn chỉ nên chuyển mã tệp video khi gửi nó ra khỏi thiết bị. Ví dụ: khi chia sẻ một tệp video với những người dùng khác cùng sử dụng hoặc một máy chủ đám mây không hỗ trợ video hiện đại .

Đừng chuyển mã khi mở tệp video để phát trên thiết bị hoặc khi tạo hình thu nhỏ.

Định cấu hình chuyển mã

Các ứng dụng có thể kiểm soát hành vi chuyển mã bằng cách khai báo nội dung nghe nhìn các chức năng khác nhau. Có hai cách để khai báo những khả năng này: trong mã, hoặc trong một tài nguyên.

Khai báo chức năng trong mã

Bạn có thể khai báo các chức năng của nội dung nghe nhìn trong mã bằng cách tạo một thực thể của Đối tượng ApplicationMediaCapabilities sử dụng trình tạo:

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();

Sử dụng đối tượng này khi truy cập vào nội dung nghe nhìn thông qua các phương thức như 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.
}

Phương thức này cho phép kiểm soát chi tiết các đường dẫn mã cụ thể, chẳng hạn như như gọi chuyển mã khi chuyển tệp video ra ngoài thiết bị. Phương thức này được ưu tiên hơn phương thức được mô tả dưới đây.

Khai báo các chức năng trong tài nguyên

Việc khai báo các khả năng trong một tài nguyên cho phép kiểm soát hàng loạt quá trình chuyển mã. Phương pháp này chỉ nên được sử dụng trong các trường hợp rất cụ thể. Ví dụ: nếu ứng dụng của bạn chỉ nhận tệp video từ các ứng dụng khác (thay vì mở trực tiếp) rồi tải chúng lên một máy chủ không hỗ trợ bộ mã hoá và giải mã video hiện đại (xem tình huống ví dụ 1 bên dưới).

Việc sử dụng phương pháp này khi không thực sự cần thiết có thể gọi quá trình chuyển mã trong các trường hợp ngoài ý muốn, chẳng hạn như khi thu nhỏ video, làm giảm trải nghiệm người dùng.

Để sử dụng phương thức này, hãy tạo tệp tài nguyên 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>

Trong ví dụ này, video HDR đã ghi trên thiết bị được chuyển mã liền mạch thành Video AVC SDR (dải động chuẩn), trong khi video HEVC thì không.

Sử dụng thẻ property trong thẻ application để thêm tệp tham chiếu đến nội dung nghe nhìn tệp chức năng. Thêm các thuộc tính này vào tệp AndroidManifest.xml:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

Sử dụng tính năng nội dung nghe nhìn của một ứng dụng khác để mở tệp video

Nếu ứng dụng của bạn chia sẻ tệp video với một ứng dụng khác, thì tệp video có thể cần phải được chuyển mã trước khi ứng dụng nhận có thể mở tệp đó.

Bạn có thể xử lý trường hợp này bằng cách mở tệp video bằng openTypedAssetFileDescriptor và chỉ định UID của ứng dụng nhận mà bạn có thể lấy bằng Binder.getCallingUid. Sau đó, nền tảng này sử dụng khả năng nghe nhìn của ứng dụng nhận để xác định tệp video có được chuyển mã hay không.

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.
}

Trường hợp ví dụ

Các biểu đồ sau đây minh hoạ 2 trường hợp sử dụng phổ biến. Trong cả hai trường hợp, video gốc đều được lưu trữ ở định dạng HEVC còn ứng dụng chia sẻ video thì không hỗ trợ HEVC.

Ví dụ 1. Quá trình chuyển mã được khởi tạo bằng ứng dụng quay video. Ví dụ 1 Ứng dụng chia sẻ video tuyên bố rằng ứng dụng này không hỗ trợ chuẩn HEVC trong nội dung đa phương tiện tệp tài nguyên chức năng. Sau đó, hệ thống sẽ yêu cầu một video từ ứng dụng quay video. Quay video ứng dụng xử lý yêu cầu và mở tệp bằng openTypedAssetFileDescriptor, chỉ định UID của ứng dụng chia sẻ. Thao tác này sẽ bắt đầu quá trình chuyển mã. Khi nhận được video đã chuyển mã, video đó sẽ được cung cấp cho ứng dụng chia sẻ và ứng dụng này sẽ tải video lên một máy chủ trên đám mây.

Ví dụ 2. Ứng dụng chia sẻ video bắt đầu quá trình chuyển mã. Ví dụ 2 Ứng dụng quay video chia sẻ video với ứng dụng chia sẻ video bằng URI MediaStore. Ứng dụng chia sẻ video sẽ mở tệp video bằng openTypedAssetFileDescriptor, nêu rõ rằng ứng dụng này không hỗ trợ HEVC trong các tính năng đa phương tiện. Chiến dịch này bắt đầu quá trình chuyển mã và sau khi hoàn tất, tệp được tải lên một máy chủ trên đám mây.

Định dạng không được khai báo

Tính năng chuyển mã tệp đa phương tiện tương thích được bật cho mọi định dạng được khai báo không được hỗ trợ và bị tắt đối với tất cả các định dạng được khai báo là được hỗ trợ. Cho các định dạng khác không được khai báo, nền tảng sẽ quyết định xem có chuyển mã hay không hay không. Tính năng chuyển mã của Android 12 bị tắt cho tất cả định dạng chưa được khai báo. Hành vi này có thể thay đổi đối với các định dạng mới trong tương lai.

Tuỳ chọn cho nhà phát triển

Bạn có thể sử dụng các tuỳ chọn cho nhà phát triển sau đây để ghi đè tuỳ chọn mặc định của Android hành vi chuyển mã:

  • Ghi đè chế độ chuyển mã mặc định Chế độ cài đặt này xác định liệu có hay không nền tảng kiểm soát quá trình chuyển mã tự động. Khi ghi đè được bật, các giá trị mặc định của nền tảng sẽ bị bỏ qua và nút bật chuyển mã kiểm soát quá trình chuyển mã tự động. Lựa chọn này đã bị vô hiệu hoá bởi mặc định.

  • Bật tùy chọn chuyển mã Chế độ cài đặt này chỉ định liệu có được khai báo hay không định dạng được chuyển mã tự động. Chế độ này được bật theo mặc định, nhưng chỉ có hiệu lực nếu bạn cũng bật chế độ ghi đè chế độ mặc định chuyển mã.

  • Giả sử các ứng dụng hỗ trợ các định dạng hiện đại Chế độ cài đặt này kiểm soát điều sẽ xảy ra khi ứng dụng sẽ cố gắng phát một định dạng chưa được khai báo. Điều này xảy ra khi tệp kê khai không khai báo về việc ứng dụng có hỗ trợ một định dạng cụ thể hay không, hoặc Google chưa thêm ứng dụng vào danh sách chuyển mã phía máy chủ. Khi chế độ cài đặt được bật thì ứng dụng sẽ không chuyển mã. Khi bị tắt, ứng dụng sẽ chuyển mã. Tuỳ chọn này được bật theo mặc định.

  • Hiển thị thông báo chuyển mã Khi được bật, ứng dụng sẽ hiển thị thông báo tiến trình chuyển mã khi quá trình chuyển mã được kích hoạt bằng cách đọc tệp phương tiện không được hỗ trợ. Tuỳ chọn này được bật theo mặc định.

  • Tắt bộ nhớ đệm chuyển mã Nếu bạn bật tuỳ chọn này, các ứng dụng yêu cầu chuyển mã sẽ không hãy sử dụng bộ nhớ đệm chuyển mã. Điều này có thể hữu ích trong quá trình phát triển để dễ dàng kích hoạt quy trình chuyển mã trên một tệp nội dung nghe nhìn không được hỗ trợ, nhưng có thể khiến thiết bị hoạt động kém hiệu suất. Tuỳ chọn này bị tắt theo mặc định.