スタート ガイド

簡単なユースケースで 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.11.1")
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
implementation("androidx.media3:media3-ui:1.11.1")
implementation("androidx.media3:media3-ui-compose-material3:1.11.1")

Groovy

implementation "androidx.media3:media3-exoplayer:1.11.1"
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
implementation "androidx.media3:media3-ui:1.11.1"
implementation("androidx.media3:media3-ui-compose-material3:1.11.1")

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

AndroidX Media3 には、追加機能を提供するために外部ライブラリに依存するライブラリ モジュールがあります。一部は Maven リポジトリから入手できますが、手動でビルドする必要があるものもあります。ライブラリ ディレクトリを参照し、個々の README で詳細を確認します。

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

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

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

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

プレーヤーを作成する

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

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 が使用されます。いずれの場合も、プレーヤーにアクセスする必要があるスレッドの Looper は Player.getApplicationLooper を使用してクエリできます。

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

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

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

Kotlin

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

Java

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

Media3 のビルド済み UI コンポーネントの使用は任意です。独自の UI を実装する動画アプリの場合、ターゲットの SurfaceView、TextureView、SurfaceHolder、または Surface は、それぞれプレーヤーの setVideoSurfaceView、setVideoTextureView、setVideoSurfaceHolder、setVideoSurface メソッドを使用して設定できます。Listener.onCues コールバックを使用して、再生中にレンダリングされるべきキャプションを受信できます。また、setImageOutput を使用して、デコードされた画像を受信できます。

ユーザー エクスペリエンスを向上させるには、keepScreenOn 属性を追加することを検討してください。バックグラウンド作業ページで、デバイスを起動状態に保つ他のアクションを調べることができます。

android:keepScreenOn="true"

アプリの UI に Jetpack Compose を使用している場合は、media3-ui-compose-material3 ライブラリの Player コンポーザブルを使用できます。Player には動画が表示され、再生コントロール スロットの事前入力された値が含まれます。androidx.media3.common.Player オブジェクトを androidx.media3.ui.compose.material3.Player コンポーザブルにアタッチするには、引数として渡します。

// Bind the player to the composable.
Player(player = player)

Media3 UI コンポーネントの使用とカスタマイズについて詳しくは、UI ページをご覧ください。

プレイリストの入力とプレーヤーの準備

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();

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

プレーヤーを操作する

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

  • play と pause は再生の開始と一時停止を行います。
  • seekTo を使用すると、メディア内でシークできます。
  • hasPrevious、hasNext、previous、next を使用して、プレイリストを移動できます。
  • setRepeatMode は、メディアをループするかどうか、またループする方法を制御します。
  • setShuffleModeEnabled はプレイリストのシャッフルを制御します。
  • setPlaybackParameters は、再生速度と音声のピッチを調整します。

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

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

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