はじめに

簡単なユースケースの場合、ExoPlayer の使用を開始するには、次の手順を実装します。

  1. 依存関係として ExoPlayer をプロジェクトに追加します。
  2. ExoPlayer インスタンスを作成します。
  3. プレーヤーをビューにアタッチします(動画出力とユーザー入力用)。
  4. プレーヤーがプレイできるように MediaItem を準備します。
  5. 完了したらプレーヤーを離します。

以下では、これらの手順について詳しく説明します。詳細な例については、メインのデモアプリPlayerActivity をご覧ください。

ExoPlayer を依存関係として追加する

ExoPlayer モジュールを追加する

AndroidX Media3 の使用を開始する最も簡単な方法は、アプリ モジュールの build.gradle ファイルに必要なライブラリに Gradle 依存関係を追加することです。

たとえば、DASH 再生と UI コンポーネントをサポートする ExoPlayer に依存するには、次のようにモジュールの依存関係を追加します。

Kotlin

implementation("androidx.media3:media3-exoplayer:1.4.1")
implementation("androidx.media3:media3-exoplayer-dash:1.4.1")
implementation("androidx.media3:media3-ui:1.4.1")

Groovy

implementation "androidx.media3:media3-exoplayer:1.4.1"
implementation "androidx.media3:media3-exoplayer-dash:1.4.1"
implementation "androidx.media3:media3-ui:1.4.1"

ここで、1.4.1 は任意のバージョンです(最新バージョンはリリースノートで確認できます)。すべてのモジュールが同じバージョンである必要があります。

AndroidX Media3 には、追加機能を提供するために外部ライブラリに依存するライブラリ モジュールがあります。Maven リポジトリから利用できるものもあれば、手動でビルドする必要があるものもあります。詳しくは、libraries ディレクトリを参照し、個々の README をご覧ください。

利用可能なライブラリ モジュールの詳細については、Google Maven AndroidX Media のページをご覧ください。

Java 8 のサポートを有効にする

まだ有効になっていない場合は、ExoPlayer に依存するすべての build.gradle ファイルで Java 8 サポートを有効にする必要があります。そのためには、android セクションに次の行を追加します。

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Multidex を有効にする

Gradle の minSdkVersion が 20 以下の場合、ビルドエラーを防ぐために multidex を有効にする必要があります。

プレーヤーを作成する

ExoPlayer インスタンスは ExoPlayer.Builder を使用して作成できます。ExoPlayer.Builder にはさまざまなカスタマイズ オプションが用意されています。次のコードは、インスタンスの作成の最も簡単な例です。

Kotlin

val player = ExoPlayer.Builder(context).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();

スレッド化に関する注意事項

ExoPlayer インスタンスには、単一のアプリスレッドからアクセスする必要があります。ほとんどの場合、これはアプリのメインスレッドである必要があります。ExoPlayer の UI コンポーネントまたは IMA 拡張機能を使用する場合は、アプリのメインスレッドを使用する必要があります。

ExoPlayer インスタンスにアクセスする必要があるスレッドは、プレーヤーの作成時に Looper を渡すことで明示的に指定できます。Looper が指定されていない場合、プレーヤーが作成されたスレッドの Looper が使用されます。そのスレッドに Looper がない場合、アプリのメインスレッドの Looper が使用されます。いずれの場合も、プレーヤーにアクセスする必要があるスレッドの LooperPlayer.getApplicationLooper を使用してクエリできます。

ExoPlayer のスレッドモデルの詳細については、ExoPlayer Javadoc の「スレッドモデル」のセクションをご覧ください。

プレーヤーをビューにアタッチする

ExoPlayer ライブラリには、メディア再生用のさまざまな事前構築済み UI コンポーネントが用意されています。たとえば、PlayerView は、動画がレンダリングされる PlayerControlViewSubtitleViewSurface をカプセル化します。PlayerView はアプリのレイアウト xml に含めることができます。たとえば、プレーヤーをビューにバインドするには、次のようにします。

Kotlin

// Bind the player to the view.
playerView.player = player

Java

// Bind the player to the view.
playerView.setPlayer(player);

PlayerControlView をスタンドアロン コンポーネントとして使用することもできます。これはオーディオのみのユースケースに役立ちます。

ExoPlayer の事前構築済み UI コンポーネントの使用は任意です。独自の UI を実装する動画アプリの場合、ExoPlayer の setVideoSurfaceViewsetVideoTextureViewsetVideoSurfaceHoldersetVideoSurface メソッドを使用して、ターゲット SurfaceViewTextureViewSurfaceHolderSurface をそれぞれ設定できます。ExoPlayer の addTextOutput メソッドを使用して、再生中にレンダリングする字幕を受け取ることができます。

プレイリストにコンテンツを追加してプレーヤーを準備する

ExoPlayer では、すべてのメディアが MediaItem で表現されます。メディアを再生するには、対応する MediaItem をビルドし、プレーヤーに追加してプレーヤーを準備し、play を呼び出して再生を開始する必要があります。

Kotlin

// Build the media item.
val mediaItem = MediaItem.fromUri(videoUri)
// Set the media item to be played.
player.setMediaItem(mediaItem)
// Prepare the player.
player.prepare()
// Start the playback.
player.play()

Java

// Build the media item.
MediaItem mediaItem = MediaItem.fromUri(videoUri);
// Set the media item to be played.
player.setMediaItem(mediaItem);
// Prepare the player.
player.prepare();
// Start the playback.
player.play();

ExoPlayer はプレイリストを直接サポートしているため、複数のメディア アイテムを順番に再生するプレーヤーを準備できます。

Kotlin

// Build the media items.
val firstItem = MediaItem.fromUri(firstVideoUri)
val secondItem = MediaItem.fromUri(secondVideoUri)
// Add the media items to be played.
player.addMediaItem(firstItem)
player.addMediaItem(secondItem)
// Prepare the player.
player.prepare()
// Start the playback.
player.play()

Java

// Build the media items.
MediaItem firstItem = MediaItem.fromUri(firstVideoUri);
MediaItem secondItem = MediaItem.fromUri(secondVideoUri);
// Add the media items to be played.
player.addMediaItem(firstItem);
player.addMediaItem(secondItem);
// Prepare the player.
player.prepare();
// Start the playback.
player.play();

再生中に再生リストを更新できるため、プレーヤーを再度準備する必要はありません。再生リストの追加と操作について詳しくは、再生リストのページをご覧ください。メディア アイテムの作成時に利用できるさまざまなオプション(クリップや字幕ファイルの添付など)について詳しくは、メディア アイテムのページをご覧ください。

プレーヤーを操作する

プレーヤーの準備が整ったら、プレーヤーのメソッドを呼び出して再生を制御できます。よく使用される方法は次のとおりです。

  • playpause は、再生を開始または一時停止します。
  • seekTo を使用すると、メディア内のシークが可能になります。
  • hasPrevioushasNextpreviousnext を使用すると、再生リスト内を移動できます。
  • setRepeatMode は、メディアをループするかどうかとその方法を制御します。
  • setShuffleModeEnabled はプレイリストのシャッフルを制御します。
  • setPlaybackParameters: 再生速度と音声のピッチを調整します。

プレーヤーが PlayerView または PlayerControlView にバインドされている場合、これらのコンポーネントに対するユーザー操作によって、プレーヤーの対応するメソッドが呼び出されます。

プレーヤーをリリースする

動画デコーダなどの限られたリソースを他のアプリで使用できるように、不要になったらプレーヤーを解放することが重要です。これを行うには、ExoPlayer.release を呼び出します。