プロダクト ニュース

Media3 1.9.0 - 新機能

所要時間: 6 分
Kristina Simakova さんのプロフィールを表示
Kristina Simakova エンジニアリング マネージャー

Media3 1.9.0 がリリースされました。今回のリリースには、通常のバグの修正とパフォーマンスの改善に加えて、4 つの新しいモジュールまたは大幅に書き直されたモジュールが含まれています。

  • media3-inspector - 再生外でメタデータとフレームを抽出
  • media3-ui-compose-material3 - わずか数ステップで基本的な Material3 Compose メディア UI を構築する
  • media3-cast - Cast とローカル再生間の切り替えを自動的に処理
  • media3-decoder-av1 - dav1d ライブラリに基づく書き換えられた拡張機能デコーダによる一貫した AV1 再生

また、PreloadManager にキャッシュ保存とメモリ管理の改善を追加し、いくつかの新しい ExoPlayerTransformerMediaSession の簡素化を提供しました。

今回のリリースでは、メディア編集をプレビューするためのCompositionPlayerへの最初の実験的なアクセスも提供されます。  


詳細については、以下をお読みください。また、このリリースの変更点の概要については、リリースノートをご覧ください。

再生以外のメタデータとフレームを抽出

再生を開始せずにメディアを検査したい場合が多々あります。たとえば、含まれている形式や再生時間を確認したり、サムネイルを取得したりできます。

新しい media3-inspector モジュールは、再生せずにメディアを検査するすべてのユーティリティを 1 か所に統合します。

  • MetadataRetrieverMediaItem から期間、フォーマット、静的メタデータを読み取ります。
  • FrameExtractor: アイテムからフレームまたはサムネイルを取得します。
  • MediaExtractorCompat を Android プラットフォームの MediaExtractor クラスの直接の代替として使用して、ファイル内のサンプルに関する詳細情報を取得します。

MetadataRetrieverFrameExtractorは単純な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)
    }
  }
}

 

image.png

すぐに使える要素を備えたシンプルな 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()

}
image.png

Media3 セッションデモアプリに新しい CastPlayer 統合が追加されました

dav1d ベースの書き換えられた拡張機能による一貫した AV1 再生

1.9.0 リリースには、人気の dav1d ライブラリに基づいて完全に書き直された AV1 拡張モジュールが含まれています。

すべての拡張機能デコーダ モジュールと同様に、関連するネイティブ コードを正しくバンドルするには、ソースからビルドする 必要があります。デコーダをバンドルすると、すべてのデバイスで一貫性と形式のサポートが提供されますが、デコードがプロセス内で実行されるため、信頼できるコンテンツに最適です。

キャッシングとメモリ管理を PreloadManager に統合する

私たちはPreloadManagerをさらに改良しました。これにより、再生外でメディアをメモリにプリロードし、必要に応じてプレーヤーにシームレスに渡すことが可能になりました。性能はかなり良かったものの、誤ってメモリを過剰にプリロードしてメモリ制限を超えないように注意する必要があった。そこで Media3 1.9.0 では、これをより簡単かつ安定的に行うための 2 つの機能を追加しました。

  1. キャッシュ保存のサポート - プリロードする範囲を定義する際に、プリロードされたアイテムのターゲット状態として PreloadStatus.specifiedRangeCached(0, 5000) を選択できるようになりました。これにより、指定された範囲のデータがメモリにロードされる代わりに、ディスク上のキャッシュに追加されます。これにより、現在のアイテムから離れたアイテムがメモリを占有する必要がなくなるため、プリロードするアイテムの範囲を大幅に拡大できます。これは、DefaultPreloadManager.BuilderCache を設定する必要があることに注意してください。
  2. 自動的なメモリ管理 - プリロードのケースをより適切に処理するために LoadControl インターフェースも更新しました。これにより、メモリ内のすべてのプリロードされたアイテムに対して明示的なメモリ上限を設定できるようになりました。デフォルトは 144 MB です。上限は DefaultLoadControl.Builder で構成できます。DefaultPreloadManager は、上限に達するとプリロードを自動的に停止し、必要に応じて優先度の低いアイテムのメモリを自動的に解放します。

ExoPlayer の新しい簡素化されたデフォルトの動作を利用する

今回も、ExoPlayer に多くの改善が加えられています。以下にその一部をご紹介します。

  • ミュートとミュート解除 – すでにsetVolumeメソッドがありましたが、以前の音量を自分で管理しなくても簡単に復元できる便利なmuteunmuteメソッドを追加しました。
  • プレイヤーの停止検出 – まれに、コーデックの問題や設定ミスなどが原因で、プレイヤーがバッファリング状態または再生状態のまま進行しなくなることがあります。ユーザーは不満を抱くでしょうが、アナリティクスでこれらの問題が検出されることはありません。これをより明確にするため、プレーヤーはスタック状態を検出すると StuckPlayerException を報告するようになりました。
  • デフォルトでウェイクロック - 以前はウェイクロック管理がオプトインだったため、バックグラウンドで実行中に再生の進行が大幅に遅れるエッジケースを見つけるのが困難でした。この機能はオプトアウトになったため、心配する必要がなくなり、再生に関する手動の wake lock 処理をすべて削除することもできます。
  • CC ボタンロジックの簡略化された設定TrackSelectionParametersを「字幕をオン/オフにする」に変更するのは意外と難しかったため、このユースケース用にシンプルなブール値selectTextByDefaultオプションを追加しました。

MediaSession でメディアボタンの設定を簡素化しましょう

これまで、Android Auto や Wear OS のメディア通知ドロワーに表示するボタンの設定を定義するには、標準的なプレーヤーメソッドをトリガーしたい場合でも、カスタムコマンドとボタンを定義する必要がありました。

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()
))
image.png

早送りボタン付きのメディアボタンの設定

リアルタイムプレビュー用の 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 を使用しなくなりましたが、ユースケースで必要な場合は setMuxerFactory を介して FrameworkMuxer.Factory を提供することができます。

新しい速度調整 API

1.9.0 リリースでは、メディア編集用の速度調整 API が簡素化されています。EditedMediaItem.Builder に速度を制御する新しいメソッドを直接導入し、API をより直感的に使用できるようにしました。EditedMediaItem.BuildersetSpeed(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 からお問い合わせください。皆様からのフィードバックをお待ちしております。

作成者:
続きを読む