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.Builder
の setMimeType
に
説明します。
メディア アイテムの 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.Listener
の onTimelineChanged
コールバックは、
マニフェストが読み込まれます。これはオンデマンド コンテンツと
ライブコンテンツの場合は
何度も繰り返すことになるでしょう次のコード スニペットは、
マニフェストが読み込まれたときになんらかの処理を行うことができます。
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 分以上であれば問題ありません。