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 các ứng dụng quay video sử dụng phương thức mã hoá hiện đại và tiết kiệm bộ nhớ hơn cho các video được quay 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 chuyển mã tự động cho nội dung được tạo trên thiết bị:
Định dạng nội dung nghe nhìn | Thuộc tính XML | Loại MIME MediaFormat |
---|---|---|
HEVC (H.265) | HEVC | MediaFormat.MIMETYPE_VIDEO_HEVC |
HDR10 | HDR10 | MediaFeature.HdrType.HDR10 |
HDR10+ | HDR10Plus | MediaFeature.HdrType.HDR10_PLUS |
Android giả định rằng các ứng dụng có thể hỗ trợ phát tất cả các định dạng nội dung nghe nhìn, vì vậy, tính năng chuyển mã nội dung nghe nhìn tương thích sẽ tắt theo mặc định.
Trường hợp sử dụng tính năng chuyển mã
Chuyển mã là một thao tác tốn nhiều tài nguyên tính toán và làm tăng đáng kể độ trễ khi mở một tệp video. Ví dụ: một tệp video HEVC có thời lượng 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ã một tệp video khi gửi tệp đó ra khỏi thiết bị. Ví dụ: khi chia sẻ tệp video với những người dùng khác của cùng một ứng dụng hoặc một máy chủ đám mây không hỗ trợ các định dạng video hiện đại.
Không chuyển mã khi mở tệp video để phát trên thiết bị hoặc để tạo hình thu nhỏ.
Định cấu hình tính năng 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 các chức năng đa phương tiện. Có 2 cách để khai báo các chức năng này: trong mã hoặc trong một tài nguyên.
Khai báo các chức năng trong mã
Bạn có thể khai báo các chức năng đa phương tiện trong mã bằng cách tạo một thực thể của đối tượng ApplicationMediaCapabilities
bằ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ư chỉ gọi hoạt động chuyển mã khi chuyển tệp video ra khỏi thiết bị. Phương thức này được ưu tiên hơn phương thức được mô tả bên dưới.
Khai báo các chức năng trong tài nguyên
Việc khai báo các chức năng trong một tài nguyên cho phép kiểm soát toàn bộ quá trình chuyển mã. Bạn chỉ nên sử dụng phương thức này trong một số 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) và tải các tệp đó lên một máy chủ không hỗ trợ các bộ mã hoá và giải mã video hiện đại (xem ví dụ về trường hợp 1 bên dưới).
Việc sử dụng phương thức này khi không thực sự cần thiết có thể kích hoạt quá trình chuyển mã trong các trường hợp không mong muốn, chẳng hạn như khi tạo hình thu nhỏ cho video, dẫn đến trải nghiệm người dùng kém đi.
Để sử dụng phương thức này, hãy tạo một 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 được quay trên thiết bị sẽ được chuyển mã liền mạch sang video SDR (dải động chuẩn) AVC, trong khi video HEVC thì không.
Sử dụng thẻ property
trong thẻ application
để thêm một nội dung tham chiếu đến tệp chức năng đa phương tiện. 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 chức 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ẻ một tệp video với một ứng dụng khác, thì tệp video đó có thể cần đượ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ở một tệp video bằng openTypedAssetFileDescriptor
và chỉ định UID của ứng dụng nhận. Bạn có thể lấy UID này bằng cách sử dụng Binder.getCallingUid
.
Sau đó, nền tảng này sẽ dùng các chức năng đa phương tiện của ứng dụng nhận để xác định xem tệp video có cần đượ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. }
Các trường hợp ví dụ
Các sơ đồ 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 và ứng dụng chia sẻ video không hỗ trợ định dạng HEVC.
Ví dụ 1. Ứng dụng quay video bắt đầu chuyển mã.
Ứng dụng chia sẻ video khai báo rằng ứng dụng này không hỗ trợ HEVC trong tệp tài nguyên tính năng đa phương tiện. Sau đó, ứng dụng này yêu cầu một video từ ứng dụng quay video. Ứng dụng quay video 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 quy 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ẻ. Ứ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 sẽ bắt đầu quá trình chuyển mã.
Ứ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 mở tệp video bằng openTypedAssetFileDescriptor
, cho biết rằng ứng dụng này không hỗ trợ HEVC trong các tính năng đa phương tiện. Thao tác này sẽ bắt đầu quá trình chuyển mã và sau khi hoàn tất, tệp sẽ được tải lên một máy chủ trên đám mây.
Định dạng chưa khai báo
Tính năng chuyển mã phương tiện tương thích được bật cho tất cả các định dạng được khai báo là không được hỗ trợ và bị tắt cho tất cả các định dạng được khai báo là được hỗ trợ. Đối với các định dạng khác không được khai báo, nền tảng sẽ quyết định có chuyển mã hay không. Trong Android 12, quá trình chuyển mã bị tắt cho tất cả các định dạng chưa 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 đè hành vi chuyển mã mặc định của Android:
Ghi đè chế độ chuyển mã mặc định Chế độ cài đặt này xác định xem nền tảng có kiểm soát chế độ chuyển mã tự động hay không. Khi chế độ ghi đè được bật, các chế độ mặc định của nền tảng sẽ bị bỏ qua và chế độ cài đặt enable transcoding sẽ kiểm soát tính năng tự động chuyển mã. Tuỳ chọn này bị tắt theo mặc định.
Bật tính năng chuyển mã Chế độ cài đặt này chỉ định liệu các định dạng chưa khai báo có được tự động chuyển mã hay khô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ế độ cài đặt mặc định về chuyển mã.
Giả định rằng các ứng dụng hỗ trợ định dạng hiện đại Chế độ cài đặt này kiểm soát những gì xảy ra khi ứng dụng cố gắng phát một định dạng chưa khai báo. Điều này xảy ra khi tệp kê khai không khai báo 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 ép chuyển mã phía máy chủ. Khi chế độ cài đặt này được bật, ứng dụng sẽ không chuyển mã. Khi chế độ cài đặt này 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ô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 một tệp nội dung nghe nhìn không được hỗ trợ. Tuỳ chọn này được bật theo mặc định.
Tắt bộ nhớ đệm dùng để chuyển mã Nếu bạn bật chế độ này, những ứng dụng yêu cầu chuyển mã sẽ không sử dụng bộ nhớ đệm dùng để 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 quá trình chuyển mã trên một tệp đa phương tiện không được hỗ trợ, nhưng có thể làm giảm hiệu suất của thiết bị. Theo mặc định, tuỳ chọn này bị tắt.