Media3 1.9.0 版現已推出!除了修正錯誤及提升效能,最新版本還包含 四個全新或大幅改寫的模組:
media3-inspector- 在播放期間以外擷取中繼資料和影格media3-ui-compose-material3- 只要幾個步驟,即可建構基本的 Material3 Compose 媒體 UImedia3-cast- 自動處理 Cast 和本機播放之間的轉移media3-decoder-av1- 根據 dav1d 程式庫重新編寫擴充功能解碼器,確保 AV1 播放體驗一致
我們也為 PreloadManager 新增了快取和記憶體管理改善項目,並提供多項新的 ExoPlayer、Transformer 和 MediaSession 簡化項目。
此外,您也可以透過這個版本,搶先體驗CompositionPlayer,預覽媒體編輯內容。
請繼續閱讀下文,瞭解更多資訊。此外,如要全面瞭解本次發布內容的異動,請參閱完整版本資訊。
在播放期間以外擷取中繼資料和影格
在許多情況下,您會想檢查媒體,但不想開始播放。舉例來說,您可能想偵測檔案包含哪些格式、檔案長度,或是擷取縮圖。
新的 media3-inspector 模組整合了所有公用程式,方便您在同一處檢查媒體,不必播放媒體:
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()
}
}
只要幾個步驟,就能建構基本的 Material 3 Compose 媒體 UI
在先前的版本中,我們開始提供 Compose UI 元素與 Player 執行個體之間的連接器程式碼。在 Media3 1.9.0 中,我們新增了 media3-ui-compose-material3 模組,其中包含樣式完整的 Material3 按鈕和內容元素。您只需幾個步驟即可建構媒體 UI,同時享有自訂樣式的彈性。如果您偏好自行建構 UI 樣式,可以使用負責處理所有更新和連線邏輯的建構區塊,因此您只需要專注於設計 UI 元素。如需 Compose UI 模組的詳細資訊,請參閱擴充指南頁面。
我們也持續開發更多 Compose 元件,例如預先建構的跳轉滑桿、可完全取代 PlayerView 的現成元件,以及字幕和廣告整合功能。
@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 和本機播放之間的轉場
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 版包含完全重寫的 AV1 擴充功能模組,以熱門的 dav1d 程式庫為基礎。
與所有擴充功能解碼器模組一樣,請注意,您需要從來源建構 ,才能正確組合相關的原生程式碼。將解碼器與應用程式一併發布,可確保所有裝置都能支援一致的格式,但由於解碼器會在您的程序中執行解碼作業,因此最適合用於您信任的內容。
將快取和記憶體管理功能整合至 PreloadManager
我們也進一步提升了 PreloadManager。您已可將媒體預先載入播放以外的記憶體,並在需要時順暢地交給播放器。雖然效能相當不錯,但您仍須小心,以免預先載入過多內容而超出記憶體限制。因此,我們在 Media3 1.9.0 中新增了兩項功能,讓這項作業更加輕鬆穩定:
- 支援快取 :定義預先載入的距離時,現在可以選擇
PreloadStatus.specifiedRangeCached(0, 5000)做為預先載入項目的目標狀態。這樣一來,系統會將指定範圍新增至磁碟上的快取,而不是將資料載入記憶體。這樣一來,您就能提供更多項目進行預先載入,因為距離目前項目較遠的項目不再需要占用記憶體。請注意,這需要在DefaultPreloadManager.Builder中設定Cache。 - 自動記憶體管理 :我們也更新了
LoadControl介面,可更妥善處理預先載入的項目,現在您可以為記憶體中所有預先載入的項目設定明確的記憶體上限。預設為 144 MB,您可以在DefaultLoadControl.Builder中設定上限。達到上限後,DefaultPreloadManager會自動停止預先載入,並在必要時自動釋出優先順序較低項目的記憶體。
在 ExoPlayer 中採用簡化版預設行為
我們也照常為 ExoPlayer 增添許多漸進式改良功能。例如:
- 靜音和取消靜音:我們已提供
setVolume方法,現在又新增了mute和unmute簡易方法,方便您輕鬆還原先前的音量,不必自行追蹤。 - 偵測播放器停止播放:在極少數情況下,播放器可能會停留在緩衝或播放狀態,但沒有任何進度,例如因為編解碼器問題或設定錯誤。使用者會感到不滿,但您在 Analytics 中從未發現這些問題!為讓使用者更容易發現這個問題,播放器現在偵測到卡住狀態時,會回報
StuckPlayerException。 - 預設為 Wake Lock:先前 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 中的新元件,專為即時預覽媒體編輯內容而設計。CompositionPlayer 以熟悉的 Media3 Player 介面為基礎,可讓使用者在匯出程序開始前,先查看變更的實際效果。這個物件與您傳遞至 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.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 需要在建立序列時指定所需的輸出音軌類型。這項變更可確保整個組合中的軌道處理作業更加明確且穩定。
方法是透過新的 EditedMediaItemSequence.Builder 建構函式,接受一組軌道類型 (例如 C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO)。
為簡化建立作業,我們新增了靜態便利方法:
- 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 問題追蹤工具與我們聯絡。我們期盼您的回音!
繼續閱讀
-
產品新訊
盡可能確保 Google Play 提供最安全可靠的服務體驗。今天,我們宣布推出一系列新政策和帳戶轉移功能,進一步保障使用者隱私,並防範詐欺行為。
Bennet Manuel • 3 分鐘可讀完
-
產品新訊
現在使用 Android Emulator,就能輕鬆測試支援多種裝置的互動。
Steven Jenkins • 閱讀時間:2 分鐘
-
產品新訊
每位開發人員的 AI 工作流程和需求都不盡相同,因此選擇 AI 輔助開發的方式非常重要。我們在 1 月推出這項功能,讓您選擇任何本機或遠端 AI 模型,為 Android Studio 中的 AI 功能提供支援
Matthew Warner • 閱讀時間:2 分鐘
隨時掌握最新消息
每週透過電子郵件接收最新的 Android 開發洞察資料。