Android 12 デベロッパー プレビューへようこそ。早い段階から頻繁にフィードバックをお送りいただき、Android 12 をさらに優れたリリースにするためにご協力ください。

互換性のあるメディアのコード変換

[フィードバックを送信] アイコン 互換性のあるメディアのコード変換についてフィードバックをお寄せください。簡単なアンケートにご協力いただき、ご意見をお聞かせください。特に、この変更がアプリに影響するユースケースをお知らせください。

Android 12 では、他のアプリとの互換性を犠牲にすることなく、デバイス上で記録した動画に対してストレージ効率の良い最新のエンコードを利用できる、動画撮影アプリ用の新機能が導入されました。

HEVC をサポートしていないアプリで動画を開いたとき、Android は HEVC(H.265)などの形式で記録された動画を自動的に AVC(H.264)に変換できます。

デバイス上で作成されたコンテンツについて、以下の形式を自動的にコード変換できます。

メディア形式 XML 属性 MediaFormat MIME タイプ
HEVC(H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

Android では、アプリはすべてのメディア形式の再生に対応できると想定されているため、互換性のあるメディアのコード変換はデフォルトではオフになっています。より互換性の高い形式にメディアをコード変換することをリクエストするアプリは、メディア機能を宣言する必要があります。この機能を宣言するには、リソース内で宣言する方法と、コード内でインラインで宣言する方法があります。

リソース内で機能を宣言する

まず、次に示すように 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" />

コード内で機能を宣言する

コード内でメディア機能を宣言するには、次に示すように、ビルダーを使用して 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.
}

このメソッドは、アプリの AndroidManifest.xml でリンクされている機能よりも優先されます。これにより、A/B テストの実行など、特定のコードパスをよりきめ細かく制御できます。