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