在 Android 12 (API 級別 31) 以上版本中,系統可以自動轉換 影片期間以 HEVC (H.265) 到 AVC (H.264) 等格式錄製 是由不支援 HEVC 的應用程式開啟。這項功能 擷取應用程式,使用更現代化且節省儲存空間的影片編碼方式 未犧牲與其他應用程式的相容性
系統可為 在裝置上建立:
媒體格式 | XML 屬性 | MediaFormat MIME 類型 |
---|---|---|
HEVC (H.265) | HEVC | MediaFormat.MIMETYPE_VIDEO_HEVC |
HDR10 | HDR10 | MediaFeature.HdrType.HDR10 |
HDR10+ | HDR10+ | MediaFeature.HdrType.HDR10_PLUS |
Android 會假設應用程式可以播放所有媒體格式, 相容的媒體轉碼功能預設為關閉。
使用轉碼的時機
轉碼作業需要進行大量運算 開啟影片檔案的過程。例如 1 分鐘的 HEVC 影片檔案 大約需要 20 秒才能轉碼為 Pixel 3 手機上的 AVC因此 只有在將影片檔案與 裝置。例如,與其他人共用影片檔案時 或不支援現代影片的雲端伺服器 格式。
開啟影片檔案 (用於裝置端播放或建立縮圖圖片) 時,不要進行轉碼。
正在設定轉碼
應用程式可以透過宣告媒體來控制轉碼行為 即便沒有技術背景,也能因這些工具的功能而受益宣告這些功能的方式有兩種:在程式碼中、 或是在資源中
在程式碼中宣告功能
您可以在程式碼中建構媒體功能的執行個體,方法是建立
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 (標準動態範圍) 影片,HEVC 影片則沒有。
在 application
標記中使用 property
標記,新增媒體參照
檔案。請在 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. }
情境示例
下圖說明兩種常見用途。這兩種情況下,原始影片都會以 HEVC 格式儲存,影片分享應用程式則沒有 支援 HEVC。
範例 1:影片擷取應用程式會啟動轉碼作業。
影片分享應用程式宣告其媒體不支援 HEVC
功能資源檔案接著要求影片擷取應用程式播放影片。影片擷取畫面
應用程式會處理要求,並使用
openTypedAssetFileDescriptor
指定分享應用程式的 UID 來開啟檔案。這個選項會啟動轉碼程序。
收到轉碼影片後,系統會將影片提供給共用應用程式,應用程式便會將影片上傳到雲端的伺服器。
範例 2:轉碼程序是由影片分享應用程式啟動。
影片擷取應用程式使用
MediaStore
URI。影片分享應用程式會使用 openTypedAssetFileDescriptor
開啟影片檔案,指出其媒體功能不支援 HEVC。這個
會啟動轉碼程序,完成後,檔案會上傳到
部署一個伺服器
未宣告的格式
所有宣告的格式皆已啟用相容媒體轉碼功能 ,系統會為所有宣告支援的格式停用此功能。適用對象 平台會決定是否對其他未宣告的格式進行轉碼 不一定。在 Android 12 中,轉碼功能已停用 適用於所有未宣告的格式對新的廣告格式來說,這個行為可能會改變
開發人員選項
您可以使用下列開發人員選項覆寫 Android 的預設值 轉碼行為:
覆寫轉碼預設值:這項設定可決定 也交由平台控管自動轉碼覆寫時 啟用後,系統會忽略平台預設值,並啟用 轉碼設定控制自動轉碼。這個選項 預設值。
啟用轉碼功能:這項設定可指定是否未宣告 就會自動轉碼此設定預設為啟用,但僅限 如果同時啟用覆寫轉碼預設值,則會生效。
假設應用程式支援新格式:這項設定可控管 應用程式會嘗試播放未宣告的格式。如果資訊清單 未宣告應用程式是否支援特定格式,或 尚未將應用程式加入伺服器端的強制轉碼清單。設定之後 啟用時,應用程式不會轉碼;停用後,應用程式就不會進行轉碼 轉碼。這個選項預設為啟用。
顯示轉碼通知 啟用後,應用程式會顯示 轉碼進度通知 不支援的媒體檔案。這個選項預設為啟用。
停用轉碼快取:如果啟用,需要轉碼的應用程式就不會執行。 使用轉碼快取這在開發階段時 觸發轉碼作業在不支援的媒體檔案上,但可能導致裝置效能不佳 才需進行這個選項預設為停用。