変換

形式間でトランスコードする

Transformer のビルド時に、生成する出力音声と動画の形式を指定できます。たとえば、次のコードは、H.264/AVC 動画と AAC 音声を出力するように Transformer を構成する方法を示しています。

Kotlin

Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H264)
    .setAudioMimeType(MimeTypes.AUDIO_AAC)
    .build()

Java

new Transformer.Builder(context)
    .setVideoMimeType(MimeTypes.VIDEO_H264)
    .setAudioMimeType(MimeTypes.AUDIO_AAC)
    .build();

入力メディア形式が音声または動画の設定と一致する場合、Transformer は自動的に トランスムックスに切り替わります。つまり、圧縮されたサンプルを入力コンテナから出力コンテナに修正なしでコピーします。これにより、同じ形式でのデコードと再エンコードの計算コストと品質の低下を回避できます。

音声や動画を削除する

EditedMediaItem.Builder を使用して音声または動画を削除します。例:

Kotlin

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

Java

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();

クリップをトリミングする

入力メディア アイテムにクリッピング構成を設定することで、指定した開始タイムスタンプと終了タイムスタンプの範囲外のメディアを削除できます。たとえば、10 秒から 20 秒の間のメディアのみを含むクリップを生成するには:

Kotlin

val inputMediaItem = MediaItem.Builder()
    .setUri(uri)
    .setClippingConfiguration(
        ClippingConfiguration.Builder()
            .setStartPositionMs(10_000)
            .setEndPositionMs(20_000)
            .build())
    .build()

Java

MediaItem inputMediaItem =
    new MediaItem.Builder()
        .setUri(uri)
        .setClippingConfiguration(
            new MediaItem.ClippingConfiguration.Builder()
                .setStartPositionMs(10_000)
                .setEndPositionMs(20_000)
                .build())
        .build();

MP4 編集リスト

トリミングを高速化するため、Transformer は MP4 編集リストをサポートしています。これにより、動画全体を再トランスコードすることなく、より効率的な「トリミングのみ」の編集が可能になります。この方法では、既存のエンコード済みサンプルと編集リスト内の「プリロール」を利用します。これにより、プレーヤーに特定の時点から再生を開始するよう指示し、不要な最初のセグメントを効果的にスキップします。

トリミングのみの編集を大幅に高速化するには、experimentalSetMp4EditListTrimEnabled(true) を呼び出します。

Kotlin

Transformer.Builder(context)
    .experimentalSetMp4EditListTrimEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetMp4EditListTrimEnabled(true)
    .build();

すべてのメディア プレーヤーが「プリロール」のポジションをサポートしているわけではないことに注意してください。つまり、このようなプレーヤーを使用すると、エンコードされたサンプルの絶対的な最初から再生が開始されます。編集リスト情報で別の開始点が指定されている場合でも同様です。

トリムを最適化する

動画の先頭をトリミングする際のレイテンシを短縮するには、トリミングの最適化を有効にします。

Kotlin

Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build();

これにより、動画のデコードと再エンコードを可能な限り少なくして、再エンコードされたデータを元の動画の残りの部分とつなぎ合わせることで、書き出しが高速化されます。この最適化は、入力ファイルの一部を新しくエンコードされた出力とつなぎ合わせることで実現されます。つまり、エンコーダの出力形式と入力形式に互換性がある必要があります。たとえば、ファイルが元々異なるエンコーダ実装のデバイスで作成された場合、最適化を適用できない可能性があります。最適化を成功させるには、EncoderFactory 経由で Transformer に提供されるエンコーダのレベルとプロファイルが入力形式と互換性を持っている必要があります。

この最適化は、効果のない単一アセットの MP4 入力(no op 動画効果と 90 度で割り切れる回転を除く)でのみ機能します。最適化が失敗すると、Transformer は自動的に通常のエクスポートにフォールバックし、ExportResult.OptimizationResult で最適化の結果を報告します。

この機能の検証を行っており、今後のリリースでテスト版ではなくなる予定です。

動画の編集

EditedMediaItems には、順番に適用するオーディオ プロセッサと動画エフェクトのリストがあります。ライブラリには、一般的なユースケース向けの動画エフェクトの実装が含まれています。また、カスタム エフェクトを作成して、編集されたメディア アイテムのビルド時に渡すこともできます。

メディアをリスケールできます。これは、4K や 8K 動画などの非常に高解像度の入力に対処する際に、処理リソースや帯域幅を節約するのに役立ちます。たとえば、高さを 480 ピクセルに比例してスケーリングするには:

Kotlin

EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(Effects(
        /* audioProcessors= */ listOf(),
        /* videoEffects= */ listOf(Presentation.createForHeight(480))
    )).build()

Java

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(new Effects(
        /* audioProcessors= */ ImmutableList.of(),
        /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480))))
    .build();

また、指定した係数でスケーリングすることもできます(サイズを半分にするなど)。

Kotlin

val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(Effects(
        /* audioProcessors= */ listOf(),
        /* videoEffects= */ listOf(
            ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())
    )).build()

Java

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(new Effects(
        /* audioProcessors= */ ImmutableList.of(),
        /* videoEffects= */ ImmutableList.of(
            new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())))
    .build();

回転も同じ方法で構成できます。

Kotlin

EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(Effects(
        /* audioProcessors= */ listOf(),
        /* videoEffects= */ listOf(
            ScaleAndRotateTransformation.Builder()
                .setRotationDegrees(90f)
                .build())
    )).build()

Java

new EditedMediaItem.Builder(MediaItem.fromUri(uri))
    .setEffects(new Effects(
        /* audioProcessors= */ ImmutableList.of(),
        /* videoEffects= */ ImmutableList.of(
            new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build())))
    .build();

カスタム動画エフェクト

Effects コンストラクタは、適用する音声効果と動画効果のリストを受け取ります。内部的には、Transformer のエフェクト フレームワークは、動画エフェクトのリストを順番に適用される GL シェーダー プログラムのシーケンスに変換します。場合によっては、エフェクト フレームワークは 1 つのシェーダー プログラムで複数のエフェクトを適用できます。たとえば、1 つのシェーダー プログラムで複数の連続した行列変換を適用できるため、効率と品質が向上します。

ExoPlayer.setVideoEffects を使用して、ExoPlayer のプレビューで動画エフェクトもサポートされています。この API の使用例については、エフェクト デモアプリをご覧ください。

デモアプリには、カスタム動画エフェクトの例が含まれています。

音声編集

オーディオ エフェクトは、一連の AudioProcessor インスタンスを未加工(PCM)オーディオに適用することで実装されます。ExoPlayer は、DefaultAudioSink.Builder へのオーディオ プロセッサの受け渡しをサポートしており、オーディオ編集のプレビューが可能です。