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 か所にまとめます。
MediaItemから再生時間、形式、静的メタデータを読み取るためのMetadataRetriever。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
キャストとローカル再生間の切り替えを自動的に処理する
media3-cast モジュールの CastPlayer が書き直され、ローカル再生(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をレポートするようになりました。 - デフォルトでウェイクロック - 以前はウェイクロック管理はオプトインでしたが、バックグラウンドで実行中に再生の進行が大幅に遅れるエッジケースを見つけるのが困難でした。この機能はオプトアウトになったため、心配する必要がなくなり、再生に関する手動の 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 のデフォルトの muxer としての InAppMuxer
Transformer は、メディア コンテナ ファイルの書き込みにデフォルトの muxer として InAppMp4Muxer を使用するようになりました。内部的には、InAppMp4Muxer は Media3 の Muxer モジュールに依存しており、すべての API バージョンで一貫した動作を提供します。
Transformer はデフォルトで Android プラットフォームの MediaMuxer を使用しなくなりましたが、ユースケースで必要な場合は、setMuxerFactory を介して FrameworkMuxer.Factory を提供できます。
新しい速度調整 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() の使用方法に代わるものです。Effects#createExperimentalSpeedChangingEffects() は非推奨となり、今後のリリースで削除される予定です。
EditedMediaItemSequence のトラック タイプを導入
1.9.0 リリースでは、シーケンスの作成時に必要な出力トラック タイプを指定する必要があります。EditedMediaItemSequenceこの変更により、コンポジション全体でトラックの処理がより明示的かつ堅牢になります。
これは、一連のトラックタイプ(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 Play では、サブスクリプション プラットフォームを継続的に拡大し、成長の促進、新しいビジネスモデルへの適応、ユーザーのニーズへの対応をサポートしています。
Sheenam Mittal • 所要時間: 4 分 -
プロダクト ニュース昨年、Android Studio はあらゆる AI モデルに対応しました。本日、Google はコーディング エージェントの選択をサポートすることで、次のステップに進みます。
Matthew Warner • 所要時間: 3 分 -
プロダクト ニュースGooglebook は、共有 Android 基盤上に構築された新しいカテゴリのノートパソコンです。HP、Dell、Lenovo、Acer、Asus などのパートナーの高性能ハードウェアは、モバイルの利便性とデスクトップのパワーを兼ね備えています。
Fahd Imtiaz, Loryn Hairston • 所要時間: 4 分
Android 開発に関する最新の分析情報を毎週メールでお届けします。