HLS

ExoPlayer は、複数のコンテナ形式で HLS をサポートしています。含まれる音声と 動画のサンプル形式もサポートしている必要があります( サンプル形式のセクションをご覧ください)。水 HLS コンテンツ制作者に対し、高品質な HLS ストリームの生成 説明どおり こちらをご覧ください。

機能 サポート対象 コメント
コンテナ
MPEG-TS はい
FMP4/CMAF はい
ADTS(AAC) はい
MP3 はい
字幕
CEA-608 はい
CEA-708 はい
WebVTT はい
メタデータ
ID3 はい
SCTE-35 いいえ
コンテンツの保護
AES-128 はい
サンプル AES-128 いいえ
Widevine はい API 19 以降(「cenc」スキーム)と 25 以降(「cbcs」スキーム)
PlayReady SL2000 はい Android TV のみ
サーバー コントロール
差分更新 はい
再生リストの再読み込みをブロックしています はい
プリロード ヒントのロードのブロック はい 長さが未定義のバイト範囲を除く
ライブ再生
通常のライブ再生 はい
低遅延 HLS(Apple) はい
低レイテンシ HLS(コミュニティ) いいえ
Common Media Client Data(CMCD) はい 統合ガイド

MediaItem の使用

HLS ストリームを再生するには、HLS モジュールに依存する必要があります。

Kotlin

implementation("androidx.media3:media3-exoplayer-hls:1.4.0")

Groovy

implementation "androidx.media3:media3-exoplayer-hls:1.4.0"

次に、HLS 再生リスト URI の MediaItem を作成して、 表示されます。

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(hlsUri));
// Prepare the player.
player.prepare();

URI が .m3u8 で終わっていない場合は、MimeTypes.APPLICATION_M3U8 を渡すことができます。 変数の型を明示的に示す、MediaItem.BuildersetMimeType に 説明します。

メディア アイテムの URI では、メディア再生リストまたはマルチバリエーションを指定できます。 おすすめします。URI が、複数の曲名を宣言するマルチバリエーション再生リストを指している場合 #EXT-X-STREAM-INF タグがある場合、ExoPlayer はタグ間で自動的に適応します。 バリエーションを作成します。

HlsMediaSource の使用

その他のカスタマイズ オプションが必要な場合は、HlsMediaSource を作成してこれを MediaItem ではなくプレーヤーに直接渡すだけです。

Kotlin

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a HLS media source pointing to a playlist uri.
val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource)
// Prepare the player.
player.prepare()

Java

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a HLS media source pointing to a playlist uri.
HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource);
// Prepare the player.
player.prepare();

マニフェストへのアクセス

現在のマニフェストを取得するには、Player.getCurrentManifest を呼び出します。 HLS の場合、返されたオブジェクトを HlsManifest にキャストする必要があります。「 Player.ListeneronTimelineChanged コールバックは、 マニフェストが読み込まれます。これはオンデマンド コンテンツと ライブコンテンツの場合は 何度も繰り返すことになるでしょう次のコード スニペットは、 マニフェストが読み込まれたときになんらかの処理を行うことができます。

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is HlsManifest) {
        // Do something with the manifest.
      }
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          HlsManifest hlsManifest = (HlsManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

再生のカスタマイズ

ExoPlayer は、ユーザーの視聴環境に合わせて再生エクスペリエンスを調整するための複数の方法を提供しています。 提供します。例については、カスタマイズのページをご覧ください。

チャンクレス準備の無効化

デフォルトでは、ExoPlayer はチャンクレス準備を使用します。つまり ExoPlayer は マルチバリエーション再生リストの情報のみを使用して、 ストリーム。#EXT-X-STREAM-INF タグに CODECS が含まれていると機能します。 属性です。

メディア セグメントに多重化されている場合、この機能を無効にしなければならないことがあります マルチバリエーション再生リストで宣言されていないクローズド キャプション トラック #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS タグ。それ以外の字幕トラックは 認識されず、再生されません。チャンクレス準備は Google Cloud コンソールで HlsMediaSource.Factory を次のスニペットのようになります。なお、 ExoPlayer はメディア セグメントをダウンロードする必要があるため、起動時間が長くなります。 新しいトラックが見つかると、 マルチバリエーション再生リストを使用します。

Kotlin

val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory)
    .setAllowChunklessPreparation(false)
    .createMediaSource(MediaItem.fromUri(hlsUri))

Java

HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory)
        .setAllowChunklessPreparation(false)
        .createMediaSource(MediaItem.fromUri(hlsUri));

高品質な HLS コンテンツの作成

ExoPlayer を最大限活用するために、いくつかのガイドラインがあります。 HLS コンテンツを改善できますGoogle Play での HLS 再生に関する Medium の投稿 ExoPlayer をご覧ください。主なポイントは次のとおりです。

  • 正確なセグメントの長さを使用します。
  • 連続的なメディア ストリームを使用する。組織全体でメディア構造の変更を回避し、 分割します
  • #EXT-X-INDEPENDENT-SEGMENTS タグを使用します。
  • 動画と音声の両方を含むファイルではなく、分離ストリームを優先します。
  • マルチバリエーション再生リストにできるだけ多くの情報を含めます。

以下のガイドラインは特にライブ配信に適用されます。

  • #EXT-X-PROGRAM-DATE-TIME タグを使用します。
  • #EXT-X-DISCONTINUITY-SEQUENCE タグを使用します。
  • 有効期間を長くします。1 分以上であれば問題ありません。