Media3 1.9.0 版已推出!除了常見的錯誤修正和效能提升外,最新版本還包含四個全新或大幅重寫的模組:
media3-inspector- 擷取播放以外的中繼資料和影格media3-ui-compose-material3- 只要幾個步驟,就能建構基本的 Material 3 Compose 媒體 UImedia3-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 模組,提供完整樣式的 Material 3 按鈕和內容元素。只要幾個步驟,就能建構媒體 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方法,可輕鬆還原先前的音量,不必自行追蹤。 - 偵測播放器停滯:在極少數情況下,播放器可能會因轉碼器問題或設定錯誤等原因,停滯在緩衝或播放狀態,無法繼續播放。使用者會感到困擾,但你不會在數據分析中看到這些問題!為更清楚呈現,播放器現在偵測到卡住狀態時,會回報
StuckPlayerException。 - 預設啟用 Wake Lock:Wake Lock 管理功能先前為選擇加入,因此在背景執行時,播放進度可能會大幅延遲,且難以找出極端案例。現在這項功能是選擇不採用,因此您不必擔心,也可以移除播放時的所有手動 Wake Lock 處理。
- 簡化 CC 按鈕邏輯設定:將
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 需要在建立序列時指定所需的輸出音軌類型。這項異動可確保整個 Composition 的音軌處理方式更明確且更穩健。
方法是透過新的 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 Issue Tracker 與我們聯絡。期待收到您的申請!
-
產品最新消息隨著代理式開發加速發展,Android 工程技術也邁入令人期待的新境界:從輔助程式碼補全,到代理依據您的指示執行端對端作業。您可以自由選擇要使用的模型和代理,享有充分彈性。
Jason Buchel • 閱讀時間:3 分鐘 -
產品最新消息今天,我們分享了如何將「不只是商店」的願景推向新階段。Google Play 致力於滿足使用者需求,包括推出「個人中心」分頁,成為每月超過 2.5 億活躍使用者的個人中心,以及整合遊戲平台,連結超過 7 億個玩家個人資料。
Paul Feng • 閱讀時間:3 分鐘 -
產品最新消息我們很高興能透過 Googlebook 協助使用者表達自我,並取得這些工具。
Cyrus Stoller • 閱讀時間:2 分鐘
每週透過電子郵件接收最新的 Android 開發洞察資訊。