フォーマット間のコード変換
音声と動画の出力形式を指定できます。 Transformer です。たとえば、次のコードは、 H.264/AVC 動画と AAC 音声を出力するように Transformer を設定するには:
Transformer.Builder(context)
.setVideoMimeType(MimeTypes.VIDEO_H264)
.setAudioMimeType(MimeTypes.AUDIO_AAC)
.build()
new Transformer.Builder(context)
.setVideoMimeType(MimeTypes.VIDEO_H264)
.setAudioMimeType(MimeTypes.AUDIO_AAC)
.build();
入力メディア形式が音声の設定とすでに一致している場合 Transformer は、Transmuxing(変換、 圧縮されたサンプルが入力コンテナから出力コンテナに あります。これにより、モデルの計算コストや品質の低下を 再エンコードを行います。
音声や動画を削除する
音声や動画を削除するには、EditedMediaItem.Builder
を使用します。次に例を示します。
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
クリップをカットする
以下の設定により、指定した開始タイムスタンプと終了タイムスタンプ以外にあるメディアを削除できます。 入力メディア アイテムのクリッピング構成。たとえば、予測値を生成するには、 10 ~ 20 秒のメディアのみを含むクリップ:
val inputMediaItem = MediaItem.Builder()
.setUri(uri)
.setClippingConfiguration(
ClippingConfiguration.Builder()
.setStartPositionMs(10_000)
.setEndPositionMs(20_000)
.build())
.build()
MediaItem inputMediaItem =
new MediaItem.Builder()
.setUri(uri)
.setClippingConfiguration(
new MediaItem.ClippingConfiguration.Builder()
.setStartPositionMs(10_000)
.setEndPositionMs(20_000)
.build())
.build();
カットの最適化
動画の先頭をカットする際の遅延を短縮するには、カット機能を有効にします 役立ちます
Transformer.Builder(context)
.experimentalSetTrimOptimizationEnabled(true)
.build()
new Transformer.Builder(context)
.experimentalSetTrimOptimizationEnabled(true)
.build();
これにより、動画のデコードと再エンコードが最小限に抑えられ、エクスポートが速くなります。
次に、再エンコードされたデータを元のデータの残りの部分と
動画をご覧ください。入力ファイルの一部を合成できることによって最適化が行われる
出力が新しくエンコードされた出力となります。つまり、エンコーダの出力形式と
入力形式に互換性がなければなりません。たとえば、ファイルが最初に
エンコーダの実装が異なるデバイスで生成された場合、
最適化を適用できないことを示します
最適化を成功させるために、エンコーダは
EncoderFactory
には、入力形式と互換性のあるレベルとプロファイルが必要です。
この最適化はシングル アセットの MP4 入力でのみ機能します。ただし、
90 度で割り切れないオペレーションの動画エフェクトと回転がありません。最適化が
失敗した場合、Transformer は自動的に通常のエクスポートにフォールバックし、
ExportResult.OptimizationResult
での最適化の結果。
この機能は現在検証中であり、試験運用版ではなくなると予想されます 使用できます。
動画の編集
EditedMediaItems
には、適用できるオーディオ プロセッサと動画エフェクトのリストがあります
できます。このライブラリには、一般的なユースケース向けの動画エフェクトの実装が含まれています。
カスタム効果を作成して、編集したメディアの作成時に渡すこともできます。
あります。
メディアを再スケーリングできます。これは、処理リソースを節約したり、 4K や 8K 動画のような非常に高解像度の入力を扱う場合、帯域幅が大きくなる可能性があります。 たとえば、高さ 480 ピクセルに比例してスケーリングするには、次のようにします。
EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(Effects(
/* audioProcessors= */ listOf(),
/* videoEffects= */ listOf(Presentation.createForHeight(480))
)).build()
new EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(new Effects(
/* audioProcessors= */ ImmutableList.of(),
/* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480))))
.build();
または、特定の係数でスケーリングすることもできます。たとえば、サイズを半分にできます。
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(Effects(
/* audioProcessors= */ listOf(),
/* videoEffects= */ listOf(
ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())
)).build()
new EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(new Effects(
/* audioProcessors= */ ImmutableList.of(),
/* videoEffects= */ ImmutableList.of(
new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build())))
.build();
ローテーションも同じ方法で構成できます。
EditedMediaItem.Builder(MediaItem.fromUri(uri))
.setEffects(Effects(
/* audioProcessors= */ listOf(),
/* videoEffects= */ listOf(
ScaleAndRotateTransformation.Builder()
.setRotationDegrees(90f)
.build())
)).build()
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 でのプレビューでも、動画エフェクトがサポートされています。
ExoPlayer.setVideoEffects
。
デモアプリには、カスタム動画エフェクトの例が含まれています。
音声の編集
オーディオ エフェクトは、AudioProcessor
のシーケンスを適用することで実装します。
未加工(PCM)オーディオに変換しています。ExoPlayer は、オーディオ プロセッサの
DefaultAudioSink.Builder
: 音声編集をプレビューできます。