メディア形式の一般的な概要については、ExoPlayer でサポートされている形式のページをご覧ください。Transformer にも、ストリームの読み込み、抽出、デコードに関する同じ制限が適用されますが、Transformer は ExoPlayer にバンドルされているソフトウェア デコーダ モジュールをサポートしていません。
また、Transformer はエンコードに MediaCodec
を使用します。出力メディア ファイルを多重化(mux)する必要があるため、サポートされる出力形式が制限されます。エンコードの制限事項の詳細については MediaCodec 動画コーデックを、出力メディア コンテナに適用される制限事項については MediaMuxer をご覧ください。Transformer は MP4 ファイルのみを出力します。
デフォルトでは、Transformer
は MediaMuxer
を使用しますが、参照フレーム構造とサポートされているサンプル形式に関する MediaMuxer
の制限の一部を回避するために、開発中の InAppMuxer
を必要に応じて使用できます。デフォルトのマルチプレクサは、今後のリリースでアプリ内マルチプレクサになる予定です。
画像のサポート
Transformer は BitmapFactory
を使用してすべての画像アセットを読み込み、デコードするため、Transformer は BitmapFactory がサポートしているすべての形式をサポートします。サポートされている画像タイプについては、画像のサポートをご覧ください。マルチピクチャ形式(GIF など)の場合、DefaultAssetLoaderFactory
を使用すると、コンテナから 1 つの画像フレームが表示されます。
特殊な形式
Transformer は、従来の形式と比較して特別な機能を備えた新しいメディア形式での入力処理をサポートしています。
HDR 動画の処理
HDR 動画キャプチャをサポートするデバイスがますます増え、より鮮やかで正確な色と明るさの範囲が広がります。
Transformer は、必要なエンコードをサポートするデバイスで、Android 13(API レベル 33)以降の HDR 動画の編集をサポートしています。HDR 動画を編集する場合、GL 動画エフェクトは 16 ビット浮動小数点色コンポーネントと BT.2020 色空間を処理する必要があります。HDR_MODE_KEEP_HDR
は、Composition
をビルドする際のデフォルト モードです。HDR 編集がサポートされていない場合、Transformer はフォールバックして HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL
を使用します。
HDR から SDR への変換(トーン マッピングとも呼ばれます)は、必要なデコードと OpenGL をサポートするデバイスで Android 10(API レベル 29)以降でサポートされています。これは、HDR コンテンツの取り込みをサポートしていない他のアプリやサービスと HDR メディアを共有する場合に便利です。OpenGL を使用してトーン マッピングを有効にするには、Composition
の作成時に setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_OPEN_GL)
を呼び出します。Android 12(API レベル 31)以降、MediaCodec
は一部のデバイス(Android 13 以降を搭載し、HDR 動画をキャプチャできるすべてのデバイスを含む)でトーン マッピングもサポートしています。MediaCodec
を使用してトーン マッピングを有効にするには、setHdrMode(HDR_MODE_TONE_MAP_HDR_TO_SDR_USING_MEDIACODEC)
を呼び出します。
スローモーション メディアの処理
スローモーション動画には、ストリームの各セクションの再生速度を示すメタデータが含まれます。フラット化は、スローモーション動画に基づいて新しい動画ストリームを生成するプロセスで、スローモーション メタデータを適用していないプレーヤーでも正しく再生されるように、メタデータに基づいてセクションの速度を調整します。
スローモーション ストリームをフラット化するには、EditedMediaItem
で setFlattenForSlowMotion
ビルダー メソッドを使用します。
Kotlin
val editedMediaItem = EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build() val transformer = Transformer.Builder(context).addListener(transformerListener).build() transformer.start(editedMediaItem, outputPath)
Java
EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(inputMediaItem).setFlattenForSlowMotion(true).build(); Transformer transformer = new Transformer.Builder(context).addListener(transformerListener).build(); transformer.start(editedMediaItem, outputPath);
これにより、こうした特殊な形式の処理を気にすることなく、スローモーション動画に対応できます。必要な作業は、元の動画ではなくフラット化された動画を保存して再生することだけです。