変換

フォーマット間のコード変換

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 は自動的に Transmuxing に切り替わります。つまり、圧縮サンプルをそのまま入力コンテナから出力コンテナにコピーします。これにより、同じ形式でのデコードと再エンコードの計算コストや品質低下の可能性を回避できます。

音声や動画を削除する

音声や動画を削除するには、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();

カットの最適化

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

Kotlin

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

Java

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

これにより、動画のデコードと再エンコードをできるだけ少なくして、再エンコードしたデータを元の動画の残りの部分と結合することにより、エクスポートが高速化されます。この最適化は、新しくエンコードされた出力と入力ファイルの一部を合成できることに依存しています。つまり、エンコーダの出力形式と入力形式に互換性がなければなりません。たとえば、ファイルが最初にエンコーダ実装が異なるデバイスで生成されたものである場合、その最適化を適用できない可能性があります。 最適化を成功させるには、EncoderFactory を介して Transformer に提供されるエンコーダのレベルとプロファイルが、入力形式と互換性のある必要があります。

この最適化は、シングル アセットの MP4 入力で、エフェクトがない場合にのみ機能します。ただし、オペレーションの動画エフェクトと、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 でのプレビューでもサポートされています。

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

音声の編集

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