Media3 1.9.0 がリリースされました。今回の最新リリースには、通常のバグ修正とパフォーマンスの改善に加えて、4 つ の新しいモジュールまたは大幅に書き換えられたモジュールが含まれています。
media3-inspector- 再生以外でメタデータとフレームを抽出するmedia3-ui-compose-material3- Material3 Compose の基本的なメディア UI を数ステップで構築するmedia3-cast- Cast とローカル再生間の切り替えを自動的に処理するmedia3-decoder-av1- dav1d ライブラリに基づく書き換えられた拡張デコーダで AV1 を一貫して再生する
また、PreloadManager にキャッシュとメモリ管理の改善が加えられ、ExoPlayer、Transformer、MediaSession がいくつか簡素化されました。
このリリースでは、CompositionPlayer の最初の試験運用版にアクセスして、メディア編集をプレビューすることもできます。
詳細については、以下をお読みください。また、このリリースの変更点の概要については、リリースノート全体をご覧ください。
再生以外でメタデータとフレームを抽出する
再生を開始せずにメディアを検査したい場合は多くあります。たとえば、メディアに含まれる形式や再生時間を確認したり、サムネイルを取得したりする場合などです。
新しい media3-inspector モジュールは、再生せずにメディアを検査するためのすべてのユーティリティを 1 か所にまとめたものです。
MetadataRetriever\-MediaItemから再生時間、形式、静的メタデータを読み取ります。FrameExtractor\- アイテムからフレームまたはサムネイルを取得します。MediaExtractorCompat\- Android プラットフォームの MediaExtractor クラスを直接置き換えて、ファイル内のサンプルに関する詳細情報を取得します。
MetadataRetriever と FrameExtractor は、シンプルな AutoCloseable パターンに従います。詳細については、新しいガイドページをご覧ください。
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}
Material3 Compose の基本的なメディア UI を数ステップで構築する
以前のリリースでは、Compose UI 要素と Player インスタンス間のコネクタコードの提供を開始しました。Media3 1.9.0 では、完全にスタイル設定された Material3 ボタンとコンテンツ要素を含む新しいモジュール media3-ui-compose-material3 が追加されました。これにより、数ステップでメディア UI を構築しながら、スタイルを柔軟にカスタマイズできます。独自の UI スタイルを構築する場合は、すべての更新ロジックと接続ロジックを処理するビルディング ブロックを使用できるため、UI 要素の設計に集中できます。Compose UI モジュールの拡張ガイドページをご覧ください。
また、事前構築済みのシークバー、PlayerView の完全な代替となるもの、字幕と広告の統合など、さらに多くの Compose コンポーネントの開発も進めています。
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
事前構築済みの要素を使用したシンプルな Compose プレーヤー UI
Cast とローカル再生間の切り替えを自動的に処理する
CastPlayer が media3-cast モジュールで書き換えられ、ローカル再生(ExoPlayer など)とリモート Cast 再生間の切り替えが自動的に処理されるようになりました。
MediaSession を設定するときは、ExoPlayer の周囲に CastPlayer を構築し、UI に MediaRouteButton を追加するだけで完了です。
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
Media3 セッション デモアプリでの新しい CastPlayer 統合
dav1d に基づく書き換えられた拡張機能で AV1 を一貫して再生する
1.9.0 リリースには、人気の dav1d ライブラリに基づく完全に書き換えられた AV1 拡張モジュールが含まれています。
すべての拡張デコーダ モジュールと同様に、関連するネイティブ コードを正しくバンドルするには、ソースからビルド する必要があります。デコーダをバンドルすると、すべてのデバイスで一貫した形式のサポートが提供されますが、プロセスでデコードが実行されるため、信頼できるコンテンツに最適です。
キャッシュとメモリ管理を PreloadManager に統合する
PreloadManager も改善されました。以前は、再生以外でメディアをメモリにプリロードし、必要に応じてプレーヤーにシームレスに渡すことができました。パフォーマンスは優れていましたが、プリロードしすぎるとメモリの上限を超える可能性があるため、注意が必要でした。Media3 1.9.0 では、この問題を大幅に軽減し、安定性を高める 2 つの機能が追加されました。
- キャッシュのサポート \- プリロードする範囲を定義するときに、プリロードされたアイテムのターゲット状態として
PreloadStatus.specifiedRangeCached(0, 5000)を選択できるようになりました。これにより、データがメモリに読み込まれるのではなく、指定した範囲がディスク上のキャッシュに追加されます。これにより、現在のアイテムから離れたアイテムがメモリを占有する必要がなくなるため、プリロードするアイテムの範囲を大幅に拡大できます。これには、DefaultPreloadManager.BuilderでCacheを設定する必要があります。 - 自動メモリ管理 \- また、プリロード ケースをより適切に処理できるように
LoadControlインターフェースを更新し、メモリ内のプリロードされたすべてのアイテムに明示的なメモリ上限を設定できるようになりました。デフォルトでは 144 MB で、DefaultLoadControl.Builderで上限を構成できます。DefaultPreloadManagerは、上限に達するとプリロードを自動的に停止し、必要に応じて優先度の低いアイテムのメモリを自動的に解放します。
ExoPlayer の新しい簡素化されたデフォルトの動作に依存する
これまでと同様に、ExoPlayer にも多くの段階的な改善が加えられました。いくつか例を挙げます。
- ミュートとミュート解除 – 以前から
setVolumeメソッドがありましたが、便利なmuteメソッドとunmuteメソッドが追加され、自分で追跡しなくても以前の音量を簡単に復元できるようになりました。 - プレーヤーの停止の検出 \- まれに、コーデックの問題や構成の誤りなどが原因で、プレーヤーがバッファリング状態または再生状態で停止し、進行しなくなることがあります。ユーザーは不満を感じますが、分析ではこのような問題は表示されません。これをより明確にするために、プレーヤーは停止状態を検出すると
StuckPlayerExceptionを報告するようになりました。 - デフォルトで Wakelock \- 以前は Wake Lock の管理がオプトインだったため、バックグラウンドで実行中に再生の進行が大幅に遅れるエッジケースを見つけるのが困難でした。この機能はオプトアウトになったため、心配する必要がなくなり、再生に関する手動の Wake Lock 処理をすべて削除できます。
- 字幕ボタンのロジックの設定を簡素化 \-
TrackSelectionParametersを変更して「字幕のオン/オフ」を設定するのは意外と難しかったため、このユースケース用にシンプルなブール値selectTextByDefaultオプションを追加しました。
MediaSession でメディアボタンの設定を簡素化する
これまで、Android Auto または WearOS のメディア通知ドロワーに表示するボタンの設定を定義するには、標準のプレーヤー メソッドをトリガーするだけであっても、カスタム コマンドとボタンを定義する必要がありました。
Media3 1.9.0 には、これを大幅に簡素化する新機能が搭載されています。標準のプレーヤー コマンドでメディアボタンの設定を定義できるため、カスタム コマンド処理は不要です。
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
早送りボタン付きのメディアボタンの設定
リアルタイム プレビュー用の CompositionPlayer
1.9.0 リリースでは、新しい @ExperimentalApi アノテーションの下に CompositionPlayer が導入されています。このアノテーションは、試験運用版として利用可能であることを示しますが、まだ開発中です。
CompositionPlayer は、メディア編集のリアルタイム プレビュー用に設計された Media3 編集 API の新しいコンポーネントです。使い慣れた Media3 Player インターフェースに基づいて構築された CompositionPlayer を使用すると、ユーザーはエクスポート プロセスを確定する前に変更を確認できます。エクスポート用に Transformer に渡すのと同じ Composition オブジェクトを使用し、プレビューとエクスポートのデータモデルを統合することで、編集ワークフローを効率化します。
CompositionPlayer の使用を開始してフィードバックをお寄せください。詳細については、今後の投稿とドキュメントの更新にご注目ください。
Transformer のデフォルトのミューサーとして InAppMuxer を使用する
Transformer は、メディア コンテナ ファイルの書き込みにデフォルトのミューサーとして InAppMp4Muxer を使用するようになりました。内部的には、InAppMp4Muxer は Media3 Muxer モジュールに依存し、すべての API バージョンで一貫した動作を提供します。
Transformer はデフォルトで Android プラットフォームの MediaMuxer を使用しなくなりましたが、ユースケースで必要な場合は、FrameworkMuxer.Factory を setMuxerFactory 経由で指定できます。
新しい速度調整 API
1.9.0 リリースでは、メディア編集の速度調整 API が簡素化されています。速度を制御するために、EditedMediaItem.Builder に新しいメソッドが直接導入され、API がより直感的になりました。EditedMediaItem.Builder で setSpeed(SpeedProvider provider) を呼び出すことで、クリップの速度を変更できるようになりました。
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()
この新しいアプローチは、以前の Effects#createExperimentalSpeedChangingEffects() の使用方法に代わるものです。このメソッドは非推奨となり、今後のリリースで削除されます。
EditedMediaItemSequence のトラックタイプを導入する
1.9.0 リリースでは、EditedMediaItemSequence で、シーケンスの作成時に必要な出力トラックタイプを指定する必要があります。この変更により、Composition 全体でトラック処理がより明確かつ堅牢になります。
これは、トラックタイプのセット(C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO など)を受け取る新しい EditedMediaItemSequence.Builder コンストラクタを使用して行われます。
作成を簡素化するために、新しい静的な便利なメソッドが追加されました。
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
シーケンス定義をより明確かつ確実に定義するには、新しいコンストラクタまたは便利なメソッドに移行することをおすすめします。
動画のみのシーケンスを作成する例:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
バグが発生した場合や、ご不明な点や機能リクエストがある場合は、Media3 Issue Tracker からお問い合わせください。皆様からのフィードバックをお待ちしております。
続きを読む
-
プロダクト ニュース
今年の Google I/O では、進化するビジネスモデルについて説明しました。このモデルでは、アプリやコンテンツをストア内外で検出するための選択肢と新しい方法が提供されます。また、複雑さを軽減しながらビジネスを拡大できる高度なツールと分析情報も発表しました。
-
プロダクト ニュース
Android XR で Unreal Engine と Godot の公式サポートが開始されました。また、生産性を向上させ、新しい XR 機能を有効にするように設計された新しいツール(Android XR Engine Hub と Android XR Interaction Framework)もリリースします。
Luke Hopkins • 所要時間: 4 分
-
プロダクト ニュース
コンテンツの検出可能性を高め、今後の TV エクスペリエンスに向けてアプリを準備できるように設計された Google TV の機能とデベロッパー ツールをご紹介します。
Paul Lammertsma • 所要時間: 4 分
最新情報の入手
Android 開発に関する最新の分析情報を毎週メールでお届けします。