スムーズなストリーミング
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
ExoPlayer は FMP4 コンテナ形式の SmoothStreaming をサポートしています。メディア ストリームはデマルチプレックス化する必要があります。つまり、動画、音声、テキストは SmoothStreaming マニフェストの個別の StreamIndex 要素で定義する必要があります。含まれる音声と動画のサンプル フォーマットもサポートされている必要があります(詳しくは、サンプル フォーマットのセクションをご覧ください)。
機能 |
サポート対象 |
コメント |
コンテナ |
|
|
FMP4 |
○ |
デマルチプレックスされたストリームのみ |
字幕 |
|
|
TTML |
○ |
FMP4 に埋め込まれている |
コンテンツの保護 |
|
|
PlayReady SL2000 |
○ |
Android TV のみ |
ライブ再生 |
|
|
通常のライブ再生 |
○ |
|
共通メディア クライアント データ(CMCD) |
○ |
統合ガイド |
SmoothStreaming ストリームを再生するには、SmoothStreaming モジュールに依存する必要があります。
Kotlin
implementation("androidx.media3:media3-exoplayer-smoothstreaming:1.8.0")
Groovy
implementation "androidx.media3:media3-exoplayer-smoothstreaming:1.8.0"
次に、SmoothStreaming マニフェスト URI の MediaItem
を作成して、プレーヤーに渡します。
Kotlin
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(ssUri))
// 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(ssUri));
// Prepare the player.
player.prepare();
URI が .ism/Manifest
で終わっていない場合は、MediaItem.Builder
の setMimeType
に MimeTypes.APPLICATION_SS
を渡して、コンテンツのタイプを明示的に示すことができます。
ExoPlayer は、利用可能な帯域幅とデバイスの性能の両方を考慮して、マニフェストで定義された表現を自動的に調整します。
カスタマイズ オプションをさらに追加するには、MediaItem
の代わりに SsMediaSource
を作成してプレーヤーに直接渡します。
Kotlin
// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a SmoothStreaming media source pointing to a manifest uri.
val mediaSource: MediaSource =
SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()
Java
// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a SmoothStreaming media source pointing to a manifest uri.
MediaSource mediaSource =
new SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();
マニフェストへのアクセス
現在のマニフェストを取得するには、Player.getCurrentManifest
を呼び出します。SmoothStreaming の場合は、返されたオブジェクトを SsManifest
にキャストする必要があります。また、マニフェストが読み込まれるたびに、Player.Listener
の onTimelineChanged
コールバックも呼び出されます。オンデマンド コンテンツの場合は 1 回、ライブ コンテンツの場合は複数回発生する可能性があります。次のコード スニペットは、マニフェストが読み込まれるたびにアプリが何らかの処理を行う方法を示しています。
Kotlin
player.addListener(
object : Player.Listener {
override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
val manifest = player.currentManifest
if (manifest is SsManifest) {
// 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) {
SsManifest ssManifest = (SsManifest) manifest;
// Do something with the manifest.
}
}
});
再生をカスタマイズする
ExoPlayer には、アプリのニーズに合わせて再生エクスペリエンスを調整するための複数の方法が用意されています。例については、カスタマイズ ページをご覧ください。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-08-27 UTC。
[null,null,["最終更新日 2025-08-27 UTC。"],[],[],null,["# SmoothStreaming\n\nExoPlayer supports SmoothStreaming with the FMP4 container format. Media streams\nmust be demuxed, meaning that video, audio, and text must be defined in distinct\nStreamIndex elements in the SmoothStreaming manifest. The contained audio and\nvideo sample formats must also be supported (see the\n[sample formats](/media/media3/exoplayer/supported-formats#sample-formats) section for details).\n\n| Feature | Supported | Comments |\n|-------------------------------------|-----------|---------------------------------------------------------|\n| **Containers** | | |\n| FMP4 | YES | Demuxed streams only |\n| **Closed captions/subtitles** | | |\n| TTML | YES | Embedded in FMP4 |\n| **Content protection** | | |\n| PlayReady SL2000 | YES | Android TV only |\n| **Live playback** | | |\n| Regular live playback | YES | |\n| **Common Media Client Data (CMCD)** | YES | [Integration Guide](/guide/topics/media/exoplayer/cmcd) |\n\nUsing MediaItem\n---------------\n\nTo play a SmoothStreaming stream, you need to depend on the SmoothStreaming\nmodule. \n\n### Kotlin\n\n```kotlin\nimplementation(\"androidx.media3:media3-exoplayer-smoothstreaming:1.8.0\")\n```\n\n### Groovy\n\n```groovy\nimplementation \"androidx.media3:media3-exoplayer-smoothstreaming:1.8.0\"\n```\n\nYou can then create a `MediaItem` for a SmoothStreaming manifest URI and pass it\nto the player. \n\n### Kotlin\n\n```kotlin\n// Create a player instance.\nval player = ExoPlayer.Builder(context).build()\n// Set the media item to be played.\nplayer.setMediaItem(MediaItem.fromUri(ssUri))\n// Prepare the player.\nplayer.prepare()\n```\n\n### Java\n\n```java\n// Create a player instance.\nExoPlayer player = new ExoPlayer.Builder(context).build();\n// Set the media item to be played.\nplayer.setMediaItem(MediaItem.fromUri(ssUri));\n// Prepare the player.\nplayer.prepare();\n```\n\n\u003cbr /\u003e\n\nIf your URI doesn't end with `.ism/Manifest`, you can pass\n`MimeTypes.APPLICATION_SS` to `setMimeType` of `MediaItem.Builder` to explicitly\nindicate the type of the content.\n\nExoPlayer will automatically adapt between representations defined in the\nmanifest, taking into account both available bandwidth and device capabilities.\n\nUsing SsMediaSource\n-------------------\n\nFor more customization options, you can create a `SsMediaSource` and pass it\ndirectly to the player instead of a `MediaItem`. \n\n### Kotlin\n\n```kotlin\n// Create a data source factory.\nval dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()\n// Create a SmoothStreaming media source pointing to a manifest uri.\nval mediaSource: MediaSource =\n SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri))\n// Create a player instance.\nval player = ExoPlayer.Builder(context).build()\n// Set the media source to be played.\nplayer.setMediaSource(mediaSource)\n// Prepare the player.\nplayer.prepare()\n```\n\n### Java\n\n```java\n// Create a data source factory.\nDataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();\n// Create a SmoothStreaming media source pointing to a manifest uri.\nMediaSource mediaSource =\n new SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri));\n// Create a player instance.\nExoPlayer player = new ExoPlayer.Builder(context).build();\n// Set the media source to be played.\nplayer.setMediaSource(mediaSource);\n// Prepare the player.\nplayer.prepare();\n```\n\n\u003cbr /\u003e\n\nAccessing the manifest\n----------------------\n\nYou can retrieve the current manifest by calling `Player.getCurrentManifest`.\nFor SmoothStreaming, you should cast the returned object to `SsManifest`. The\n`onTimelineChanged` callback of `Player.Listener` is also called whenever\nthe manifest is loaded. This will happen once for on-demand content and\npossibly many times for live content. The following code snippet shows how an app\ncan do something whenever the manifest is loaded. \n\n### Kotlin\n\n```kotlin\nplayer.addListener(\n object : Player.Listener {\n override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {\n val manifest = player.currentManifest\n if (manifest is SsManifest) {\n // Do something with the manifest.\n }\n }\n }\n)\n```\n\n### Java\n\n```java\nplayer.addListener(\n new Player.Listener() {\n @Override\n public void onTimelineChanged(\n Timeline timeline, @Player.TimelineChangeReason int reason) {\n Object manifest = player.getCurrentManifest();\n if (manifest != null) {\n SsManifest ssManifest = (SsManifest) manifest;\n // Do something with the manifest.\n }\n }\n });\n```\n\n\u003cbr /\u003e\n\nCustomizing playback\n--------------------\n\nExoPlayer provides multiple ways for you to tailor playback experience to your\napp's needs. See the [Customization page](/guide/topics/media/exoplayer/customization) for examples."]]