作者 / 工程經(jīng)理 Kristina Simakova
Media3 1.5.0 已推出
Transformer 現(xiàn)在支持動態(tài)照片和更快的圖像編碼。我們還簡化了 DefaultPreloadManager和 ExoPlayer 的設置,使其更加易于使用。不止如此,我們添加了一個新的 IAMF 解碼器、一個 Kotlin 監(jiān)聽器擴展程序,并通過委托實現(xiàn)了更簡單的播放器優(yōu)化。 如要詳細了解有關所有新 API 和錯誤修復的信息,歡迎您查看完整的版本說明: https://github.com/androidx/media/releases/tag/1.5.0
Transformer 優(yōu)化
動態(tài)照片支持
Transformer 現(xiàn)在支持導出動態(tài)照片。如果設置了相應的 MediaItem 圖像持續(xù)時間,則會導出動態(tài)照片的圖像 (請參閱 MediaItem.Builder().setImageDurationMs()),否則,將導出動態(tài)照片的視頻。請注意,無論哪種情況下,都不應設置 EditedMediaItem 的持續(xù)時間,因為系統(tǒng)會自動調(diào)整為相應的 MediaItem 的圖像持續(xù)時間。
更快的圖像編碼
此版本通過對 DefaultVideoFrameProcessor.queueInputBitmap()的優(yōu)化,提升了圖像到視頻的編碼速度。DefaultVideoFrameProcessor 現(xiàn)在將提供給 queueInputBitmap() 的 Bitmap 視為不可變對象。GL 管道將僅對輸入 Bitmap 進行一次重采樣和顏色轉換。因此,將大型 (例如 1200 萬像素) 圖像作為輸入的 Transformer 操作執(zhí)行速度更快。
AudioEncoderSettings
與 VideoEncoderSettings 類似,Transformer 現(xiàn)在支持 AudioEncoderSettings,可用于設置所需的編碼配置文件和比特率。
編輯列表支持
Transformer 現(xiàn)在會將第一個視頻幀轉換為從 0 開始。這修復了在某些包含編輯列表的文件中出現(xiàn)的音視頻同步問題。
不支持的軌道類型日志記錄
此版本包括改進了不支持的軌道類型的日志記錄,可為問題排查和調(diào)試提供更詳細的信息。
Media3 Muxer
在之前的某個版本中,我們添加了一個新的 Muxer 庫,可用于創(chuàng)建 MP4 容器文件。Media3 Muxer 支持多種音頻和視頻編解碼器,可順暢處理各種媒體格式。此外,這個新庫還具備一些高級功能,包括:
B-frame 支持
碎片化的 MP4 輸出
編輯列表支持
Muxer 庫 https://github.com/androidx/media/tree/release/libraries/muxer
Muxer 庫可以作為 gradle 依賴項包含在內(nèi):
implementation ("androidx.media3:media3-muxer:1.5.0")
Media3 Muxer 與 Transformer
如要將 Media3 Muxer 與 Transformer 一起使用,請在創(chuàng)建 Transformer 時將 InAppMuxer.Factory (其內(nèi)部封裝了 Media3 Muxer) 設置為 Muxer factory:
val transformer = Transformer.Builder(context) .setMuxerFactory(InAppMuxer.Factory.Builder().build()) .build()
簡化 DefaultPreloadManager 和 ExoPlayer 的設置
在 Media3 1.5.0 中,我們增加了 DefaultPreloadManager.Builder,可使您更加容易地構建預加載組件和播放器。此前,我們要求您先實例化多個必要組件 (如 RenderersFactory、TrackSelectorFactory、LoadControl、BandwidthMeter 和預加載/播放 Looper),并在將這些組件注入 DefaultPreloadManager 構造函數(shù)和 ExoPlayer.Builder 時,十分謹慎地正確共享這些組件。通過使用新的 DefaultPreloadManager.Builder,這個過程變得簡單多了:
使用所有默認組件構建 DefaultPreloadManager 和 ExoPlayer 實例。
val preloadManagerBuilder = DefaultPreloadManager.Builder() val preloadManager = preloadManagerBuilder.build() val player = preloadManagerBuilder.buildExoPlayer()
使用自定義共享組件構建 DefaultPreloadManager 和 ExoPlayer 實例。
val preloadManagerBuilder = DefaultPreloadManager.Builder().setRenderersFactory(customRenderersFactory) // The resulting preloadManager uses customRenderersFactory val preloadManager = preloadManagerBuilder.build() // The resulting player uses customRenderersFactory val player = preloadManagerBuilder.buildExoPlayer()
構建 DefaultPreloadManager 和 ExoPlayer 實例,并在 ExoPlayer 上設置自定義的僅播放配置。
valpreloadManagerBuilder=DefaultPreloadManager.Builder() val preloadManager = preloadManagerBuilder.build() // Tune the playback-only configurations val playerBuilder = ExoPlayer.Builder().setFooEnabled() // The resulting player will have playback feature "Foo" enabled valplayer=preloadManagerBuilder.buildExoPlayer(playerBuilder)
預加載下個播放列表項目
我們在 ExoPlayer 中增加了預加載下個播放列表項目功能。默認情況下,播放列表預加載功能處于禁用狀態(tài),但可以通過設定預加載到內(nèi)存的持續(xù)時間來啟用該功能:
player.preloadConfiguration= PreloadConfiguration(/*targetPreloadDurationUs=*/5_000_000L)通過使用上述 PreloadConfiguration,播放器嘗試為播放列表中的下一個項目預加載五秒鐘的媒體內(nèi)容。僅當系統(tǒng)沒有加載當前播放所需的媒體時,預加載功能才會啟動。這樣可以避免預加載占用主要播放內(nèi)容的帶寬。 啟用預加載功能后,當用戶跳轉到下一個項目,而播放緩沖區(qū)尚未到達下一個項目時,預加載可以幫助充分縮短銜接延遲。通過將視頻、音頻和文本樣本預加載到樣本隊列,這項功能可以將下個播放項目的開頭內(nèi)容準備就緒。預加載的時間段隨后會被排隊到播放器中,預加載的樣本立即可用并隨時可供編解碼器進行渲染。 選擇啟用后,可以通過使用 PreloadConfiguration.DEFAULT 再次關閉播放列表預加載功能,以停用播放列表預加載:
player.preloadConfiguration = PreloadConfiguration.DEFAULT
新 IAMF 解碼器和
Kotlin 監(jiān)聽器擴展程序
1.5.0 版本包含一個新的 media3-decoder-iamf 模塊,該模塊支持以 MP4 文件形式播放 IAMF 沉浸式音頻軌道。如果應用想要試用此功能,則需在本地構建 libiamf 解碼器。您可以參閱 Media3 自述文件了解完整說明。
implementation ("androidx.media3:media3-decoder-iamf:1.5.0")
IAMF https://aomediacodec.github.io/iamf/
Media3 自述文件 https://github.com/androidx/media/blob/release/libraries/decoder_iamf/README.md
此版本還包含一個新的 media3-common-ktx 模塊,這是用于 Kotlin 特定功能的模塊。此模塊的第一個版本包含一個掛起函數(shù),可以讓調(diào)用方監(jiān)聽 Player.Listener.onEvents。media3-ui-compose 模塊 (已隨 Media3 1.6.0 一起推出) 使用此構建模塊來支持 Jetpack Compose 播放界面。
implementation("androidx.media3:media3-common-ktx:1.5.0")?
通過委托輕松定制播放器
Media3 自 1.0.0 版以來,提供了 ForwardingPlayer 實現(xiàn),我們之前曾建議,當應用想要通過使用裝飾器模式自定義 Player 的運作方式時,應該使用這個實現(xiàn)。一個非常常見的用例是允許或禁止某些播放器命令 (以便在界面中顯示/隱藏某些按鈕)。遺憾的是,使用 ForwardingPlayer 正確執(zhí)行此操作非常困難且容易出錯,因為必須一致地重寫多個方法,并處理監(jiān)聽器。受限于文章篇幅,不在此使用示例代碼說明上述方法的復雜程度,因此我們直接切入重點。
裝飾器模式 https://en.wikipedia.org/wiki/Decorator_pattern
切入重點 https://gist.github.com/icbaker/44e962c6e218ad141880331300308021
為了使此類自定義操作更輕松,1.5.0 版本新增了 ForwardingSimpleBasePlayer,基于 SimpleBasePlayer 提供的一致性保證進行構建,能夠更輕松地根據(jù)裝飾器模式建立一致的播放器實現(xiàn)。現(xiàn)在,可以更加輕松地使用相同的命令修改 Player:
classPlayerWithoutSeekToNext(player:Player):ForwardingSimpleBasePlayer(player){ override fun getState(): State { val state = super.getState() return state .buildUpon() .setAvailableCommands( state.availableCommands.buildUpon().remove(COMMAND_SEEK_TO_NEXT).build() ) .build() } // We don't need to override handleSeek, because it is guaranteed not to be called for // COMMAND_SEEK_TO_NEXT since we've marked that command unavailable. }?
MediaSession:
媒體項目的命令按鈕
媒體項目的命令按鈕允許會話應用聲明某些媒體項目支持的命令,這些命令可以通過 MediaController 或 MediaBrowser 方便地顯示和執(zhí)行。
△ 屏幕截圖:Android Automotive OS 媒體中心中媒體項目的命令按鈕。
您可以查閱 Android Developer 官方網(wǎng)站,了解詳細內(nèi)容。 這是 Media3 中等效于舊版 "自定義瀏覽操作" API 的功能,Media3 可以與其完全互操作。與舊版 API 不同,媒體項目的命令按鈕不需要MediaLibraryService,而是 Media3 MediaSession 的一項功能。因此,這些按鈕能夠以相同的方式供 MediaController 和 MediaBrowser 使用。 如果您遇到任何問題,有功能請求或想要分享反饋,請使用 GitHub 上的 Media3 問題跟蹤頁告訴我們。我們期待收到您的消息!
GitHub 上的 Media3 問題跟蹤頁 https://github.com/androidx/media/issues
這篇文章是我們 "相機與媒體 Spotlight Week"系列的內(nèi)容之一。在此系列中,我們會提供包括文章、視頻、示例代碼等資源,以幫助您提升應用中的媒體體驗。
-
解碼器
+關注
關注
9文章
1161瀏覽量
41554 -
圖像
+關注
關注
2文章
1091瀏覽量
40902 -
Transformer
+關注
關注
0文章
148瀏覽量
6319
原文標題:一文掌握 Media3 1.5.0 的新功能
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論