Media3
最近更新時間 | 穩定版 | 候選版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2025 年 7 月 2 日 | 1.7.1 | - | 1.8.0-beta01 | 1.8.0-alpha01 |
宣告依附元件
如果要為 Media3 新增依附元件,您必須將 Google Maven 存放區新增至專案。詳情請參閱 Google 的 Maven 存放區。
在應用程式或模組的 build.gradle
檔案中,新增您需要的構件依附元件:
Groovy
dependencies { def media3_version = "1.6.1" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs using Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs using Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.6.1" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs using Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs using Views implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs using Jetpack Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
如要進一步瞭解依附元件,請參閱「新增建構依附元件」一文。
意見回饋
您的意見可協助我們改善 Jetpack。您可以使用 Media3 Issue Tracker 尋找問題的答案、已知問題和功能要求,以及提出新問題。
1.8.0 版
1.8.0-beta01 版
2025 年 7 月 2 日
發布了 androidx.media3:media3-*:1.8.0-beta01
。1.8.0-beta01 版包含這些修訂項目。
- 通用程式庫:
- 新增在
ForwardingSimpleBasePlayer
中取代播放器的支援。
- 新增在
- ExoPlayer:
- 新增支援功能,可使用從
Context
傳遞至ExoPlayer.Builder
的虛擬裝置 ID。 - 在清除模式下,預設啟用動態排程。
- 避免在搜尋項目結尾時,不必要地重新載入來源。
- 在清除模式中,預設使用
MediaCodec.BUFFER_FLAG_DECODE_ONLY
。 - 當
PreloadMediaSource
由ExoPlayer
播放,且播放執行緒與預先載入執行緒不同時,擲回IllegalStateException
(#2495)。 - 將
cloneAndMove
新增至ShuffleMode
,並採用預設實作方式 (#2226)。 - 如果不需要呼叫
render
,請變更Renderer.getMinDurationToProgressUs
的預設行為,傳回較大的值。 - 修正錯誤:暫停時搜尋至結尾,內部排程會延遲最後一格畫面。目前,只有在啟用
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled
時,錯誤修正才會生效。
- 新增支援功能,可使用從
- 轉換程式:
- 新增
CodecDbLite
,可針對晶片組最佳化影片編碼設定。 - 在
DefaultEncoderFactory
中新增setEnableCodecDbLite
標記,啟用 CodecDB Lite 設定最佳化功能。這項旗標預設為 false。
- 新增
- 擷取工具:
- 新增支援:在具有多個
sidx
原子片段的 MP4 中搜尋。 您可以在FragmentedMp4Extractor
上使用FLAG_MERGE_FRAGMENTED_SIDX
旗標啟用這項行為 (#9373)。 - 忽略 FLAC 檔案中的空白搜尋表 (包括只包含預留位置搜尋點的搜尋表),並在檔案長度已知時,改用二分搜尋法搜尋 (#2327)。
- 修正 H.265 SEI 單元的剖析問題,完全略過無法辨識的 SEI 類型 (#2456)。
- 更新
WavExtractor
,在剖析WAVE_FORMAT_EXTENSIBLE
類型檔案時,使用標頭擴充功能的 SubFormat 資料做為音訊格式。 - MP4:新增對
ipcm
和fpcm
方塊的支援,定義原始 PCM 音訊軌 (不支援 64 位元浮點 PCM)。 - MP4:處理
tkhd
轉換矩陣的旋轉部分,該矩陣會旋轉及反映影片。這樣可確保 iPhone 前置鏡頭拍攝的反射影片會正向顯示,但會沿著 Y 軸錯誤地反射 (#2012)。
- 新增支援:在具有多個
- 音訊:
- 在
ChannelMappingAudioProcessor
和TrimmingAudioProcessor
中新增對所有線性 PCM 樣本格式的支援。 - 在
CompositionPlayer
中新增音訊間隙支援。 - 從
BaseAudioProcessor#reset()
移除對BaseAudioProcessor#flush()
的虛假呼叫。
- 在
- 影片:
- 改善啟動時的流暢影片影格發布,避免音訊樣本未在確切要求的位置啟動。
- 將已卸除 Surface 的解決方法擴展至「realme」裝置 (#2059)。
- 文字:
- 修正字幕片段一開始載入失敗,但稍後載入成功,接著出現多個空白字幕片段時,播放會停滯的問題 (#2517)。
- 中繼資料:
- 新增支援擷取媒體時間長度和
Timeline
的MetadataRetriever
,並將其遷移至以例項為基礎的AutoCloseable
API。使用新的Builder
為MediaItem
建立執行個體,然後呼叫retrieveTrackGroups()
、retrieveTimeline()
和retrieveDurationUs()
,取得中繼資料的ListenableFuture
。先前的靜態方法現已淘汰 (#2462)。
- 新增支援擷取媒體時間長度和
- 圖片:
- 將解碼點陣圖限制為
BitmapFactoryImageDecoder
中的螢幕大小,以免應用程式嘗試顯示非常大的圖片 (例如 5000 萬像素) 時,因PlayerView
發生Canvas: trying to draw too large bitmap.
而當機。 - 變更
DefaultRenderersFactory.getImageDecoderFactory()
的簽章,以採用Context
參數。 - 將
CompositionPlayer
中使用的點陣圖輸出大小上限,與Transformer
中已使用的點陣圖輸出大小上限對齊 (也就是說,CompositionPlayer
不會像ExoPlayer
一樣在解碼點陣圖時考量螢幕大小)。
- 將解碼點陣圖限制為
- Muxers:
- 修正錯誤:在 MP4 碎片中,音訊樣本未設定正確的樣本標記。
- 工作階段:
- 修正錯誤:從主執行緒呼叫
setSessionExtras
時,如果從不同應用程式執行緒執行播放器,則主執行緒會導致IllegalStateException
(#2265)。 - 如果玩家設定了媒體項目,但未準備或播放這些項目,請勿自動顯示通知 (#2423 https://github.com/androidx/media/issues/2423)。您可以透過
MediaSessionService.setShowNotificationForIdlePlayer
設定這項行為。 - 為所有或選取的控制器新增自訂
PlaybackException
。 - 修正錯誤:在
MediaController
上搜尋直播內容時,可能會導致IllegalArgumentException
。 - 如果是直播,請停止發布播放位置,並禁止平台媒體控制器在目前項目中搜尋,以免 Android Auto 使用者介面 (以及其他使用平台媒體工作階段資訊的控制器) 出現位置錯誤 (#1758)。
- 修正錯誤:從主執行緒呼叫
- Cronet 擴充功能:
- 新增自動 Cookie 處理功能 (#5975)。
- HLS 擴充功能:
- DASH 擴充功能:
- RTSP 擴充功能:
- 修正
RtspClient
,在處理 HTTP 302 回應時,使用提供的 URI 位置 (#2398)。
- 修正
- 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
- 修正
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange
對音訊解碼器擴充功能沒有影響的錯誤 (#2258)。
- 修正
- Cast 擴充功能:
- 新增對
setVolume()
和getVolume()
的支援 (#2279)。 - 防止 CastPlayer 在時間軸空白時進入 STATE_BUFFERING。
- 新增對
- 測試公用程式:
- 在
TestPlayerRunHelper
中新增advance(player).untilPositionAtLeast
和untilMediaItemIndex
,即可將播放器快轉至指定位置。在大多數情況下,這些方法比現有的untilPosition
和untilStartOfMediaItem
方法更可靠。 - 將
FakeDownloader
移至test-utils-robolectric
模組,以便在其他測試中重複使用。
- 在
1.8.0-alpha01 版
2025 年 5 月 19 日
發布了 androidx.media3:media3-*:1.8.0-alpha01
。1.8.0-alpha01 版包含這些修訂項目。
- ExoPlayer:
- 新增
ExoPlayer.setScrubbingModeEnabled(boolean)
方法。這項設定可針對許多頻繁的搜尋動作 (例如使用者拖曳搜尋列) 最佳化播放器。您可以在ExoPlayer
和ExoPlayer.Builder
上使用setScrubbingModeParameters(..)
自訂快轉模式的行為。 - 允許在快轉模式中自訂部分搜尋容許值。
- 在清除模式中提高轉碼器運作速率。
- 修正錯誤:
AdsMediaSource
內容中的準備錯誤可能永遠不會回報 (#2337)。 - 修正
MergingMediaSource
中的記憶體流失問題,例如側載字幕時會使用MergingMediaSource
(#2338)。 - 允許
CmcdConfiguration.Factory
傳回null
,針對特定媒體項目停用 CMCD 記錄 (#2386)。 - 將預設圖片緩衝區大小從 128 KB (從文字軌複製貼上時發生錯誤) 增加至 26 MB,這足以容納 5000 萬像素的 Ultra HDR 圖片 (#2417)。
- 新增
PreCacheHelper
,讓應用程式預先快取單一媒體,並指定開始位置和時間長度。
- 新增
- 轉換程式:
- 如要使用靜音音訊填補初始間隙 (透過
addGap()
新增),現在必須在EditedMediaItemSequence.Builder
中明確設定experimentalSetForceAudioTrack(true)
。如果間隙位於序列中間,則不需要這個標記。 - 將
Muxer
介面從media3-transformer
移至media3-muxer
。 - 將
MediaItem.Builder().setImageDuration(long)
設為必要設定,才能將媒體項目匯入為圖片。 - 新增
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean)
,其中包含修剪時的 MP4 編輯清單,指示播放器忽略修剪起點前的主要畫面格與修剪起點之間的樣本。 - 更新 Composition Demo 應用程式,改用 Kotlin 和 Jetpack Compose,並新增自訂
VideoCompositorSettings
,將序列排列成 2x2 或子母畫面版面配置。
- 如要使用靜音音訊填補初始間隙 (透過
- 擷取工具:
- MP3:由於
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)
(#2194),當系統改用固定位元率搜尋時,請使用無法搜尋的 Xing、VBRI 和類似的可變位元率中繼資料中的時間長度和資料大小。
- MP3:由於
- 音訊:
- 允許在 DefaultAudioMixer 中進行恆定功率升混/降混。
- 將
ChannelMappingAudioProcessor
、TrimmingAudioProcessor
和ToFloatPcmAudioProcessor
設為公開 (#2339)。 - 在
AudioTrackPositionTracker
中使用AudioTrack#getUnderrunCount()
,在DefaultAudioSink
中偵測欠載,而不是盡量估算。 - 改善音訊時間戳記平滑度,避免音訊輸出裝置發生非預期的位置偏移。
- 修正錯誤:連線至藍牙裝置時,從暫停狀態恢復播放後的前 10 秒,音訊/視訊會不同步。
- 修正
AnalyticsListener.onAudioPositionAdvancing
未回報音訊開始前進的時間,但回報第一次測量時間的錯誤。
- 影片:
- 新增實驗性
ExoPlayer
API,在將僅解碼的輸入緩衝區加入佇列時,加入MediaCodec.BUFFER_FLAG_DECODE_ONLY
旗標。這個標記會通知解碼器略過僅解碼的緩衝區,進而加快搜尋速度。使用DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag
啟用。 - 改善軟體視訊轉碼器的轉碼器效能檢查。這可能會導致部分額外曲目標示為
EXCEEDS_CAPABILITIES
。 - 修正部分裝置上的 VP9 Widevine 播放錯誤 (#2408)。
- 新增實驗性
- 文字:
- 修正 SSA 和 SubRip,在啟用字幕時顯示進行中的提示 (#2309)。
- 修正從有字幕錯誤的串流切換至有空白字幕軌的直播時,播放會卡住的問題 (#2328)。
- 修正播放含有 B 畫面 (#2372) 的 H.262 串流時,CEA-608 字幕顯示亂碼的問題。
- 在 Matroska 檔案中新增對 SSA 字幕的
CodecId = S_TEXT/SSA
支援。先前MatroskaExtractor
只支援CodecId = S_TEXT/ASS
,這代表 SubStation Alpha 字幕的「進階」版本 (v4 以上),但 ExoPlayer 的剖析邏輯在這兩個版本中相同 (#2384)。 - 在 SubStation Alpha (SSA) 字幕檔案中新增
layer
屬性的支援功能,用於定義提示的 Z 順序,以便在螢幕上同時顯示多個提示時使用 (#2124)。
- 效果:
- 新增
Presentation.createForShortSide(int)
,建立Presentation
,確保最短邊一律符合指定值,無論輸入方向為何。
- 新增
- Muxers:
writeSampleData()
API 現在使用 Muxer 專屬的BufferInfo
類別,而非MediaCodec.BufferInfo
。- 新增
Muxer.Factory#supportsWritingNegativeTimestampsInEditList
,預設為 false。
- IMA 擴充功能:
- 修正錯誤:一個廣告發生載入錯誤時,可能會意外導致另一個廣告群組失效。
- 修正錯誤:VOD 視窗結束後,廣告群組會導致播放停止。
如果廣告群組的開始時間晚於時間範圍,系統就不會再將其加入佇列 (#2215)。
MediaPeriodQueue
- 工作階段:
- 修正錯誤:將空值傳遞至連結至舊版
MediaBrowserServiceCompat
的MediaBrowser
的getLibraryRoot
時,會產生NullPointerException
。 - 修正錯誤:傳送自訂動作、搜尋結果或 getItem 要求時,舊版工作階段應用程式會因
ClassNotFoundException
而當機。 - 修正
MediaItem.LocalConfiguration.uri
分享至平台工作階段MediaMetadata
的錯誤。如要刻意分享 URI,讓控制器重新要求媒體,請改為設定MediaItem.RequestMetadata.mediaUri
。
- 修正錯誤:將空值傳遞至連結至舊版
- UI:
- 修正 Compose 錯誤,這個錯誤會導致設定初始按鈕狀態與觀察狀態變化 (例如圖示形狀或是否啟用) 之間出現間隙。現在系統會擷取觀察期外對 Player 所做的任何變更 (#2313)。
- 在
media3-ui-compose
模組中新增SeekBackButtonState
和SeekForwardButtonState
的狀態持有者和可組合函式。 - 在
PlayerControlView
中新增對 ExoPlayer 搜尋模式的支援。啟用後,當使用者開始拖曳滑桿時,播放器會進入快轉模式,並針對每次移動發出player.seekTo
呼叫,然後在手指離開螢幕時退出快轉模式。如要啟用這項整合功能,請在 XML 中使用time_bar_scrubbing_enabled = true
,或透過 Java/Kotlin 使用setTimeBarScrubbingEnabled(boolean)
方法。 - 讓
PlayerSurface
接受可為空值的Player
引數。
- 下載內容:
- 為漸進式串流新增部分下載支援。應用程式可以使用
DownloadHelper
準備漸進式串流,並指定下載應涵蓋的時間型媒體開始和結束位置,向輔助程式要求DownloadRequest
。傳回的DownloadRequest
包含已解析的位元組範圍,可用於建立ProgressiveDownloader
並下載相應內容。 - 新增
DownloadHelper.Factory
,取代靜態DownloadHelper.forMediaItem()
方法。 - 為
SegmentDownloader
實作項目新增Factory
。 - 新增對自適應串流的部分下載支援。應用程式可以使用
DownloadHelper
準備自適應串流,並向輔助程式要求DownloadRequest
,同時指定下載內容應涵蓋的媒體開始和結束時間位置。傳回的DownloadRequest
會攜帶已解析的時間範圍,藉此建立具體的SegmentDownloader
,並下載相應內容。
- 為漸進式串流新增部分下載支援。應用程式可以使用
- HLS 擴充功能:
- 支援 X-ASSET-LIST 和直播,並使用
HlsInterstitialsAdsLoader
。
- 支援 X-ASSET-LIST 和直播,並使用
- RTSP 擴充功能:
- 新增剖析支援功能,可剖析含有尾端空白字元的行 (#2357)。
- Cast 擴充功能:
- 新增對
getDeviceVolume()
、setDeviceVolume()
、getDeviceMuted()
和setDeviceMuted()
的支援 (#2089)。
- 新增對
- 測試公用程式:
- 已移除
transformer.TestUtil.addAudioDecoders(String...)
、transformer.TestUtil.addAudioEncoders(String...)
和transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)
。請改用ShadowMediaCodecConfig
設定陰影編碼器和解碼器。 - 在
ShadowMediaCodecConfig
回報的轉碼器名稱中,將「exotest」前置字元替換為「media3」。
- 已移除
- 移除已淘汰的符號:
- 移除了已淘汰的
SegmentDownloader
建構函式SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)
,以及子類別DashDownloader
、HlsDownloader
和SsDownloader
中的對應建構函式。 - 已移除已淘汰的
Player.hasNext()
、Player.hasNextWindow()
。請改用Player.hasNextMediaItem()
。 - 已移除已淘汰的
Player.next()
。改用Player.seekToNextMediaItem()
。 - 已移除已淘汰的
Player.seekToPreviousWindow()
。改用Player.seekToPreviousMediaItem()
。 - 已移除已淘汰的
Player.seekToNextWindow()
。改用Player.seekToNextMediaItem()
。 - 已移除
exoplayer
模組中已淘汰的BaseAudioProcessor
。使用common
模組下的BaseAudioProcessor
。 - 移除已淘汰的
MediaCodecVideoRenderer
建構函式MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)
。
- 移除了已淘汰的
1.7.0 版
1.7.1 版
2025 年 5 月 16 日
這個版本與 1.6.1 版的程式碼相同,發布這個版本是為了確保它會顯示為「較新」的版本,而非 1.7.0 版。1.7.0 版是誤標為穩定版的 Alpha 版 (詳情請參閱下文)。
1.7.0 版
2025 年 5 月 16 日
這個版本應為 1.7.0-alpha01
,但 maven.google.com 誤標為 1.7.0
(即穩定版)。請勿使用這個版本。繼續使用 1.6.1 版,或升級至 1.7.1 版 (程式碼與 1.6.1 版相同)。
1.6.0 版
1.6.1
2025 年 4 月 14 日
發布了 androidx.media3:media3-*:1.6.1
。1.6.1 版包含這些修訂項目。
- 通用程式庫:
- 新增
PlaybackParameters.withPitch(float)
方法,方便使用新的pitch
值複製PlaybackParameters
(#2257)。
- 新增
- ExoPlayer:
- 修正問題:由於初始化下一個媒體項目時發生可復原的轉譯器錯誤,導致媒體項目轉場失敗 (#2229)。
- 修正問題:
PreloadMediaSource
嘗試呼叫getBufferedDurationUs()
前,ProgressiveMediaPeriod
會擲回IllegalStateException
(#2315)。 - 修正傳送
CmcdData
至 DASH、HLS 和 SmoothStreaming 的資訊清單要求 (#2253)。 - 確認移除廣告群組後,
AdPlaybackState.withAdDurationsUs(long[][])
仍可使用。使用者仍須傳遞已移除廣告群組的持續時間陣列,該陣列可以空白或為空值 (#2267)。
- 擷取工具:
- MP4:從
tkhd
方格中剖析alternate_group
,並在每個軌道的Format.metadata
中將其公開為Mp4AlternateGroupData
項目 (#2242)。
- MP4:從
- 音訊:
- 修正卸載問題,播放短片播放清單時,位置可能會停滯 (#1920)。
- 工作階段:
- 將平台
MediaSession
回呼的匯總逾時時間從 500 毫秒縮短為 100 毫秒,並新增實驗性設定器,允許應用程式設定這個值。 - 修正使用者關閉通知後,通知會再次顯示的問題 (#2302)。
- 修正錯誤:當包裝播放器實際為空時,工作階段會傳回單一項目時間軸。如果封裝的播放器沒有可用的
COMMAND_GET_TIMELINE
,但COMMAND_GET_CURRENT_MEDIA_ITEM
可用,且封裝的播放器為空白,就會發生這種情況 (#2320)。 - 修正錯誤:在與服務進行其他互動 (例如
setForegroundServiceTimeoutMs
) 後,系統會無聲無息地忽略呼叫MediaSessionService.setMediaNotificationProvider
的要求 (#2305)。
- 將平台
- UI:
- 啟用
PlayerSurface
,以便與ExoPlayer.setVideoEffects
和CompositionPlayer
搭配使用。 - 修正
PlayerSurface
無法使用新的Player
重新組合的錯誤。
- 啟用
- HLS 擴充功能:
- 修正問題:
CmcdData
未針對 HLS 媒體設定區塊時間長度,導致處理加密媒體區段時發生斷言失敗 (#2312)。
- 修正問題:
- RTSP 擴充功能:
- 新增對採用 RTSPT 配置欄位的 URI 的支援,以便將 RTSP 工作階段設定為使用 TCP (#1484)。
- Cast 擴充功能:
- 新增播放清單中繼資料支援 (#2235)。
1.6.0
2025 年 3 月 26 日
發布了 androidx.media3:media3-*:1.6.0
。1.6.0 版包含這些修訂項目。
- 通用程式庫:
- 新增
AudioManagerCompat
和AudioFocusRequestCompat
,取代androidx.media
中的對等類別。 - 將 Kotlin 從 1.9.20 升級至 2.0.20,並使用 Compose 編譯器 Gradle 外掛程式。將 KotlinX Coroutines 程式庫從 1.8.1 升級至 1.9.0。
- 移除
Format.toBundle(boolean excludeMetadata)
方法,改用Format.toBundle()
。 - 修正
SimpleBasePlayer
中的錯誤:在setPlaylist
之後,於State
中設定新的currentMediaItemIndex
(使用null
MediaMetadata
) 時,不會重新評估中繼資料 (#1940)。 - 將
SimpleBasePlayer.State
存取權從受保護變更為公開,方便在其他類別中處理更新 (#2128)。
- 新增
- ExoPlayer:
- 新增
MediaExtractorCompat
,這個新類別提供的功能與平台MediaExtractor
相同。 - 為使用
MediaCodecVideoRenderer
播放新增實驗性「ExoPlayer」預先暖機支援。您可以透過experimentalSetEnableMediaCodecVideoRendererPrewarming
設定DefaultRenderersFactory
,提供次要MediaCodecVideoRenderer
給ExoPlayer
。如果啟用這項功能,系統會在播放連續媒體項目時ExoPlayer
預先處理影片,以縮短媒體項目轉場延遲時間。 - 將
DefaultLoadControl
中bufferForPlaybackMs
和bufferForPlaybackAfterRebufferMs
的預設值分別調降為 1000 和 2000 毫秒。 - 非同步初始化
DeviceInfo
和裝置音量 (如果使用setDeviceVolumeControlEnabled
啟用)。這些值在ExoPlayer.Builder.build()
後不會立即提供,Player.Listener
會透過onDeviceInfoChanged
和onDeviceVolumeChanged
通知變更。 - 建立播放器後,初始音訊工作階段 ID 不再立即提供。如有需要,可以使用
AnalyticsListener.onAudioSessionIdChanged
聆聽初始更新內容。 - 選取影片軌時,請考慮語言。根據預設,系統會選取與所選音軌語言相符的「主要」影片軌 (如有)。如要明確指定影片語言偏好設定,請使用
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
。 - 在
DefaultTrackSelector.selectVideoTrack()
方法中新增selectedAudioLanguage
參數。 - 在
MediaSourceEventListener.onLoadStarted
中新增retryCount
參數和對應的MediaSourceEventListener.EventDispatcher
方法。 - 修正錯誤:如果多個週期的 DASH 串流中的播放清單項目或週期長度與實際內容不符,可能會導致項目結尾發生畫面凍結情形 (#1698)。
- 將
BasePreloadManager.Listener
移至頂層PreloadManagerListener
。 RenderersFactory.createSecondaryRenderer
可實作來提供預先暖機的次要算繪器。預先暖機可加快媒體項目在播放期間的轉換速度。- 啟用傳送
CmcdData
,以用於自動調整串流格式 (DASH、HLS 和 SmoothStreaming) 的資訊清單要求 (#1951)。 - 提供要在
MediaCodecRenderer.onReadyToInitializeCodec
中初始化的轉碼器MediaCodecInfo
(#1963)。 - 將
AdsMediaSource
改為允許AdPlaybackStates
透過附加廣告群組來擴增。系統偵測到無效的修改,並擲回例外狀況。 - 修正問題:在片中廣告後轉換至內容媒體時,可能會快速連續顯示額外的僅解碼影格。
- 請讓
DefaultRenderersFactory
新增兩個MetadataRenderer
例項,以便應用程式預設接收兩種不同的中繼資料架構。 - 重新評估是否應在暫停播放時取消載入區塊 (#1785)。
- 新增
ClippingMediaSource
選項,允許在無法搜尋的媒體中裁剪。 - 修正錯誤:使用預先暖機功能搜尋時,可能會封鎖後續媒體項目轉場效果。
- 修正
ExoPlayer.isLoading()
轉換為STATE_IDLE
或STATE_ENDED
時,仍維持true
的錯誤 (#2133)。 - 將
lastRebufferRealtimeMs
新增至LoadControl.Parameter
(#2113)。
- 新增
- 轉換程式:
- 新增支援轉封裝為可回溯相容的替代格式。
- 新增支援轉碼和轉封裝 Dolby Vision (設定檔 8) 格式。
- 更新
VideoFrameProcessor.registerInputStream
和VideoFrameProcessor.Listener.onInputStreamRegistered
的參數,以使用Format
。 - 使用
DefaultEncoderFactory
時,請產生 HDR 靜態中繼資料。 - 使用
MediaMetricsManager
啟用 Android 平台診斷支援功能。Transformer 會向平台轉送編輯事件和效能資料,有助於在裝置提供系統效能與偵錯資訊。如果裝置使用者已啟用分享使用狀況與診斷資料功能,則 Google 也可能會收集以上資料。您可以透過Transformer.Builder.setUsePlatformDiagnostics(false)
,讓應用程式選擇不採用 Transformer 的平台診斷貢獻功能。 - 將
InAppMuxer
分割為InAppMp4Muxer
和InAppFragmentedMp4Muxer
。 您可以使用InAppMp4Muxer
產生非片段化 MP4 檔案,而InAppFragmentedMp4Muxer
則用於產生片段化 MP4 檔案。 - 將
Muxer
介面從media3-muxer
移至media3-transformer
。 - 新增
MediaProjectionAssetLoader
,從MediaProjection
提供媒體,用於螢幕錄影,並在 Transformer 試用版應用程式中新增螢幕錄影支援功能。 - 將
#getInputFormat()
新增至Codec
介面。 - 盡可能將釋出
GlObjectsProvider
的責任轉移至DefaultVideoFrameProcessor
和DefaultVideoCompositor
中的呼叫端。
- 擷取工具:
- AVI:修正處理含有固定位元率壓縮音訊的檔案時,串流標頭儲存位元組數而非區塊數的問題。
- 修正以 1 或 2 個位元組 (而非 4 個) 表示長度的 NAL 單元處理方式。
- 修正 MP4 編輯清單中的
ArrayIndexOutOfBoundsException
,當編輯清單從非同步影格開始,且沒有前一個同步影格時 (#2062)。 - 修正部分裝置上 TS 串流可能會停滯的問題 (#2069)。
- FLAC:新增 32 位元 FLAC 檔案支援。先前這些項目無法使用
IllegalStateException: Playback stuck buffering and not loading
播放 (#2197)。
- 音訊:
- 修正
onAudioPositionAdvancing
,在播放作業繼續時呼叫 (先前是在播放作業暫停時呼叫)。 - 如果
SpeedChangingAudioProcessor
設定為預設參數,請勿略過SonicAudioProcessor
。 - 修正
Sonic#getOutputSize()
中的下溢問題,避免DefaultAudioSink
停滯。 - 修正
MediaCodecAudioRenderer.getDurationToProgressUs()
和DecoderAudioRenderer.getDurationToProgressUs()
,讓搜尋作業正確重設提供的時間長度。 - 將
androidx.media3.common.audio.SonicAudioProcessor
設為最終版本。 - 在
ChannelMappingAudioProcessor
和TrimmingAudioProcessor
中新增對浮點 PCM 的支援。
- 修正
- 影片:
- 將
MediaCodecVideoRenderer.shouldUsePlaceholderSurface
變更為 受保護,以便應用程式覆寫,封鎖預留位置介面的使用情形 (#1905)。 - 新增實驗性
ExoPlayer
AV1 樣本依附元件剖析,加快搜尋速度。使用新的DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies
API 啟用這項功能。 - 新增實驗性
ExoPlayer
API,可捨棄不依附的延遲MediaCodecVideoRenderer
解碼器輸入緩衝區。使用DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs
啟用。 - 修正沒有介面的播放器會立即就緒,並以極慢的速度解碼任何待處理影格的問題 (#1973)。
- 從卸除式介面模式排除 Xiaomi 和 OPPO 裝置,避免螢幕閃爍 (#2059)。
- 將
- 文字:
- 新增 VobSub 字幕支援 (#8260)。
- 停止使用
MediaItem.Builder.setSubtitleConfigurations
預先載入所有設定的字幕檔,改為只載入所選音軌的字幕檔 (#1721)。 - TTML:新增使用
style
參照tts:origin
和tts:extent
的支援 (#2953)。 - 將 WebVTT 和 SubRip 時間戳記限制為精確到小數點後 3 位。 先前我們錯誤地剖析了任意數量的小數位數,但一律假設值是以毫秒為單位,導致時間戳記錯誤 (#1997)。
- 修正播放清單包含 CEA-608 或 CEA-708 字幕的剪輯項目時,播放作業停止的問題。
- 修正 SSA 檔案包含時間長度為零的提示 (開始和結束時間相同) 時的
IllegalStateException
(#2052)。 - 將字幕多工處理至與音訊和視訊相同的容器時,抑制 (並記錄) 字幕剖析錯誤 (#2052)。
- 修正使用 CR 行尾的 WebVTT 檔案中,多位元組 UTF-8 字元的處理方式 (#2167)。
- DRM:
- 修正在 API 低於 27 的裝置上播放 ClearKey 內容時發生的
MediaCodec$CryptoException: Operation not supported in this configuration
錯誤 (#1732)。
- 修正在 API 低於 27 的裝置上播放 ClearKey 內容時發生的
- 效果:
- 已將
OverlaySettings
的功能移至StaticOverlaySettings
。OverlaySettings
可以設為子類別,以允許動態疊加設定。
- 已將
- Muxers:
- 將
MuxerException
移出Muxer
介面,避免出現過長的完整名稱。 - 在
Mp4Muxer.Builder
和FragmentedMp4Muxer.Builder
中,已將setSampleCopyEnabled()
方法重新命名為setSampleCopyingEnabled()
。 Mp4Muxer.addTrack()
和FragmentedMp4Muxer.addTrack()
現在會傳回int
軌道 ID,而不是TrackToken
。Mp4Muxer
和FragmentedMp4Muxer
不再實作Muxer
介面。- 預設停用
Mp4Muxer
樣本批次處理和複製功能。 - 修正
FragmentedMp4Muxer
中的錯誤,這個錯誤會在只寫入音軌時建立大量片段。
- 將
- 工作階段:
- 當播放暫停、停止或失敗時,額外保留前景服務狀態 10 分鐘。這樣一來,使用者就能在逾時前繼續播放內容,而不必擔心各種裝置的前景服務限制。請注意,覆寫
onTaskRemoved
時,您無法再使用呼叫player.pause()
的方式,在stopSelf()
前停止前景服務,請改用MediaSessionService.pauseAllPlayersAndStopSelf()
。 - 當播放進入錯誤或停止狀態時,請保持通知顯示。只有在清除播放清單或釋出播放器時,系統才會移除通知。
- 改善 Android 平台 MediaSession 動作 ACTION_PLAY 和 ACTION_PAUSE 的處理方式,只根據可用指令設定其中一個動作,並接受只設定其中一個動作的情況。
- 將
Context
新增為MediaButtonReceiver.shouldStartForegroundService
的參數 (#1887)。 - 修正錯誤:在連線至舊版工作階段的
MediaController
上呼叫Player
方法時,系統會捨棄待處理更新中的變更。 - 讓
MediaSession.setSessionActivity(PendingIntent)
接受空值 (#2109)。 - 修正播放清單清除後,過時通知仍會顯示的錯誤 (#2211)。
- 當播放暫停、停止或失敗時,額外保留前景服務狀態 10 分鐘。這樣一來,使用者就能在逾時前繼續播放內容,而不必擔心各種裝置的前景服務限制。請注意,覆寫
- UI:
- 將狀態持有者和可組合函式新增至
media3-ui-compose
模組,適用於PlayerSurface
、PresentationState
、PlayPauseButtonState
、NextButtonState
、PreviousButtonState
、RepeatButtonState
、ShuffleButtonState
和PlaybackSpeedState
。
- 將狀態持有者和可組合函式新增至
- 下載內容:
- 修正
CacheWriter
中的錯誤,避免資料來源擲回IOException
以外的Exception
時,資料來源保持開啟,且快取區域處於鎖定狀態 (#9760)。
- 修正
- HLS 擴充功能:
- 新增
HlsInterstitialsAdsLoader
的第一個版本。廣告載入器會讀取 HLS 媒體播放清單的 HLS 插頁式廣告,並將這些廣告對應至傳遞至AdsMediaSource
的AdPlaybackState
。這個初始版本僅支援具有X-ASSET-URI
屬性的 HLS VOD 串流。 - 新增
HlsInterstitialsAdsLoader.AdsMediaSourceFactory
。應用程式可以使用這項功能建立AdsMediaSource
例項,以便利安全的方式使用HlsInterstitialsAdsLoader
。 - 從 HLS 播放清單剖析
SUPPLEMENTAL-CODECS
標記,偵測 Dolby Vision 格式 (#1785)。 - 放寬在 HLS 串流中搜尋同步位置的條件 (#2209)。
- 新增
- DASH 擴充功能:
- 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
- 新增 MPEG-H 解碼器模組,使用內建的 MPEG-H 解碼器解碼 MPEG-H 音訊 (#1826)。
- MIDI 擴充功能:
- 將自訂
AudioSink
和AudioRendererEventListener
執行個體導入MidiRenderer
。
- 將自訂
- Cast 擴充功能:
- 將
play-services-cast-framework
依附元件升級至 21.5.0,修正應用程式在 API 34 以上版本中發生的FLAG_MUTABLE
錯誤。這些應用程式會安裝在已安裝 Google Play 服務但已停用的裝置上 (#2178)。
- 將
- 試用版應用程式:
- 擴充
demo-compose
的功能,新增其他按鈕,並透過縮放和快門支援功能,提升PlayerSurface
的整合度。
- 擴充
- 移除已淘汰的符號:
- 移除已淘汰的
AudioMixer.create()
方法。改用DefaultAudioMixer.Factory().create()
。 - 移除下列已淘汰的
Transformer.Builder
方法:setTransformationRequest()
,請改用setAudioMimeType()
、setVideoMimeType()
和setHdrMode()
。setAudioProcessors()
,請在EditedMediaItem.Builder.setEffects()
中設定音訊處理器,然後傳遞至Transformer.start()
。setVideoEffects()
,在EditedMediaItem.Builder.setEffects()
中設定影片效果,然後傳遞至Transformer.start()
。setRemoveAudio()
,請改用EditedMediaItem.Builder.setRemoveAudio()
從傳遞至EditedMediaItem
的Transformer.start()
中移除音訊。setRemoveVideo()
,請改用EditedMediaItem.Builder.setRemoveVideo()
從傳遞至Transformer.start()
的EditedMediaItem
中移除影片。- 請改用
EditedMediaItem.Builder.setFlattenForSlowMotion()
,將傳遞至Transformer.start()
的EditedMediaItem
扁平化。setFlattenForSlowMotion()
setListener()
,請改用addListener()
、removeListener()
或removeAllListeners()
。
- 移除下列已淘汰的
Transformer.Listener
方法:onTransformationCompleted(MediaItem)
,請改用onCompleted(Composition, ExportResult)
。onTransformationCompleted(MediaItem, TransformationResult)
,請改用onCompleted(Composition, ExportResult)
。onTransformationError(MediaItem, Exception)
,請改用onError(Composition, ExportResult, ExportException)
。onTransformationError(MediaItem, TransformationException)
,請改用onError(Composition, ExportResult, ExportException)
。onTransformationError(MediaItem, TransformationResult, TransformationException)
,請改用onError(Composition, ExportResult, ExportException)
。onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)
,請改用onFallbackApplied(Composition, TransformationRequest, TransformationRequest)
。
- 移除已淘汰的
TransformationResult
類別。改用ExportResult
。 - 移除已淘汰的
TransformationException
類別。改用ExportException
。 - 移除已淘汰的
Transformer.PROGRESS_STATE_NO_TRANSFORMATION
。改用Transformer.PROGRESS_STATE_NOT_STARTED
。 - 移除已淘汰的
Transformer.setListener()
。請改用Transformer.addListener()
、Transformer.removeListener()
或Transformer.removeAllListeners()
。 - 移除已淘汰的
Transformer.startTransformation()
。改用Transformer.start(MediaItem, String)
。 - 移除已淘汰的
SingleFrameGlShaderProgram
。改用BaseGlShaderProgram
。 - 移除
Transformer.flattenForSlowMotion
。改用EditedMediaItem.flattenForSlowMotion
。 - 已移除
ExoPlayer.VideoComponent
、ExoPlayer.AudioComponent
、ExoPlayer.TextComponent
和ExoPlayer.DeviceComponent
。 - 已移除
androidx.media3.exoplayer.audio.SonicAudioProcessor
。 - 移除了下列已淘汰的
DownloadHelper
方法:- 建構函式
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[])
,請改用DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)
。 - 不過,您可以建立含有
RenderersFactory
的DefaultRendererCapabilitiesList
,並呼叫DefaultRendererCapabilitiesList.getRendererCapabilities()
,達到相同的功能。getRendererCapabilities(RenderersFactory)
- 建構函式
- 已移除
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)
方法。請改用PlayerNotificationManager.setMediaSessionToken(MediaSession.Token)
並傳遞(MediaSession.Token) compatToken.getToken()
。
- 移除已淘汰的
1.6.0-rc02
2025 年 3 月 19 日
使用 1.6.0 穩定版。
1.6.0-rc01
2025 年 3 月 12 日
使用 1.6.0 穩定版。
1.6.0-beta01
2025 年 2 月 26 日
使用 1.6.0 穩定版。
1.6.0-alpha03 版本
2025 年 2 月 6 日
使用 1.6.0 穩定版。
1.6.0-alpha02 版本
2025 年 1 月 30 日
使用 1.6.0 穩定版。
1.6.0-alpha01 版本
2024 年 12 月 20 日
使用 1.6.0 穩定版。
1.5 版本
1.5.1 版本
2024 年 12 月 19 日
發布了 androidx.media3:media3-*:1.5.1
。1.5.1 版包含這些修訂項目。
- ExoPlayer:
- 停用 MediaCodec 中的非同步解密功能,避免發生這項平台 API 回報的轉碼器逾時問題 (#1641)。
- 擷取工具:
- MP3:如果
VBRI
影格的目錄未涵蓋檔案中的所有 MP3 資料,請勿提早停止播放 (#1904)。
- MP3:如果
- 影片:
- 回溯使用處理
onOutputFormatChanged
時提供的MediaCodecAdapter
像素顯示比例值 (#1371)。
- 回溯使用處理
- 文字:
- 修正
ReplacingCuesResolver.discardCuesBeforeTimeUs
中的錯誤,該錯誤會導致系統錯誤捨棄在timeUs
處處於啟用狀態的提示 (開始時間早於timeUs
,但尚未結束) (#1939)。
- 修正
- 中繼資料:
- 從 Vorbis 註解將光碟/曲目編號和類型擷取至
MediaMetadata
(#1958)。
- 從 Vorbis 註解將光碟/曲目編號和類型擷取至
1.5.0 版本
2024 年 11 月 27 日
發布了 androidx.media3:media3-*:1.5.0
。1.5.0 版包含這些修訂項目。
- 通用程式庫:
- 新增
ForwardingSimpleBasePlayer
,允許轉送至其他播放器,同時確保完整一致性及監聽器處理作業 (#1183)。 - 將
SimpleBasePlayer.State.playlist
替換為getPlaylist()
方法。 - 為
SimpleBasePlayer.State.Builder.setPlaylist()
新增覆寫,直接指定Timeline
和目前的Tracks
和Metadata
,而非建構播放清單結構。 - 將
minSdk
提高至 21 (Android Lollipop)。這與所有其他 AndroidX 程式庫一致。 - 新增
androidx.media3:media3-common-ktx
構件,提供以 Common 程式庫為基礎建構的 Kotlin 專用功能 - 將
Player.listen
暫停擴充功能函式新增至media3-common-ktx
程式庫,以啟動協同程式來監聽Player.Events
。 - 從手動內嵌的內部類別中移除
@DoNotInline
註解,避免執行階段類別驗證失敗。現在,新版 R8 會自動將這類呼叫作業移出內嵌,避免執行階段失敗 (因此不再需要手動移出內嵌)。由於compileSdk = 35
,程式庫的所有 Gradle 使用者都必須使用 Android Gradle 外掛程式版本,該版本會使用執行這項作業的 R8 版本。如果程式庫使用者採用非 Gradle 建構系統,則必須確保 R8 等效的縮減/模糊化步驟會執行類似的自動內嵌程序,以免發生執行階段類別驗證失敗的情況。這項變更已在其他 AndroidX 程式庫中完成。
- 新增
- ExoPlayer:
- 現在可以為每個媒體項目呼叫
MediaCodecRenderer.onProcessedStreamChange()
。先前系統不會為第一個呼叫執行此作業。如要啟用這項功能,請使用MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
。 - 新增
PreloadMediaSource.PreloadControl.onPreloadError
,允許PreloadMediaSource.PreloadControl
實作在發生錯誤時採取行動。 - 新增
BasePreloadManager.Listener
,將預先載入事件傳播至應用程式。 - 允許變更 SNTP 用戶端逾時時間,並在逾時時重試替代位址 (#1540)。
- 移除
MediaCodecAdapter.Configuration.flags
,因為該欄位一律為零。 - 允許使用者在 Wear OS API 35 以上版本中選取內建喇叭進行播放 (裝置會宣傳支援這項功能)。
- 將封鎖呼叫延至
Context.getSystemService(Context.AUDIO_SERVICE)
,直到音訊焦點處理功能啟用為止。這樣可確保在未啟用音訊焦點處理功能時,不會進行封鎖呼叫 (#1616)。 - 載入失敗時,允許播放,不論緩衝時間長度為何 (#1571)。
- 新增
AnalyticsListener.onRendererReadyChanged()
,在個別算繪器允許播放時傳送信號。 - 修正
MediaCodec.CryptoException
有時會在MediaCodec
以非同步模式運作時 (API 31 以上的預設行為) 回報為「執行階段發生未預期的錯誤」的問題。 - 使用
PreloadMediaSource.PreloadControl.onContinueLoadingRequested()
傳遞bufferedDurationUs
,而非bufferedPositionUs
。此外,應用程式也將DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
變更為DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
,因此應用程式必須傳遞代表特定時間長度的值 (從預設開始位置起算),對應的媒體來源必須使用這個 IntDef 預先載入,而非位置。 - 新增
ForwardingRenderer
實作,將所有方法呼叫轉送至另一個算繪器 (1703)。 - 為播放清單中的下一個項目新增播放清單預先載入功能。應用程式可以呼叫
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
,據此啟用預先載入功能。預先載入功能預設為停用。啟用這項功能後,為避免干擾播放作業,DefaultLoadControl
會限制預先載入作業,只在播放器未載入播放內容時啟動及繼續預先載入。應用程式可以實作LoadControl.shouldContinuePreloading()
,藉此變更這項行為 (例如在DefaultLoadControl
中覆寫這個方法時)。如果應用程式使用LoadControl
的自訂實作方式,LoadControl
的預設實作方式會停用預先載入功能。 - 新增方法
MediaSourceEventListener.EventDispatcher.dispatchEvent()
,允許叫用子類別監聽器的事件 (1736)。 - 新增
DefaultPreloadManager.Builder
,以建構DefaultPreloadManager
和ExoPlayer
執行個體,並保持共用設定一致。 - 從
LoadControl.onTracksSelected()
移除Renderer[]
參數,因為DefaultLoadControl
實作可以從ExoTrackSelection[]
擷取串流類型。 - 已淘汰
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
,並將方法標記為最終方法,避免遭到覆寫。請改用新的DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
。 - 在
MergingMediaSource
中回報次要來源的MediaSourceEventListener
事件。這會導致系統回報側載字幕 (使用MediaItem.LocalConfiguration.subtitleConfigurations
新增的字幕) 的載入開始/錯誤/取消/完成事件,這些事件可能會顯示為AnalyticsListener
發出的重複載入事件。 - 避免字幕和中繼資料錯誤完全停止播放。
系統會改為停用有問題的音軌,並繼續播放其餘音軌 (#1722)。
- 在新的字幕處理程序 (擷取期間),相關聯的剖析 (例如無效的字幕資料) 和載入錯誤 (例如 HTTP 404) 會透過
onLoadError
回呼發出。 - 在舊版字幕處理作業 (轉譯期間),只有相關聯的載入錯誤會透過
onLoadError
回呼發出,而剖析錯誤則會遭到忽略 (這是先前就有的行為)。
- 在新的字幕處理程序 (擷取期間),相關聯的剖析 (例如無效的字幕資料) 和載入錯誤 (例如 HTTP 404) 會透過
- 修正錯誤:如果多個週期的 DASH 串流中的播放清單項目或週期長度與實際內容不符,可能會導致項目結尾發生畫面凍結情形 (#1698)。
- 在
SntpClient
中新增 setter,設定自上次更新後經過的最長時間,超過這個時間後,用戶端會重新初始化 (#1794)。
- 現在可以為每個媒體項目呼叫
- 轉換程式:
- 新增
SurfaceAssetLoader
,支援透過Surface
將影片資料加入 Transformer 的佇列。 ImageAssetLoader
會透過AssetLoader.onError
回報不支援的輸入內容,而不是擲回IllegalStateException
。- 強制規定匯出圖片時,必須使用
MediaItem.Builder.setImageDurationMs
設定圖片顯示時間。 - 新增對音訊 EditedMediaItem 序列中間隔的匯出支援。
- 新增
- 音軌選取:
DefaultTrackSelector
:在其他因素相同的情況下,請優先使用物件式音訊,而非聲道式音訊。
- 擷取工具:
- 允許
Mp4Extractor
和FragmentedMp4Extractor
識別後續樣本未做為參照的 H264 樣本。 - 在
AmrExtractor
中新增選項,啟用以索引為準的搜尋功能。 - 將有效影格之間超過 128 KB 的 MP3 檔案視為截斷 (而非無效)。也就是說,如果檔案結尾有非 MP3 資料,且沒有其他中繼資料指出 MP3 位元組的長度,現在系統會在 MP3 資料結尾停止播放,而不是因
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
(#1563) 而失敗。 - 修正處理 MP4 檔案中的編輯清單時,非關鍵影格媒體開始位置的預先捲動範例處理方式 (#1659)。
- 使用
Mp4Extractor
和FragmentedMp4Extractor
中的mdhd
媒體時間長度,改善影格速率計算方式 (#1531)。 - 修正 MP4 編輯清單中
media_time
的縮放比例有誤問題。雖然segment_duration
已使用影片時間碼正確縮放,但現在media_time
會使用軌道時間碼正確縮放,如 MP4 格式標準所指定 (#1792)。 - 在 MP4 編輯清單的
endIndices
計算中處理順序錯誤的影格 (#1797)。 - 修正 MP4 檔案
mdhd
方塊中的媒體時間長度剖析作業,以處理-1
值 (#1819)。 - 新增支援功能,可識別 MP4 檔案中的
h263
方塊,以用於 H.263 影片 (#1821)。 - 新增 AC-4 Level-4 ISO 基礎媒體檔案格式支援 (#1265)。
- 允許
- DataSource:
- 更新
HttpEngineDataSource
,允許從 S 版本擴充功能 7 開始使用,而非 API 級別 34 (#1262)。 DataSourceContractTest
:確認DataSource.getUri()
會傳回已解析的 URI (如文件所述)。如果這與要求的 URI 不同,測試可以使用新的DataSourceContractTest.TestResource.Builder.setResolvedUri()
方法指出這一點。DataSourceContractTest
:在對open()
的呼叫失敗 (因資源「找不到」) 後,以及後續的close()
呼叫之前,判斷DataSource.getUri()
和getResponseHeaders()
是否會傳回「開啟」值。- 覆寫
DataSourceContractTest.getNotFoundResources()
可讓測試子類別提供多個「找不到」資源,以及任何預期標頭。這樣就能區分 HTTP 404 (含標頭) 和「找不到伺服器」(不含標頭)。
- 覆寫
- 更新
- 音訊:
- 如果媒體中含有 CTA-2075 音量中繼資料,系統會自動在轉碼器上設定這項資料。
- 確保搜尋時音量能平順調降。
- 修正搜尋時可能發生的爆音。
- 修正 Sonic 時間延展/音高轉移演算法的截斷錯誤累積問題。
- 修正
SpeedChangingAudioProcessor
中的錯誤,避免輸出畫面格數減少。
- 影片:
MediaCodecVideoRenderer
避免解碼既未算繪,也未做為其他樣本參考的樣本。- 在 API 35 以上版本中,
MediaCodecAdapter
現在可能會在configure
中收到null
Surface
,並呼叫新方法detachOutputSurface
,以便在轉碼器支援時 (MediaCodecInfo.detachedSurfaceSupported
) 移除先前設定的Surface
。 - 如果處理
onOutputFormatChanged
時提供像素顯示比例值,請使用MediaCodecAdapter
(#1371)。 - 針對 Galaxy Tab S7 FE 裝置問題新增權變措施,該問題會導致 60 fps 安全 H264 串流標示為不支援 (#1619)。
- 新增解決方法,避免編解碼器在最後一個樣本後停滯,且未傳回串流結尾信號。
- 文字:
- 新增自訂
VoiceSpan
,並填入 WebVTT 語音跨度 (#1632)。 - 確保 HLS 中的 WebVTT 顯示字幕時間戳記過大的情況 (以微秒表示並乘以
90,000
MPEG 時基時,會溢位 64 位元long
) (#1763)。 - 支援 Dolby Vision 內容中的 CEA-608 字幕 (#1820)。
- 修正啟用 CEA-608 字幕時,DASH 多週期串流播放會停止的問題 (#1863)。
- 新增自訂
- 中繼資料:
- 將
C.TRACK_TYPE_METADATA
類型指派給含有 icy 或 vnd.dvb.ait 內容的曲目。
- 將
- 圖片:
- 加入
ExternallyLoadedImageDecoder
,簡化與 Glide 或 Coil 等外部圖片載入程式庫的整合。
- 加入
- DataSource:
- 新增
FileDescriptorDataSource
,這個新DataSource
可用於從FileDescriptor
讀取資料 (#3757)。
- 新增
- 效果:
- 新增
DefaultVideoFrameProcessor
解決方法,以解決SurfaceTexture
縮放比例略有差異的問題。SurfaceTexture
可能會包含小幅縮放,以剪除裁剪緩衝區邊緣周圍的 1 個紋素邊框。現在已處理完畢,輸出內容更接近預期結果。 - 加快
DefaultVideoFrameProcessor.queueInputBitmap()
。因此,使用Transformer
將圖片匯出為影片的速度更快。
- 新增
- IMA 擴充功能:
- 修正錯誤:清除播放清單時,可能會導致
ArrayIndexOutOfBoundsException
發生ImaServerSideAdInsertionMediaSource
。 - 修正錯誤:如果伺服器端插入的 DAI 串流沒有前置廣告,在播放最後一個片中廣告後可能會導致
ArrayIndexOutOfBoundsException
(#1741)。
- 修正錯誤:清除播放清單時,可能會導致
- 工作階段:
- 新增
MediaButtonReceiver.shouldStartForegroundService(Intent)
,允許應用程式覆寫這個方法,藉此禁止系統在恢復播放時發出播放指令。根據預設,服務一律會啟動,且系統會透過ForegroundServiceDidNotStartInTimeException
(#1528) 讓服務當機,因此無法抑制播放。 - 修正錯誤:連線至舊版服務時,從
MediaBrowser
傳送的自訂指令會分派至MediaSessionCompat.Callback
,而非MediaBrowserServiceCompat
方法變數。這會導致MediaBrowser
無法接收舊版服務傳回的實際回傳值 (#1474)。 - 處理特定製造商的裝置在為媒體按鈕意圖設定廣播接收器時擲回的
IllegalArgumentException
(#1730)。 - 為媒體項目新增指令按鈕。這會新增 Media3 API,適用於先前稱為
Custom browse actions
的項目,以及具有MediaBrowserCompat
的舊版程式庫。請注意,媒體項目的 Media3 指令按鈕適用於MediaBrowser
和MediaController
。請參閱「AAOS 的自訂瀏覽動作」。 - 修正錯誤:有時 Media3 控制器無法在要求
play()
後,讓工作階段應用程式啟動前景服務。 - 限制
CommandButton.Builder.setIconUri
只能接受內容 URI。 - 將 Media3 瀏覽器的連線提示傳遞至初始
MediaBrowserCompat
,以便連線至舊版MediaBrowserCompat
。服務可以接收以根提示形式傳入的連線提示,並首次呼叫onGetRoot()
。 - 修正錯誤:
MediaBrowser
連線至舊版瀏覽器服務後,瀏覽器訂閱parentid
時,MediaBrowser
未收到服務傳送的錯誤。 - 改善互通性行為,讓連線至舊版
MediaBrowserService
的 Media3 瀏覽器在訂閱父項時,不會要求parentId
的子項兩次。
- 新增
- UI:
- 由於 XML 基礎共用轉場效果有問題,請選擇使用
PlayerView
-in-Compose-AndroidView
中的延展/裁剪影片解決方法。在AndroidView
內使用PlayerView
的應用程式需要呼叫PlayerView.setEnableComposeSurfaceSyncWorkaround
,才能選擇加入 (#1237、#1594)。 - 將
setFullscreenButtonState
新增至PlayerView
,允許視需要更新全螢幕按鈕的圖示,也就是頻外更新,而非對點擊互動做出反應 (#1590、#184)。 - 修正錯誤:如有應用程式定義的文字音軌選取偏好設定,文字選取畫面中的「無」選項就無法運作。
- 由於 XML 基礎共用轉場效果有問題,請選擇使用
- DASH 擴充功能:
- 支援從區隔中間開始的週期 (#1440)。
- 流暢串流擴充功能:
- 修正播放含有文字軌的 SmoothStreaming 串流時發生的
Bad magic number for Bundle
錯誤 (#1779)。
- 修正播放含有文字軌的 SmoothStreaming 串流時發生的
- RTSP 擴充功能:
- 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
- 新增 IAMF 解碼器模組,支援使用 libiamf 原生程式庫合成音訊,播放含有 IAMF 音軌的 MP4 檔案。
- 啟用立體聲配置和 5.1 空間化功能,並視需要啟用頭部追蹤功能,即可播放音訊,但目前不支援雙耳播放。
- 在 Android 15 上為解碼器擴充功能新增 16 KB 頁面支援 (#1685)。
- 新增 IAMF 解碼器模組,支援使用 libiamf 原生程式庫合成音訊,播放含有 IAMF 音軌的 MP4 檔案。
- Cast 擴充功能:
- 在 CastSession 中斷連線後停止清除時間軸,讓傳送端應用程式在連線中斷後繼續在本機播放。
- 提供
Context
時,填入 CastPlayer 的DeviceInfo
。這樣就能將MediaSession
連結至RoutingSession
,這是整合輸出切換器時的必要步驟 (#1056)。
- 測試公用程式:
DataSourceContractTest
現在包含驗證下列項目的測試:- 輸入串流
read position
已更新。 - 輸出緩衝區
offset
已正確套用。
- 輸入串流
- 試用版應用程式
- 解決試用版短片應用程式中的記憶體流失問題 (#1839)。
- 移除已淘汰的符號:
- 移除已淘汰的
Player.hasPrevious
、Player.hasPreviousWindow()
。 請改用Player.hasPreviousMediaItem()
。 - 移除已淘汰的
Player.previous()
方法。改用Player.seekToPreviousMediaItem()
。 - 移除已淘汰的
DrmSessionEventListener.onDrmSessionAcquired
方法。 - 移除已淘汰的
DefaultEncoderFactory
建構函式。改用DefaultEncoderFactory.Builder
。
- 移除已淘汰的
1.5.0-rc02 版
2024 年 11 月 19 日
使用 1.5.0 穩定版。
1.5.0-rc01 版
2024 年 11 月 13 日
使用 1.5.0 穩定版。
1.5.0-beta01 版
2024 年 10 月 30 日
使用 1.5.0 穩定版。
1.5.0-alpha01 版本
2024 年 9 月 10 日
使用 1.5.0 穩定版。
1.4.0 版本
1.4.1 版本
2024 年 8 月 27 日
發布了 androidx.media3:media3-*:1.4.1
。1.4.1 版包含這些修訂項目。
- ExoPlayer:
- 擷取工具:
- MP3:根據
Info
影格中的長度欄位,正確忽略尾端非 MP3 資料,修正Searched too many bytes
錯誤 (#1480)。
- MP3:根據
- 文字:
- TTML:修正百分比
tts:fontSize
值的處理方式,確保系統能從含有百分比tts:fontSize
值的父項節點正確沿用這些值。 - 修正
IndexOutOfBoundsException
中的LegacySubtitleUtil
,因為系統錯誤處理要求輸出開始時間大於或等於Subtitle
中最終事件時間的情況 (#1516)。
- TTML:修正百分比
- DRM:
- 修正 API 31 以上版本裝置播放 L1 Widevine 內容時發生的
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
錯誤。這個錯誤是因為架構MediaDrm.requiresSecureDecoder
方法 (#1603) 的實作不完整所致。
- 修正 API 31 以上版本裝置播放 L1 Widevine 內容時發生的
- 效果:
- 將
release()
方法新增至GlObjectsProvider
。
- 將
- 工作階段:
- RTSP 擴充功能:
- 在 SDP 剖析中略過無效的媒體說明 (#1087)。
1.4.0 版本
2024 年 7 月 25 日
發布了 androidx.media3:media3-*:1.4.0
。1.4.0 版包含這些修訂項目。
- 通用程式庫:
- 將預設為無運算的搜尋呼叫轉送至受保護的
BasePlayer.seekTo()
和SimpleBasePlayer.handleSeek()
方法,而非忽略這些呼叫。如果您在自訂播放器中實作這些方法,可能需要使用mediaItemIndex == C.INDEX_UNSET
處理這些額外的呼叫。 - 移除 Java 8 強化版 desugaring 的編譯依附元件 (#1312)。
- 請確認系統會忽略傳遞至非圖片
MediaItem
的MediaItem.Builder.setImageDurationMs()
持續時間 (如文件所述)。 - 新增
Format.customData
,儲存應用程式提供的Format
例項自訂資訊。
- 將預設為無運算的搜尋呼叫轉送至受保護的
- ExoPlayer:
- 新增
BasePreloadManager
,根據多個來源的rankingData
所定義的優先順序,協調這些來源的預先載入作業。您可以擴充這個類別,進行自訂。新增DefaultPreloadManager
,使用PreloadMediaSource
將來源的媒體樣本預先載入記憶體,並使用整數rankingData
指出 UI 上的項目索引。 - 在大多數
LoadControl
方法中新增PlayerId
,即可讓LoadControl
實作項目支援多位玩家。 - 移除
Buffer.isDecodeOnly()
和C.BUFFER_FLAG_DECODE_ONLY
。不需要設定這個標記,因為轉譯器和解碼器會根據時間戳記決定是否要略過緩衝區。自訂Renderer
實作項目應檢查緩衝時間是否至少為BaseRenderer.getLastResetPositionUs()
,以決定是否應顯示樣本。自訂SimpleDecoder
實作可視需要檢查isAtLeastOutputStartTimeUs()
,或使用DecoderOutputBuffer.shouldBeSkipped
標記其他緩衝區以略過這些緩衝區。 - 允許
TargetPreloadStatusControl.getTargetPreloadStatus(T)
傳回空值,表示不要使用指定rankingData
預先載入MediaSource
。 - 將
remove(MediaSource)
新增至BasePreloadManager
。 - 在
BasePreloadManager
中新增reset()
,即可釋放所有保留來源,同時保留預先載入管理工具執行個體。 - 新增
ExoPlayer.setPriority()
(和Builder.setPriority()
) 以定義PriorityTaskManager
中使用的優先順序值,以及 API 35 以上版本的 MediaCodec 重要性。 - 修正更新上次重新緩衝時間的問題,導致 CMCD 中出現不正確的
bs
(緩衝區資源不足) 鍵 (#1124)。 - 新增
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
,表示來源已載入至結尾。這可讓DefaultPreloadManager
和自訂PreloadMediaSource.PreloadControl
實作預先載入下一個來源或執行其他動作。 - 修正在項目結尾略過靜音時,可能會觸發播放例外狀況的錯誤。
- 在
PreloadMediaSource
中加入clear
,即可捨棄預先載入期。 - 新增錯誤碼
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
,用於為優先順序較高的工作回收轉碼器資源時。 - 讓
AdsMediaSource
在初始內容媒體準備完成前載入片頭前廣告 (#1358)。 - 修正錯誤:從資訊清單中移除原始週期後,重新準備多週期 DASH 直播串流時,播放作業會移至
STATE_ENDED
。 - 在
PreloadMediaSource.PreloadControl
中,將onTimelineRefreshed()
重新命名為onSourcePrepared()
,並將onPrepared()
重新命名為onTracksSelected()
。並相應地重新命名DefaultPreloadManager.Stage
中的 IntDef。 - 新增動態排程的實驗性支援功能,可更妥善地配合 CPU 喚醒週期安排工作,並延遲喚醒,直到渲染器可以繼續運作。設定 ExoPlayer 例項時,可以使用
experimentalSetDynamicSchedulingEnabled()
啟用這項功能。 - 新增
Renderer.getDurationToProgressUs()
。Renderer
可以實作這個方法,向 ExoPlayer 傳回播放必須前進的時間長度,轉譯器才能繼續播放。如果ExoPlayer
設為experimentalSetDynamicSchedulingEnabled()
,則ExoPlayer
會在計算排定工作任務的時間時呼叫這個方法。 - 新增
MediaCodecAdapter#OnBufferAvailableListener
,在輸入和輸出緩衝區可供MediaCodecRenderer
使用時發出快訊。MediaCodecRenderer
會在收到這些回呼時發出ExoPlayer
信號,如果ExoPlayer
是使用experimentalSetDynamicSchedulingEnabled()
設定,則ExoPlayer
會排定工作迴圈,因為算繪器可以繼續運作。 - 針對
LoadControl
方法使用資料類別,而非個別參數。 - 新增
ExoPlayer.isReleased()
,檢查是否已呼叫Exoplayer.release()
。 - 新增
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
,設定seekToPrevious()
搜尋前一個項目的最大位置 (#1425)。 - 修正部分音訊焦點不一致的問題,例如在播放器暫停時,未回報完整或暫時失去焦點 (#1436)。
- 修正因擷取器在初始準備步驟後回報額外軌道而可能導致的
IndexOutOfBoundsException
(#1476)。 Effects
中的ExoPlayer.setVideoEffect()
會收到已移除轉譯器偏移的時間戳記 (#1098)。- 修正處理播放器錯誤時可能發生的
IllegalArgumentException
,該錯誤是在預先讀取其他播放清單項目時發生 (#1483)。
- 新增
- 轉換程式:
- 在
ExportResult
中加入audioConversionProcess
和videoConversionProcess
,指出輸出檔案中各個音軌的製作方式。 - 放寬修剪最佳化 H.264 層級檢查。
- 新增支援功能,可在序列中切換 SDR 和 HDR 輸入媒體。
- 新增對合成層級音效的支援。
- 新增將 Ultra HDR 圖片轉碼為 HDR 影片的支援功能。
- 修正問題:
DefaultAudioMixer
在重設並重複使用後,不會輸出正確的位元組數量。 - 解決解碼器錯誤,處理 PCM 輸入時,音訊聲道數量上限為立體聲。
- 在
ExoPlayerAssetLoader
中選取音軌時,請忽略音訊聲道數量的限制,因為這些限制只適用於播放。 - 將
androidx.media3.transformer.Muxer
介面替換為androidx.media3.muxer.Muxer
,並移除androidx.media3.transformer.Muxer
。 - 修正從內容 URI 配置載入 HEIC 圖片的問題。 (#1373)。
- 在
AudioGraphInput
中調整音軌長度,改善影音同步問題。 - 移除
ExportResult.processedInputs
欄位。如果使用這個欄位提供轉碼器詳細資料,請改用DefaultDecoderFactory.listener
。如果發生轉碼器例外狀況,轉碼器詳細資料會顯示在ExportException.codecInfo
中。
- 在
- 擷取工具:
- MPEG-TS:向前推出變更,確保最後一個影格是透過將串流的最後一個存取單元傳遞至樣本佇列 (#7909) 算繪。修正僅含 I 影格的 HLS 串流(#1150) 和 H.262 HLS 串流 (#1126) 中出現的問題。
- MP3:優先採用
Info
框架的資料大小,而非基礎串流回報的大小 (例如檔案大小或 HTTPContent-Length
標頭)。這有助於從固定位元率搜尋計算中排除無法播放的預告片資料 (例如專輯封面),使搜尋更準確 (#1376)。 - MP3:使用
Info
影格中的影格計數和其他資料 (如有),計算固定位元率搜尋的平均位元率,而不是從Info
影格後的影格位元率外推,這可能會人為縮小,例如PCUT
影格 (#1376)。 - 修正 AVI 容器中的 PCM 音訊格式擷取作業。
- 音訊:
- 修正直通播放的 DTS:X Profile 2 編碼屬性 (#1299)。
- 如要卸載播放作業,請在呼叫
AudioTrack.stop()
前,先在DefaultAudioSink
中重設串流完成的追蹤欄位,以便AudioTrack.StreamEventCallback#onPresentationEnded
正確識別所有待處理資料的播放時間。 - 修正
SilenceSkippingAudioProcessor
中的錯誤,不同音訊格式 (例如立體聲到單聲道) 間的轉場效果可能會導致處理器擲回例外狀況 (#1352)。 - 實作
MediaCodecAudioRenderer.getDurationToProgressUs()
,讓 ExoPlayer 動態排定主要工作迴圈,以便 MediaCodecAudioRenderer 能夠繼續運作。
- 影片:
- 修正問題:在播放期間切換介面時,
Listener.onRenderedFirstFrame()
會過早抵達。 - 修正 Dolby Vision 的解碼器備用邏輯,視需要使用相容的 AV1 解碼器 (#1389)。
- 修正啟用影片轉譯器時,可能在播放期間中途導致的轉碼器例外狀況。
- 修正問題:在播放期間切換介面時,
- 文字:
- 修正問題:字幕會略過搜尋位置之前的內容。 這個問題只出現在 Media3 1.4.0-alpha01 中。
- 變更預設的字幕剖析行為,改為在擷取期間而非轉譯期間進行剖析 (如需擷取和轉譯之間的差異,請參閱 ExoPlayer 的架構圖)。
- 如要覆寫這項變更,請同時呼叫
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
和TextRenderer.experimentalSetLegacyDecodingEnabled(true)
。如要將這些元件導入ExoPlayer
執行個體,請參閱自訂說明文件。這些方法 (以及所有舊版字幕解碼支援) 將在日後推出的版本中移除。 - 如果應用程式採用自訂
SubtitleDecoder
實作方式,請更新為實作SubtitleParser
(並使用SubtitleParser.Factory
,而非SubtitleDecoderFactory
)。
- 如要覆寫這項變更,請同時呼叫
- PGS:修正行程長度解碼,將
0
解析為顏色索引,而非常值顏色值 (#1367)。 - CEA-708:忽略
rowLock
值。CEA-708-E S-2023 規格指出,無論串流中出現的值為何,rowLock
和columnLock
都應視為 true (系統未實作columnLock
支援功能,因此實際上會一律視為 false)。- 這項變更原本包含在
1.3.0-alpha01
版本資訊中,但我們在1.3.0-rc01
版本發布前不慎還原了這項變更。我們已修正這個問題,因此變更內容會再次顯示。
- 這項變更原本包含在
- CEA-708:避免 ExoPlayer 處理「設定筆尖位置」指令時,以簡單方式新增重複的換行符 (#1315)。
- 修正
IllegalArgumentException
,當 WebVTT 字幕樣本不含任何提示時 (例如在 DASH 串流中),會從LegacySubtitleUtil
傳送IllegalArgumentException
的問題 (#1516)。
- 中繼資料:
- 圖片:
- 新增對非正方形 DASH 縮圖格線的支援 (#1300)。
- 針對 API 34 以上版本新增 AVIF 支援。
- 允許
null
做為ExoPlayer.setImageOutput()
的參數,以清除先前設定的ImageOutput
。
- DataSource:
- 實作對
android.resource://package/id
原始資源 URI 的支援,其中package
與目前應用程式的套件不同。先前未記載此做法,但相較於依名稱存取其他套件中的資源,這種做法更有效率。 - 在
DataSpec
建構函式中,急切檢查url
是否為非空值。這個參數已註解為非空值。 - 允許
ByteArrayDataSource
在open()
期間將 URI 解析為位元組陣列,而不是在建構時進行硬式編碼 (#1405)。
- 實作對
- DRM:
- 允許在
DefaultDrmSessionManagerProvider
上設定LoadErrorHandlingPolicy
(#1271)。
- 允許在
- 效果:
- 支援在同一個
EditedMediaItem
或Composition
中進行多次速度變更SpeedChangeEffect
。 - 支援從 Ultra HDR 點陣圖輸入輸出 HLG 和 PQ。
- 新增 EGL_GL_COLORSPACE_BT2020_HLG_EXT 支援,可改善 ExoPlayer.setVideoEffect 和 Transformer 的 Debug SurfaceView 中的 HLG 表面輸出。
- 更新疊加矩陣實作,將
setOverlayFrameAnchor()
中套用的 x 和 y 值對調,使其與文件一致。如果使用OverlaySettings.Builder.setOverlayFrameAnchor()
,請將 x 和 y 值乘以-1
,即可翻轉這些值。 - 修正搭配
ExoPlayer#setVideoEffects
使用TimestampWrapper
會當機的問題 (#821)。 - 將預設 SDR 顏色工作空間從線性顏色變更為電氣 BT 709 SDR 影片。此外,也提供第三個選項,可保留原始色彩空間。
- 允許定義 EditedMediaItemSequences 的不確定 z 順序 (#1055)。
- 在不同的 HDR 內容片段中維持一致的亮度範圍 (使用 HLG 範圍)。
- 新增在 HDR 內容上疊加 Ultra HDR (點陣圖) 的支援。
- 允許在 API 26 之前使用
SeparableConvolution
效果。 - 移除未使用的
OverlaySettings.useHdr
,因為疊加層和影格的動態範圍必須相符。 - 為
TextOverlay
新增 HDR 支援。文字重疊的亮度可使用OverlaySettings.Builder.setHdrLuminanceMultiplier()
調整。
- 支援在同一個
- IMA 擴充功能:
- 將應用程式播放 DAI 廣告串流所需的 Promote API 升級為穩定版。
- 在
ImaServerSideAdInsertionMediaSource.AdLoader
中新增replaceAdTagParameters(Map <String, String>)
,以便在執行階段取代廣告代碼參數。 - 修正錯誤:廣告播放期間發生播放器錯誤時,系統不會呼叫
VideoAdPlayer.VideoAdPlayerCallback.onError()
(#1334)。 - 將 IMA SDK 版本遞增升級至 3.33.0,修正使用
data://
廣告代碼 URI 時發生的NullPointerException
問題 (#700)。
- 工作階段:
- 將
CommandButton.enabled
的預設值變更為true
,並確保即使相關聯的指令可用,控制器的值仍可保持為 false。 - 新增
CommandButton
的圖示常數,取代自訂圖示資源。 - 新增
MediaSessionService.isPlaybackOngoing()
,讓應用程式查詢服務是否需要在onTaskRemoved()
中停止 (#1219)。 - 新增
MediaSessionService.pauseAllPlayersAndStopSelf()
,方便暫停所有工作階段的播放作業,並呼叫stopSelf()
終止MediaSessionService
的生命週期。 - 覆寫
MediaSessionService.onTaskRemoved(Intent)
,提供安全預設實作,在播放作業進行中時讓服務在前台執行,否則停止服務。 - 在平台工作階段中繼資料中不設定時間長度,即可隱藏直播媒體通知中的搜尋列 (#1256)。
- 將
MediaMetadata
的轉換對齊MediaDescriptionCompat
,以便在選取中繼資料屬性時,使用與 media1 相同的偏好順序和邏輯。 - 新增
MediaSession.sendError()
,可將非致命錯誤傳送至 Media3 控制器。使用通知控制器 (請參閱MediaSession.getMediaNotificationControllerInfo()
) 時,自訂錯誤會用於將平台工作階段的PlaybackState
更新為錯誤狀態,並提供指定錯誤資訊 (#543)。 - 新增
MediaSession.Callback.onPlayerInteractionFinished()
,在特定控制器的系列播放器互動完成時通知工作階段。 - 新增
SessionError
,並在SessionResult
和LibraryResult
中使用,取代錯誤代碼,盡可能提供錯誤的詳細資訊和解決方法。 - 發布媒體遙控器測試應用程式的程式碼,可用於測試與發布媒體工作階段的應用程式互動。
- 將傳遞至 media3 的額外項目
MediaSession[Builder].setSessionExtras()
傳播至 media1 控制器的PlaybackStateCompat.getExtras()
。 - 將嚴重和一般錯誤對應至平台工作階段,以及從平台工作階段對應。
PlaybackException
會對應至PlaybackStateCompat
的嚴重錯誤狀態。傳送至媒體通知控制器 (含MediaSession.sendError(ControllerInfo, SessionError)
) 的SessionError
會對應至PlaybackStateCompat
中的非重大錯誤,也就是說,系統會設定錯誤代碼和訊息,但平台工作階段的狀態仍與STATE_ERROR
不同。 - 允許為每個控制器設定工作階段活動,以覆寫全域工作階段活動。您可以在連線時為控制器定義工作階段活動,方法是使用
AcceptedResultBuilder.setSessionActivivty(PendingIntent)
建立ConnectionResult
。連線後,工作階段活動可透過MediaSession.setSessionActivity(ControllerInfo, PendingIntent)
更新。 - 改善對
MediaLibrarySession.Callback
的呼叫錯誤複製作業。 現在可以透過MediaLibrarySession.Builder.setLibraryErrorReplicationMode()
選擇錯誤類型,或停用預設開啟的錯誤複製功能,設定錯誤複製作業。
- 將
- UI:
- 下載內容:
- 確認
DownloadHelper
不會洩漏未發布的Renderer
執行個體,否則最終可能導致應用程式當機並出現IllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224)。
- 確認
- Cronet 擴充功能:
- 修正
CronetDataSource
中的SocketTimeoutException
。在某些版本的 Cronet 中,回呼提供的要求不一定相同。這會導致回呼未完成,且要求逾時 (https://issuetracker.google.com/328442628)。
- 修正
- HLS 擴充功能:
- 修正錯誤:等待不連續性的待處理 EMSG 樣本在
HlsSampleStreamWrapper
中委派時,偏移值不正確,導致IndexOutOfBoundsException
或IllegalArgumentException
(#1002)。 - 修正錯誤:非主要播放清單會持續重新載入 LL-HLS 串流 (#1240)。
- 修正啟用 HLS 的 CMCD 時,初始化區隔會導致
Source Error
和IllegalArgumentException
的錯誤。 - 修正錯誤:在直播期間,系統不會重新整理非主要播放的播放清單 (#1240)。
- 修正啟用 HTTP 即時串流直播的 CMCD 時,導致
ArrayIndexOutOfBoundsException
的錯誤 (#1395)。
- 修正錯誤:等待不連續性的待處理 EMSG 樣本在
- DASH 擴充功能:
- Cast 擴充功能:
- 修正錯誤:將
MediaQueueItem
的專輯名稱轉換為 Media3 媒體項目的藝人 (#1255)。
- 修正錯誤:將
- 測試公用程式:
- 在
FakeRenderer
中實作onInit()
和onRelease()
。 - 將
TestPlayerRunHelper.runUntil()/playUntil()
方法變更為在發生非致命錯誤時失敗 (例如回報給AnalyticsListener.onVideoCodecError()
的錯誤)。使用新的TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
方法鏈結停用這項行為。
- 在
- 試用版應用程式:
- 在簡短的示範應用程式中使用
DefaultPreloadManager
。 - 允許透過指令列的
Intent
引數設定重複模式 (#1266)。 - 如果裝置支援,請使用
HttpEngineDataSource
做為HttpDataSource
。
- 在簡短的示範應用程式中使用
- 移除已淘汰的符號:
- 移除
CronetDataSourceFactory
。改用CronetDataSource.Factory
。 - 移除部分
DataSpec
建構函式。改用DataSpec.Builder
。 - 從
DefaultHttpDataSource
、OkHttpDataSource
和CronetDataSource
移除setContentTypePredicate(Predicate)
方法。請改用每個XXXDataSource.Factory
的對等方法。 - 移除
OkHttpDataSource
建構函式和OkHttpDataSourceFactory
。請改用OkHttpDataSource.Factory
。 - 移除
PlayerMessage.setHandler(Handler)
。改用setLooper(Looper)
。 - 移除
Timeline.Window.isLive
欄位。請改用isLive()
方法。 - 移除
DefaultHttpDataSource
建構函式。改用DefaultHttpDataSource.Factory
。 - 移除
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
。改用DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
。 - 移除
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
。改用MediaCodecInfo.canReuseCodec(Format, Format)
。 - 移除
DrmSessionManager.DUMMY
和getDummyDrmSessionManager()
方法。請改用DrmSessionManager.DRM_UNSUPPORTED
。 - 移除
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
、AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
、AudioRendererEventListener.onAudioInputFormatChanged(Format)
、VideoRendererEventListener.onVideoInputFormatChanged(Format)
。請改用採用DecoderReuseEvaluation
的多載。 - 移除
RendererSupport.FormatSupport
IntDef 和FORMAT_HANDLED
、FORMAT_EXCEEDS_CAPABILITIES
、FORMAT_UNSUPPORTED_DRM
、FORMAT_UNSUPPORTED_SUBTYPE
、FORMAT_UNSUPPORTED_TYPE
常數。請改用androidx.media3.common.C
中的對等 IntDef 和常數 (例如C.FORMAT_HANDLED
)。 - 移除
Bundleable
介面。包括移除所有Bundleable.Creator<Foo> CREATOR
常數欄位。呼叫端應改為對每個型別使用Bundle toBundle()
和static Foo fromBundle(Bundle)
方法。
- 移除
1.4.0-rc01 版本
2024 年 7 月 10 日
使用 1.4.0 穩定版。
1.4.0-beta01 版本
2024 年 6 月 26 日
使用 1.4.0 穩定版。
1.4.0-alpha02 版
2024 年 6 月 7 日
使用 1.4.0 穩定版。
1.4.0-alpha01 版
2024 年 4 月 17 日
使用 1.4.0 穩定版。
1.3.0 版本
1.3.1 版本
2024 年 4 月 11 日
發布了 androidx.media3:media3-*:1.3.1
。1.3.1 版包含這些修訂項目。
- 通用程式庫:
- 新增
Format.labels
,允許使用本地化或其他替代標籤。
- 新增
- ExoPlayer:
- 轉換程式:
- 新增解決方法,避免因
MediaMuxer
不支援 API 30 之前的負數呈現時間戳記而擲回例外狀況。
- 新增解決方法,避免因
- 音軌選取:
DefaultTrackSelector
:優先選擇畫面更新率「合理」(>=10fps) 的視訊軌,而非畫面更新率較低或未設定的視訊軌。這樣可確保播放器在從動態相片擷取的 MP4 中選取「實際」影片軌,因為這類 MP4 可能包含兩個 HEVC 軌,其中一個的解析度較高,但影格數量非常少 (#1051)。
- 擷取工具:
- 音訊:
- 如果音軌無法在卸載模式中初始化,請停用卸載功能,允許轉譯器復原。
- 影片:
- 文字:
- WebVTT:避免直接連續的提示從
WebvttParser.parse
建立額外的CuesWithTiming
執行個體 (#1177)。
- WebVTT:避免直接連續的提示從
- DRM:
- 解決
NoSuchMethodError
問題,在某些 Android 14 裝置上,MediaDrm
架構可能會擲回這個問題,而不是ResourceBusyException
或NotProvisionedException
(#1145)。
- 解決
- 效果:
- 透過轉換色域,改善 PQ 至 SDR 的色調對應。
- 工作階段:
- UI:
- 如果
Locale
無法識別顯示名稱,則改為加入音軌語言名稱 (#988)。
- 如果
- DASH 擴充功能:
- 將資訊清單中的所有
Label
元素填入Format.labels
(#1054)。
- 將資訊清單中的所有
- RTSP 擴充功能:
- 在 SDP 剖析中略過空白的工作階段資訊值 (i-tag) (#1087)。
- 解碼器擴充功能 (FFmpeg、VP9、AV1、MIDI 等):
- 預設會停用 MIDI 擴充功能做為本機依附元件,因為這需要設定額外的 Maven 存放區。如果使用者需要本機依附元件中的這個模組,可以重新啟用。
1.3.0 版本
2024 年 3 月 6 日
發布了 androidx.media3:media3-*:1.3.0
。1.3.0 版包含這些修訂項目。
- 通用程式庫:
- 實作對
android.resource://package/[type/]name
原始資源 URI 的支援,其中package
與目前應用程式的套件不同。這項功能一直以來都記載為可運作,但直到現在才正確實作。 - 將應用程式程式碼設定或從媒體讀取的 MIME 類型正規化為全小寫。
- 在
AdPlaybackState
中定義廣告時,請使用完整的MediaItem
,而非單一Uri
。 - 將
minSdk
提高至 19 (Android KitKat)。這項做法與所有其他 AndroidX 程式庫一致,且是升級至最新版 AndroidX 依附元件的必要條件。 - 當至少一個為非空值時,在
MediaMetadata.Builder.populate(MediaMetadata)
中填入artworkUri
和artworkData
(#964)。
- 實作對
- ExoPlayer:
- 新增
PreloadMediaSource
和PreloadMediaPeriod
,讓應用程式能在播放前,預先載入特定開始位置的內容媒體來源。PreloadMediaSource
會負責準備內容媒體來源,以接收Timeline
、準備及快取指定開始位置的期間、選取軌道,以及載入該期間的媒體資料。應用程式會實作PreloadMediaSource.PreloadControl
來控制預先載入進度,並將預先載入的來源設為播放器,以供播放。 - 新增
ExoPlayer.setImageOutput
,允許應用程式設定ImageRenderer.ImageOutput
。 DefaultRenderersFactory
現在會預設為播放器提供ImageRenderer
,並將ImageOutput
和ImageDecoder.Factory.DEFAULT
設為空值。- 略過靜音時發出
Player.Listener.onPositionDiscontinuity
事件 (#765)。 - 新增實驗性支援,可在擷取期間剖析字幕。您可以使用
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
啟用這項功能。 - 使用
PreloadMediaSource
支援自適應媒體來源。 - 使用 HttpEngine API 實作
HttpEngineDataSource
和HttpDataSource
。 - 防止子類別化
CompositeSequenceableLoader
。這個元件先前可擴充,但從未在程式庫中建立子類別。如要進行自訂,請使用裝飾器模式包裝執行個體,並實作自訂CompositeSequenceableLoaderFactory
。 - 修正重複相同時間會導致清除這個項目中繼資料的問題 (#1007)。
- 將
BundledChunkExtractor.Factory
和DefaultHlsExtractorFactory
中的experimentalSetSubtitleParserFactory
方法重新命名為setSubtitleParserFactory
,並禁止傳遞null
。使用新的experimentalParseSubtitlesDuringExtraction(boolean)
方法控制剖析行為。 - 新增支援在擷取期間自訂使用的
SubtitleParser.Factory
。這時就會用到MediaSource.Factory.setSubtitleParserFactory()
。 - 將來源前置字串新增至從
MergingMediaSource
產生的所有Format.id
欄位。這有助於找出產生Format
(#883) 的來源。 - 修正用於驗證自訂通用媒體用戶端資料 (CMCD) 金鑰名稱的 regex,將其修改為僅檢查連字號 (#1028)。
- 停止對 CMCD 查詢參數進行雙重編碼 (#1075)。
- 新增
- 轉換程式:
- 音軌選取:
- 新增
DefaultTrackSelector.selectImageTrack
,啟用圖片軌選取功能。 - 新增
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
,判斷是否要選取圖片軌 (如果圖片軌和影片軌都可用)。預設值為false
,表示系統會優先選取視訊軌。
- 新增
- 擷取工具:
- 在 MP4 擷取器中新增額外的 AV1C 剖析作業,以擷取
ColorInfo.colorSpace
、ColorInfo.colorTransfer
和ColorInfo.colorRange
值 (#692)。 - MP3:使用固定位元率 (CBR) 搜尋含有
Info
標頭的檔案 (相當於Xing
標頭的 CBR)。先前我們使用Info
標頭中的搜尋表,但如果忽略該表並假設檔案為 CBR,搜尋結果會更精確。 - MPEG2-TS:新增 DTS、DTS-LBR 和 DTS:X Profile2 支援 (#275)。
- 從 TS 描述元擷取音訊類型,並對應至角色旗標,讓使用者做出更明智的音軌選擇 (#973)。
- 在 MP4 擷取器中新增額外的 AV1C 剖析作業,以擷取
- 音訊:
- 影片:
- 變更採用
VideoFrameProcessor.Factory
引數的MediaCodecVideoRenderer
建構函式,並替換為採用VideoSinkProvider
引數的建構函式。如要插入自訂VideoFrameProcessor.Factory
,應用程式可以例項化使用自訂VideoFrameProcessor.Factory
的CompositingVideoSinkProvider
,並將影片接收器供應器傳遞至MediaCodecVideoRenderer
。
- 變更採用
- 文字:
- 修正點陣圖提示的序列化,解決使用
DefaultExtractorsFactory.setTextTrackTranscodingEnabled
時發生的Tried to marshall a Parcel that contained Binder objects
錯誤 (#836)。 - CEA-708:忽略
rowLock
值。CEA-708-E S-2023 規格指出,無論串流中出現的值為何,rowLock
和columnLock
都應視為 true (系統未實作columnLock
支援功能,因此實際上會一律視為 false)。
- 修正點陣圖提示的序列化,解決使用
- 圖片:
- 新增 DASH 縮圖支援。系統會裁剪格狀圖片,並在圖片顯示時間附近提供個別縮圖。
ImageOutput
- 新增 DASH 縮圖支援。系統會裁剪格狀圖片,並在圖片顯示時間附近提供個別縮圖。
- DRM:
- 根據預設,即使後續加密樣本的金鑰尚未準備就緒,系統也會立即播放 DRM 內容中「清除前導」的未加密樣本。如果播放位置到達加密樣本時,金鑰仍未準備就緒,可能會導致播放中途停頓 (但先前播放作業在這個時間點根本不會開始)。您可以使用
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
或DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
停用這項行為。
- 根據預設,即使後續加密樣本的金鑰尚未準備就緒,系統也會立即播放 DRM 內容中「清除前導」的未加密樣本。如果播放位置到達加密樣本時,金鑰仍未準備就緒,可能會導致播放中途停頓 (但先前播放作業在這個時間點根本不會開始)。您可以使用
- IMA 擴充功能:
- 修正問題:如果 DASH 和 HLS 廣告沒有適當的副檔名,就無法播放。
- 工作階段:
- 為 TV 應用程式停用按兩下偵測功能 (#962)。
- 修正問題:只有非空值的額外資訊的
MediaItem.RequestMetadata
不會在媒體控制器和工作階段之間傳輸。 - 在
MediaLibrarySession.Builder
中新增建構函式,只接受Context
,而非MediaLibraryService
。
- HLS 擴充功能:
- 將
HlsMediaPeriod
瀏覽權限降低為套件私有。不應從 HLS 套件外部直接依附這類項目。 - 更有效率地將搜尋作業解析為區隔開頭 (#1031)。
- 將
- 解碼器擴充功能 (FFmpeg、VP9、AV1、MIDI 等):
- MIDI 解碼器:忽略 SysEx 事件訊息 (#710)。
- 測試公用程式:
- 請勿暫停「
TestPlayerRunHelper.playUntilPosition
」中的播放作業。測試會讓播放作業維持播放狀態,但會暫停進度,直到測試能夠新增判斷和後續動作為止。
- 請勿暫停「
- 試用版應用程式:
- 新增短片試用版模組,示範如何搭配短片內容使用
PreloadMediaSource
。
- 新增短片試用版模組,示範如何搭配短片內容使用
1.3.0-rc01 版本
2024 年 2 月 22 日
使用 1.3.0 穩定版。
1.3.0-beta01 版本
2024 年 2 月 7 日
使用 1.3.0 穩定版。
1.3.0-alpha01 版本
2024 年 1 月 15 日
使用 1.3.0 穩定版。
1.2.0 版本
1.2.1 版本
2024 年 1 月 9 日
- ExoPlayer:
- 轉換程式:
- 解決因設定高運作速率,導致編碼器在設定時擲回的問題。
- 擷取工具:
- 音訊:
- 修正多次呼叫
SilenceSkippingAudioProcessor
時的 EOS 處理方式 (#712)。
- 修正多次呼叫
- 影片:
- 針對 Galaxy Tab S7 FE、Chromecast (支援 Google TV) 和 Lenovo M10 FHD Plus 裝置的問題新增解決方法,這些裝置會將 60 fps AVC 串流標示為不支援 (#693)。
- 中繼資料:
- 修正錯誤:
MediaMetadata
僅從含有大寫鍵的 Vorbis 註解填入資料 (#876)。 - 在剖析非常大的 ID3 影格時,會發生
OutOfMemoryError
,也就是說,播放作業可以繼續進行,但不會顯示標記資訊,而不是完全無法播放。
- 修正錯誤:
- DRM:
- 將適用於偽造 ClearKey
https://default.url
授權網址的解決方法擴展至 API 33 以上版本 (先前僅適用於 API 33) (#837)。 - 修正從加密內容切換至未加密內容時,
ERROR_DRM_SESSION_NOT_OPENED
未附加至播放器的問題。錯誤原因是使用安全解碼器播放未加密內容時發生錯誤。
- 將適用於偽造 ClearKey
- 工作階段:
- 將自訂鍵和值放在
MediaMetadataCompat
中,然後將MediaMetadataCompat
放在MediaMetadata.extras
中,並將MediaMetadata.extras
放在MediaMetadataCompat
中。(#756、#802)。 - 修正舊版控制器的
notifyChildrenChanged
廣播問題 (#644)。 - 修正錯誤:在部分裝置上,為已停用的通知
setWhen
計時器設定負時間,會導致裝置異常終止 (#903)。 - 修正媒體通知控制器尚未完成連線,但系統要求第一次更新通知時發生的
IllegalStateException
(#917)。
- 將自訂鍵和值放在
- UI:
- DASH 擴充功能:
- 在 DASH 資訊清單中,將「f800」剖析為 Dolby 的 5 個聲道 (#688)。
- 解碼器擴充功能 (FFmpeg、VP9、AV1、MIDI 等):
- Cast 擴充功能:
- 對
Timeline
的建立作業進行清理,避免在投放裝置上載入媒體失敗時,應用程式發生異常終止情形 (#708)。
- 對
1.2.0 版本
2023 年 11 月 15 日
- 通用程式庫:
- 在
Log.Logger
介面的方法中新增@Nullable Throwable
參數。這些方法的message
參數不再包含傳遞至Log.{d,i,w,e}()
方法的Throwable
相關資訊,因此如要使用這項資訊,實作時必須手動附加 (可能使用Logger.appendThrowableString(String, Throwable)
)。 - 修正 Kotlin 相容性問題,避免系統未將可為空值的泛型型別參數和可為空值的陣列元素型別偵測為可為空值。例如
TrackSelectorResult
和SimpleDecoder
方法參數 (#6792)。 - 在
Util.shouldShowPlayButton
中變更預設 UI 和通知行為,在暫時停止播放時 (例如因暫時失去音訊焦點),顯示「播放」按鈕。如要維持舊版行為,請使用PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
或MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
(#11213)。 - 將
androidx.annotation:annotation-experimental
升級至1.3.1
,修正 https://issuetracker.google.com/251172715。 - 將
ExoPlayer.setAudioAttributes
移至Player
介面。
- 在
- ExoPlayer:
- 修正 AC4 串流中的搜尋問題,原因是不正確識別僅供解碼的樣本 (#11000)。
- 透過
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
啟用這項功能後,如果音訊輸出裝置不適合播放內容 (例如 Wear OS 裝置的內建喇叭),系統就會停止播放。如果嘗試播放時沒有合適的音訊輸出裝置,或播放期間所有合適的輸出裝置都已中斷連線,播放抑制原因就會更新為Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
。連線至合適的輸出裝置後,系統就會移除停用原因。 - 新增
MediaSource.canUpdateMediaItem
和MediaSource.updateMediaItem
,以便在透過Player.replaceMediaItem(s)
建立後接受MediaItem
更新。 - 允許透過
Player.replaceMediaItem(s)
為程式庫提供的所有MediaSource
類別更新MediaItem
(#33、#9978)。 - 將
MimeTypes.TEXT_EXOPLAYER_CUES
重新命名為MimeTypes.APPLICATION_MEDIA3_CUES
。 - 新增
PngExtractor
,將整個 PNG 檔案傳送及讀取至TrackOutput
做為一個樣本。 - 在
SequenceableLoader
介面中強化SequenceableLoader.continueLoading(long)
方法,以支援SequenceableLoader.continueLoading(LoadingInfo loadingInfo)
。LoadingInfo
包含其他參數,包括playbackSpeed
和lastRebufferRealtimeMs
,以及現有的playbackPositionUs
。 - 在
ChunkSource
介面中,將ChunkSource.getNextChunk(long, long, List, ChunkHolder)
方法強化為ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
。 - 在通用媒體用戶端資料 (CMCD) 記錄中新增其他欄位:緩衝區資源不足 (
bs
)、截止時間 (dl
)、播放速率 (pr
) 和啟動 (su
) (#8699)。 - 在
ColorInfo
中新增亮度和色度位元深度 (#491)。 - 在通用媒體用戶端資料 (CMCD) 記錄中新增其他欄位:下一個物件要求 (
nor
) 和下一個範圍要求 (nrr
) (#8699)。 - 新增功能,使用查詢參數 (#553) 傳輸通用媒體用戶端資料 (CMCD) 資料。
- 修正
ExperimentalBandwidthMeter
中的ConcurrentModificationException
(#612)。 - 在
CompositeMediaSource.getMediaTimeForChildMediaTime
中新增MediaPeriodId
參數。 - 支援
ClippingMediaSource
(以及其他具有週期/視窗時間偏移的來源) 中的ConcatenatingMediaSource2
(#11226)。 - 變更
BaseRenderer.onStreamChanged()
,讓其也接收MediaPeriodId
引數。
- 轉換程式:
- 剖析圖片輸入內容的 EXIF 旋轉資料。
- 移除
TransformationRequest.HdrMode
註解型別及其相關常數。請改用Composition.HdrMode
和相關聯的常數。 - 簡化
OverlaySettings
即可修正旋轉問題。 - 已將
SampleConsumer.queueInputBitmap
的frameRate
和durationUs
參數變更為TimestampIterator
。
- 音軌選取:
- 新增
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
,即可明確允許或禁止非無縫式調整。預設值仍為目前的true
行為。
- 新增
- 擷取工具:
- MPEG-TS:將串流的最後存取單元傳遞至樣本佇列 (#7909),確保系統會算繪最後一個影格。
- 修正判斷
rotationDegrees
時的錯字。已將projectionPosePitch
變更為projectionPoseRoll
(#461)。 - 移除
Extractor
執行個體可直接使用instanceof
檢查的假設。如要取得Extractor
的實作詳細資料,請先呼叫Extractor.getUnderlyingInstance
。 - 新增
BmpExtractor
。 - 新增
WebpExtractor
。 - 新增
HeifExtractor
。 - 在
Mp4Extractor
中新增 QuickTime 傳統版支援。
- 音訊:
- 在 MP4 和 Matroska 中新增對 24/32 位元大端 PCM 的支援,並剖析 MP4 中
lpcm
的 PCM 編碼。 - 新增支援功能,可從 MP4 檔案中擷取 Vorbis 音訊。
- 新增
AudioSink.getFormatOffloadSupport(Format)
,透過DefaultAudioOffloadSupportProvider
擷取接收器可為格式提供的卸載支援層級。傳回包含isFormatSupported
、isGaplessSupported
和isSpeedChangeSupported
的新AudioOffloadSupport
。 - 新增
AudioSink.setOffloadMode()
,藉此設定音訊接收器的卸載設定。預設值為AudioSink.OFFLOAD_MODE_DISABLED
。 - 您可以在
TrackSelectionParameters
中透過setAudioOffloadPreference
啟用卸載功能。如果偏好設定為啟用,且裝置支援格式卸載,且選取的音軌為單一音軌,則會啟用音訊卸載。 - 如果
audioOffloadModePreference
設為AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
,則DefaultTrackSelector
只會選取音軌,且僅限於卸載支援的音軌格式。如果卸載作業不支援任何音軌,系統就不會選取任何音軌。 - 由於曲目轉換後會發生播放位置問題,因此在 API 級別 33 之前的版本中,停用卸載的無間隙支援。
- 從
DefaultRenderersFactory.buildAudioSink
方法簽章中移除enableOffload
參數。 - 移除方法
DefaultAudioSink.Builder.setOffloadMode
。 - 移除 intdef 值
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
。 - 在卸載播放期間新增對 Opus 無間隙中繼資料的支援。
- 如果首次寫入失敗,請停用卸載功能,允許轉譯器復原 (#627)。
- 預設為純音訊卸載播放啟用卸載排程。
- 刪除
ExoPlayer.experimentalSetOffloadSchedulingEnabled
和AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
。 - 已將
onExperimentalSleepingForOffloadChanged
重新命名為onSleepingForOffloadChanged
,並將onExperimentalOffloadedPlayback
重新命名為onOffloadedPlayback
。 - 將音訊卸載模式相關的
TrackSelectionParameters
介面和定義移至內部AudioOffloadPreferences
類別。 - 將
onAudioTrackInitialized
和onAudioTrackReleased
回呼新增至AnalyticsListener
、AudioRendererEventListener
和AudioSink.Listener
。 - 修正 DTS Express 音訊緩衝區溢位問題 (#650)。
- 修正錯誤:檢查 E-AC3-JOC 功能時會擲回
IllegalArgumentException
(#677)。
- 在 MP4 和 Matroska 中新增對 24/32 位元大端 PCM 的支援,並剖析 MP4 中
- 影片:
- 允許
MediaCodecVideoRenderer
使用自訂VideoFrameProcessor.Factory
。 - 修正錯誤:如果音訊串流以負時間戳記開頭,系統就無法算繪第一個影格 (#291)。
- 允許
- 文字:
- 移除
ExoplayerCuesDecoder
。現在TextRenderer
可直接處理含有sampleMimeType = application/x-media3-cues
的文字軌,不需要SubtitleDecoder
執行個體。
- 移除
- 中繼資料:
- 對於「僅解碼」的樣本,系統不會再呼叫
MetadataDecoder.decode
,因為實作方式無論如何都必須傳回空值。
- 對於「僅解碼」的樣本,系統不會再呼叫
- 效果:
- 依時間戳記新增
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
佇列點陣圖輸入。 - 將
VideoFrameProcessor.registerInputStream()
變更為非封鎖。 應用程式必須實作VideoFrameProcessor.Listener#onInputStreamRegistered()
。 - 已將
VideoFrameProcessor.queueInputBitmap
的frameRate
和durationUs
參數變更為TimestampIterator
。
- 依時間戳記新增
- IMA 擴充功能:
- 修正錯誤:如果播放清單中的第一個項目不是多週期 DASH 直播,可能會擲回例外狀況 (#571)。
- 請先釋放 StreamManager,再呼叫
AdsLoader.destroy()
- 將 IMA SDK 版本遞增升級至 3.31.0。
- 工作階段:
- 將通知前景服務行為設為
DefaultMediaNotificationProvider
中的FOREGROUND_SERVICE_IMMEDIATE
(#167)。 - 請僅使用 API 31 以上版本,以免 Samsung 裝置發生已淘汰 API 的問題 (#167)。
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
- 使用媒體通知控制器做為 Proxy,設定可用指令和自訂版面配置,用於填入通知和平台工作階段。
- 轉換 Media3
MediaSessionService.onStartCommand()
收到的媒體按鈕事件,而不是將事件傳送至平台工作階段,再傳回 Media3。這樣一來,來電控制器一律會是媒體通知控制器,應用程式就能在所有支援的 API 級別中,以相同方式輕鬆辨識來自通知的來電。 - 修正與舊版
MediaSessionCompat
連線時,MediaController.getCurrentPosition()
不會前進的問題。 - 為方便起見,請新增
MediaLibrarySession.getSubscribedControllers(mediaId)
。 - 覆寫
MediaLibrarySession.Callback.onSubscribe()
,以判斷控制器訂閱的父項 ID 是否可用。如果成功,系統會接受訂閱,並立即呼叫notifyChildrenChanged()
,通知瀏覽器 (#561)。 - 為 Automotive OS 新增工作階段示範模組,並為 Android Auto 啟用工作階段示範。
- 如果媒體通知控制器無法使用
COMMAND_GET_TIMELINE
,請勿設定架構工作階段的佇列。由於 Android Auto 是從架構工作階段讀取資料的用戶端控制器,因此 Android Auto 的 UI 中不會顯示queue
按鈕 (#339)。 - 預設使用
DataSourceBitmapLoader
,而非SimpleBitmapLoader
(#271、#327)。 - 新增
MediaSession.Callback.onMediaButtonEvent(Intent)
,允許應用程式覆寫預設的媒體按鈕事件處理作業。
- 將通知前景服務行為設為
- UI:
- 為 Wear OS 裝置新增
Player.Listener
實作項目,處理因Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
導致的播放抑制問題,方法是啟動系統對話方塊,讓使用者連線至合適的音訊輸出裝置 (例如藍牙耳機)。如果在可設定的逾時時間內 (預設為 5 分鐘) 連接合適的裝置,系統會自動繼續播放。
- 為 Wear OS 裝置新增
- 下載內容:
- 為確保與 Android 14 相容,請為
DownloadService
聲明「資料同步」前景服務類型。使用這項服務時,應用程式也需要在資訊清單中將dataSync
新增為foregroundServiceType
,並新增FOREGROUND_SERVICE_DATA_SYNC
權限 (#11239)。
- 為確保與 Android 14 相容,請為
- HLS 擴充功能:
- 使用從上次載入開始時間計算出的間隔,而非上次載入完成時間,重新整理 HLS 直播播放清單 (#663)。
- DASH 擴充功能:
- 允許在區隔範本網址中出現多個相同的 DASH ID。
- 新增實驗性支援,可在擷取期間剖析字幕。這個版本可更妥善地合併重疊的字幕,包括解決字幕片段間轉換時的閃爍問題。您可以使用
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
啟用這項功能 (#288)。
- RTSP 擴充功能:
- 解碼器擴充功能 (FFmpeg、VP9、AV1、MIDI 等):
- 發布 MIDI 解碼器模組,支援使用 Jsyn 程式庫合成音訊,播放標準 MIDI 檔案。
- 新增
DecoderOutputBuffer.shouldBeSkipped
,直接標示不需要呈現的輸出緩衝區。建議您使用這個方法,而不要使用即將淘汰的C.BUFFER_FLAG_DECODE_ONLY
。 - 新增
Decoder.setOutputStartTimeUs
和SimpleDecoder.isAtLeastOutputStartTimeUs
,讓解碼器在開始時間前捨棄僅供解碼的樣本。建議您優先使用這項功能,而非即將淘汰的Buffer.isDecodeOnly
。 - 修正將 MIDI 解碼器構件發布至 Maven 存放區的錯誤。構件已重新命名為
media3-exoplayer-midi
(#734)。
- Leanback 擴充功能:
- 修正停用介面可能導致 Leanback 程式碼中出現
ArithmeticException
的錯誤 (#617)。
- 修正停用介面可能導致 Leanback 程式碼中出現
- 測試公用程式:
- 讓
TestExoPlayerBuilder
和FakeClock
與 Espresso UI 測試和 Compose UI 測試相容。修正錯誤:在 Espresso 或 Compose 檢視區塊互動期間,播放進度會以非決定性方式前進。
- 讓
- 移除已淘汰的符號:
- 移除
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
和TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
。請改用Composition.Builder.setHdrMode(int)
,並將Composition
傳遞至Transformer.start(Composition, String)
。 - 移除已淘汰的
DownloadNotificationHelper.buildProgressNotification
方法,改用採用notMetRequirements
參數的非淘汰方法。
- 移除
1.2.0-rc01 版本
2023 年 11 月 1 日
使用 1.2.0 穩定版。
1.2.0-beta01 版本
2023 年 10 月 19 日
使用 1.2.0 穩定版。
1.2.0-alpha02 版本
2023 年 9 月 29 日
使用 1.2.0 穩定版。
1.2.0-alpha01 版本
2023 年 8 月 17 日
使用 1.2.0 穩定版。
1.1.0 版本
1.1.1 版
2023 年 8 月 16 日
- 通用程式庫:
- 從所有模組中移除意外新增的
multidex
依附元件 (#499)。
- 從所有模組中移除意外新增的
- ExoPlayer:
- 修正
PlaybackStatsListener
中的問題:播放清單清除後,會建立虛假的PlaybackStats
。 - 在 Common Media Client Data (CMCD) 記錄中新增其他欄位:串流格式 (sf)、串流類型 (st)、版本 (v)、最高位元率 (tb)、物件時間長度 (d)、測得的輸送量 (mtp) 和物件類型 (ot) (#8699)。
- 修正
- 音訊:
- 修正播放極短檔案時,
Player.getState()
從未轉換為STATE_ENDED
的錯誤 (#538)。
- 修正播放極短檔案時,
- 音訊卸載:
- 根據 RFC 7845,將 Ogg ID 標頭和註解標頭頁面加到位元串流的前面,以便卸載 Opus 播放作業。
- 影片:
- H.265/HEVC:修正剖析 SPS 短期和長期參考圖片資訊的問題。
- 文字:
- CEA-608:變更提示截斷邏輯,只考量可見文字。先前將提示長度限制為 32 個字元時,會納入縮排和定位點偏移量 (這在技術上符合規格)(#11019)。
- IMA 擴充功能:
- 將 IMA SDK 版本遞增升級至 3.30.3。
- 工作階段:
- 在控制器的狀態中新增自訂版面配置,並提供 getter 來存取該版面配置。自訂版面配置變更時,系統會呼叫
MediaController.Listener.onCustomLayoutChanged
。應用程式如要將不同的自訂版面配置傳送至不同的 Media3 控制器,可以在MediaSession.Callback.onConnect
中使用AcceptedResultBuilder
,確保連線完成時,控制器可以使用自訂版面配置。 - 修正
MediaLibraryServiceLegacyStub
將錯誤傳送至不支援此錯誤的Result
,導致產生UnsupportedOperationException
的情況 (#78)。 - 修正
PlayerWrapper
建立VolumeProviderCompat
的方式,透過舊版指令 (COMMAND_ADJUST_DEVICE_VOLUME
和COMMAND_SET_DEVICE_VOLUME
) 和新指令 (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
和COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) 判斷volumeControlType
(#554)。
- 在控制器的狀態中新增自訂版面配置,並提供 getter 來存取該版面配置。自訂版面配置變更時,系統會呼叫
1.1.0 版本
2023 年 7 月 5 日
- 通用程式庫:
- Add suppression reason for unsuitable audio route and play when ready change reason for suppressed too long. (#15)。
- 在 Player 中新增指令:
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- 在 Player 中新增過載方法,讓使用者指定音量標記:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- 新增
Builder
,並淘汰現有建構函式。DeviceInfo
- 新增
DeviceInfo.routingControllerId
,指定遠端播放的路由控制器 ID。 - 新增
Player.replaceMediaItem(s)
做為捷徑,可在相同位置新增及移除項目 (#8046)。
- ExoPlayer:
- 只有在明確選擇加入時,才允許 ExoPlayer 控制裝置音量方法。使用
ExoPlayer.Builder.setDeviceVolumeControlEnabled
可存取:getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
和setDeviceVolume(int, int)
increaseDeviceVolume(int)
和increaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
和decreaseDeviceVolume(int, int)
- 新增
FilteringMediaSource
,可從MediaSource
篩選可用的軌類型。 - 新增支援功能,可在自動調整串流格式 (DASH、HLS 和 SmoothStreaming) 的外送要求中加入通用媒體用戶端資料 (CMCD)。以下欄位已納入 (#8699):
br
、bl
、cid
、rtp
和sid
。API 結構和 API 方法:- CMCD 記錄功能預設為停用,請使用
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
啟用。 - 所有鍵預設為啟用,請覆寫
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
來篩除要記錄的鍵。 - 覆寫
CmcdConfiguration.RequestConfig.getCustomData()
即可啟用自訂鍵記錄功能。
- CMCD 記錄功能預設為停用,請使用
- 在主要試用版的資訊清單中新增其他動作,方便使用自訂
*.exolist.json
檔案啟動試用版應用程式 (#439)。 - 新增
ExoPlayer.setVideoEffects()
,以便在播放影片時使用Effect
。 - 更新
SampleQueue
,將sourceId
儲存為long
,而非int
。這會變更公用方法SampleQueue.sourceId
和SampleQueue.peekSourceId
的簽章。 - 在
LoadControl
方法shouldStartPlayback
和onTracksSelected
中新增參數,以便將這些方法與相關的MediaPeriod
建立關聯。 - 變更
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
的簽章,加入時間軸參數,其中包含以 UID 做為對應鍵的週期。為避免多週期直播發生並行問題,請務必提供這項資訊。 - 淘汰
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
和BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
。您可以改為呼叫不含mediaTimeOffsetUs
的方法變體。請注意,即使是已淘汰的變體,系統也不會再將偏移量新增至分派器分派的MediaLoadData
物件的startTimeUs
和endTimeUs
。 - 將
ExoTrackSelection.blacklist
重新命名為excludeTrack
,並將isBlacklisted
重新命名為isTrackExcluded
。 - 修正在空白播放清單上呼叫
ExoPlayer.setMediaItem(s)
和addMediaItem(s)
時,兩者行為不一致的問題。
- 只有在明確選擇加入時,才允許 ExoPlayer 控制裝置音量方法。使用
- 轉換程式:
- 移除
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
。 請改用ExoPlayerAssetLoader.Factory(MediaSource.Factory)
和Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
。 - 移除
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
。 - 修正錯誤:如果輸入影格待處理時,系統發出影片串流結尾訊號,轉換作業可能會卡住 (導致多工器逾時)。
- 透過
MediaCodecList
查詢轉碼器,而非使用findDecoder/EncoderForFormat
公用程式,以擴大支援範圍。 - 移除
DefaultEncoderFactory
中的 B 幀設定,因為部分裝置無法使用這項設定。
- 移除
- 音軌選取:
- 新增系統預設停用的
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
。啟用後,當轉譯器功能變更時,DefaultTrackSelector
會觸發新的軌道選取作業。
- 新增系統預設停用的
- 擷取工具:
- 音訊:
- 修正錯誤:啟用通道和
AudioProcessors
時,部分播放作業會失敗,例如無間隙修剪 (#10847)。 - 在直接播放 (卸載) 中,將 Opus 影格封裝在 Ogg 封包中。
- 在睡眠期間,透過卸載排程推斷目前位置。
- 在播放器生命週期結束時,新增
Renderer.release()
和AudioSink.release()
來釋放資源。 - 在
DefaultAudioSink
中監聽音訊功能變更。在DefaultAudioSink
的建構函式中新增必要參數context
,DefaultAudioSink
會使用這項參數向AudioCapabilitiesReceiver
註冊為監聽器,並在收到功能變更通知時更新audioCapabilities
屬性。 - 透過
AudioSink.Listener
介面中的新事件onAudioCapabilitiesChanged
和新介面RendererCapabilities.Listener
傳播音訊功能變更,觸發onRendererCapabilitiesChanged
事件。 - 新增
ChannelMixingAudioProcessor
,將縮放/混音套用至音訊聲道。 - 在
DecoderDiscardReasons
中新增 int 值DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
,以便在音訊功能變更後,略過模式可能適用時捨棄音訊解碼器。 - 新增 DTS Express 和 DTS:X 的直接播放支援 (#335)。
- 修正錯誤:啟用通道和
- 影片:
- 當轉譯器停用時,請讓
MediaCodecVideoRenderer
回報寬度和高度為 0 的VideoSize
。Player.getVideoSize()
變更時,系統會相應呼叫Player.Listener.onVideoSizeChanged
。這項變更生效後,如果Player.getCurrentTracks
不支援影片,或系統尚未判斷支援的影片軌大小,ExoPlayer 的影片大小 (含MediaCodecVideoRenderer
) 寬度和高度都會是 0。
- 當轉譯器停用時,請讓
- DRM:
- 降低
DefaultDrmSession
上多種僅供內部使用的方法的瀏覽權限,這些方法不應從 DRM 套件外部呼叫:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- 降低
- Muxer:
- 新增可用於建立 MP4 容器檔案的 Muxer 程式庫。
- IMA 擴充功能:
- 為動態廣告插播啟用多週期 DASH 直播串流。請注意,目前的實作方式尚未支援在直播中搜尋 (#10912)。
- 修正錯誤:連續時間軸中計算出的內容位置略有差異,導致系統在直播中插入新的廣告群組。
- 工作階段:
- 新增輔助方法
MediaSession.getControllerForCurrentRequest
,取得目前呼叫Player
方法的控制器相關資訊。 - 新增
androidx.media3.session.MediaButtonReceiver
,讓應用程式能夠透過藍牙耳機等裝置傳送的媒體按鈕事件,實作播放續播功能 (#167)。 - 在
MediaSession.Callback.onAddMediaItems
中新增預設實作項目,允許將要求的MediaItems
傳遞至Player
(如果LocalConfiguration
存在,例如 URI) (#282)。 - 在 Android 12 以下版本的小型媒體通知檢視畫面中,預設新增「seek to previous」和「seek to next」指令按鈕 (#410)。
- 在
MediaSession.Callback.onAddMediaItems
中新增預設實作項目,允許將要求的MediaItems
傳遞至Player
(如果LocalConfiguration
存在,例如 URI) (#282)。 - 在 Android 12 以下版本的小型媒體通知檢視畫面中,預設新增「seek to previous」和「seek to next」指令按鈕 (#410)。
- 新增輔助方法
- UI:
- 新增
shouldShowPlayButton
和handlePlayPauseButtonAction
Util 方法,使用播放/暫停按鈕編寫自訂 UI 元素。
- 新增
- RTSP 擴充功能:
- DASH 擴充功能:
- 從多時段 DASH 串流的
MediaLoadData.startTimeMs
和MediaLoadData.endTimeMs
中移除媒體時間偏移。 - 修正重新準備多週期 Live Dash 媒體來源時,會產生
IndexOutOfBoundsException
的錯誤 (#10838)。
- 從多時段 DASH 串流的
- HLS 擴充功能:
- 新增
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
,為載入執行緒設定逾時,等待TimestampAdjuster
初始化。如果初始化作業未在逾時前完成,系統會擲回PlaybackException
,避免播放作業無止盡地停滯。預設情況下,逾時時間會設為零 (#323)。
- 新增
- 測試公用程式:
- 檢查
DataSourceContractTest
中的 URI 配置是否不區分大小寫。
- 檢查
- 移除已淘汰的符號:
- 移除
DefaultAudioSink
建構函式,改用DefaultAudioSink.Builder
。 - 移除
HlsMasterPlaylist
,改用HlsMultivariantPlaylist
。 - 移除
Player.stop(boolean)
。請改用Player.stop()
和Player.clearMediaItems()
(如果reset
是true
)。 - 移除兩個已淘汰的
SimpleCache
建構函式,改用採用DatabaseProvider
的非淘汰建構函式,以提升效能。 - 移除
DefaultBandwidthMeter
建構函式,改用DefaultBandwidthMeter.Builder
。 - 移除
DefaultDrmSessionManager
建構函式,改用DefaultDrmSessionManager.Builder
。 - 移除兩個已淘汰的
HttpDataSource.InvalidResponseCodeException
建構函式,並使用可接受額外欄位(cause
、responseBody
) 的非淘汰建構函式,加強錯誤記錄功能。 - 移除
DownloadHelper.forProgressive
、DownloadHelper.forHls
、DownloadHelper.forDash
和DownloadHelper.forSmoothStreaming
,改用DownloadHelper.forMediaItem
。 - 移除已淘汰的
DownloadService
建構函式,改用未淘汰的建構函式,其中包含提供channelDescriptionResourceId
參數的選項。 - 移除已淘汰的字元集 String 常數 (
ASCII_NAME
、UTF8_NAME
、ISO88591_NAME
、UTF16_NAME
和UTF16LE_NAME
),改用kotlin.text
套件、java.nio.charset.StandardCharsets
或com.google.common.base.Charsets
中的 Kotlin 字元集。 - 移除已淘汰的
WorkManagerScheduler
建構函式,改用非已淘汰的建構函式,其中包含提供Context
參數的選項。 - 移除已淘汰的
createVideoSampleFormat
、createAudioSampleFormat
、createContainerFormat
和createSampleFormat
方法,這些方法用於例項化Format
類別。請改用Format.Builder
建立Format
的例項。 - 移除已淘汰的方法
copyWithMaxInputSize
、copyWithSubsampleOffsetUs
、copyWithLabel
、copyWithManifestFormatInfo
、copyWithGaplessInfo
、copyWithFrameRate
、copyWithDrmInitData
、copyWithMetadata
、copyWithBitrate
和copyWithVideoSize
,改用Format.buildUpon()
和設定器方法。 - 移除已淘汰的
ExoPlayer.retry()
,改用prepare()
。 - 移除已淘汰的零引數
DefaultTrackSelector
建構函式,請改用DefaultTrackSelector(Context)
。 - 移除已淘汰的
OfflineLicenseHelper
建構函式,改用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
。 - 移除已淘汰的
DownloadManager
建構函式,改用採用Executor
的建構函式。 - 移除已淘汰的
Cue
建構函式,改用Cue.Builder
。 - 移除已淘汰的
OfflineLicenseHelper
建構函式,改用OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
。 - 移除四個已淘汰的
AnalyticsListener
方法:onDecoderEnabled
,請改用onAudioEnabled
和/或onVideoEnabled
。- 請改用
onAudioDecoderInitialized
和/或onVideoDecoderInitialized
。onDecoderInitialized
- 請改用
onAudioInputFormatChanged
和/或onVideoInputFormatChanged
。onDecoderInputFormatChanged
onDecoderDisabled
,請改用onAudioDisabled
和/或onVideoDisabled
。
- 移除已淘汰的
Player.Listener.onSeekProcessed
和AnalyticsListener.onSeekProcessed
,改用onPositionDiscontinuity
和DISCONTINUITY_REASON_SEEK
。 - 移除
ExoPlayer.setHandleWakeLock(boolean)
,改用setWakeMode(int)
。 - 移除已淘汰的
DefaultLoadControl.Builder.createDefaultLoadControl()
,改用build()
。 - 移除已淘汰的
MediaItem.PlaybackProperties
,改用MediaItem.LocalConfiguration
。已淘汰的欄位MediaItem.playbackProperties
現在的類型為MediaItem.LocalConfiguration
。
- 移除
1.1.0-rc01 版本
2023 年 6 月 21 日
使用 1.1.0 穩定版。
1.1.0-beta01 版本
2023 年 6 月 7 日
使用 1.1.0 穩定版。
1.1.0-alpha01 版本
2023 年 5 月 10 日
使用 1.1.0 穩定版。
1.0.0 版本
1.0.2 版
2023 年 5 月 18 日
發布了 androidx.media3:media3-*:1.0.2
。1.0.2 版包含此連結所列的修訂項目。
此版本可對應至 ExoPlayer 2.18.7 版。
這個版本包含自 1.0.1 版以來的下列變更:
- 核心程式庫:
- 新增
Buffer.isLastSample()
,表示Buffer
是否包含旗標C.BUFFER_FLAG_LAST_SAMPLE
。 - 修正問題:如果最後一個含有影格的樣本在未讀取「串流結尾」樣本的情況下出列,可能不會轉譯最後一個影格。(#11079)。
- 新增
- 擷取工具:
- 修正 MPEG-TS 檔案中 H.265 SPS 的剖析問題,方法是重新使用 RTSP 和 MP4 擷取器已使用的剖析邏輯 (#303)。
- 文字:
- SSA:針對開頭為位元組順序標記的 UTF-16 檔案新增支援 (#319)。
- 工作階段:
- 修正問題:連線至會更新動作的舊版
MediaSessionCompat
時,MediaController
不會更新可用指令。 - 修正錯誤,避免
MediaLibraryService
無法針對從 System UI 呼叫Callback.onGetLibraryRoot
的情況傳回空值 (API 30 適用) (#355)。params.isRecent == true
- 修正
MediaSessionService
或MediaLibraryService
的記憶體流失問題 (#346)。 - 修正錯誤:合併的
Timeline
和位置更新 (位於MediaSession
中) 可能會導致MediaController
擲回IllegalStateException
。
- 修正問題:連線至會更新動作的舊版
1.0.1 版
2023 年 4 月 18 日
發布了 androidx.media3:media3-*:1.0.1
。1.0.1 版包含以下修訂項目。
此版本可對應至 ExoPlayer 2.18.6 版。
- 核心程式庫:
- 搜尋預設位置時,重設目標直播覆寫 (#11051)。
- 修正媒體中空白樣本串流可能導致播放卡住的錯誤。
- 工作階段:
- 修正錯誤:舊版
MediaSessionCompat
發布的多個相同佇列項目會在MediaController
中導致例外狀況 (#290)。 - 新增遺失的
MediaSession.broadcastCustomCommand
轉送至舊版MediaControllerCompat.Callback.onSessionEvent
(#293)。 - 修正錯誤:呼叫
MediaSession.setPlayer
時,可用指令不會更新。 - 修正問題:如果
TrackSelectionOverride
執行個體參照的群組具有Format.metadata
,系統會忽略從MediaController
傳送的TrackSelectionOverride
執行個體 (#296)。 - 修正問題:
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
必須可供存取,才能透過舊版MediaSessionCompat
存取中繼資料。 - 修正問題:在背景執行緒上的
MediaSession
例項於MediaSessionService
中使用時,會導致當機 (#318)。 - 修正問題:程式庫宣告媒體按鈕接收器,但應用程式並未打算這麼做 (#314)。
- 修正錯誤:舊版
- DASH:
- 修正空白區隔時間軸的處理方式 (#11014)。
- RTSP:
- 如果使用 UDP 的 RTSP 設定失敗,並出現 RTSP 錯誤 461 UnsupportedTransport,請使用 TCP 重試 (#11069)。
1.0.0 版本
2023 年 3 月 22 日
發布了 androidx.media3:media3-*:1.0.0
。1.0.0 版包含此連結所列的修訂項目。
此版本可對應至 ExoPlayer 2.18.5 版。
自 1.0.0-rc02 以來沒有任何異動。
1.0.0-rc02 版
2023 年 3 月 2 日
發布了 androidx.media3:media3-*:1.0.0-rc02
。查看 1.0.0-rc02 版的修訂項。
此版本可對應至 ExoPlayer 2.18.4 版。
- 核心程式庫:
- 下載內容:
- 在
SegmentDownloader
和子類別 (#248) 中,將要合併的兩個區隔的開始時間最大差異設為可設定。
- 在
- 音訊:
- 影片:
- 將 HEVC HDR10 格式對應至
HEVCProfileMain10HDR10
,而非HEVCProfileMain10
。 - 針對 Chromecast (支援 Google TV) 和 Lenovo M10 FHD Plus 裝置問題新增解決方法,此問題會導致 60 fps AVC 串流標示為不支援 (#10898)。
- 修正影格發布效能問題,這類問題會在播放影格速率遠高於螢幕刷新率的媒體時發生。
- 將 HEVC HDR10 格式對應至
- 投放:
- 修正在媒體項目之間轉場時發生的暫時性
STATE_IDLE
問題 (#245)。
- 修正在媒體項目之間轉場時發生的暫時性
- RTSP:
- 在剖析無效的 RTSP Describe 回應訊息時,擷取擲回的 IllegalArgumentException (#10971)。
- 工作階段:
- 修正通知的播放/暫停按鈕不會隨著播放器狀態更新的錯誤 (#192)。
- IMA 擴充功能:
- 修正錯誤:如果 DAI 串流沒有任何廣告,系統不會收到第一個 (也是唯一一個)
LOADED
事件,導致串流無法啟動。
- 修正錯誤:如果 DAI 串流沒有任何廣告,系統不會收到第一個 (也是唯一一個)
1.0.0-rc01 版
2023 年 2 月 16 日
發布了 androidx.media3:media3-*:1.0.0-rc01
。1.0.0-rc01 版包含以下修訂項目。
此版本可對應至 ExoPlayer 2.18.3 版。
- 核心程式庫:
- 調整轉譯器的解碼器排序邏輯,以維持
MediaCodecSelector
的偏好設定,即使解碼器回報可能無法順利播放媒體亦然。舉例來說,在預設選取器中,系統會優先採用僅提供功能性支援的硬體解碼器,而非完全支援格式的軟體解碼器。(#10604)。 - 新增
ExoPlayer.Builder.setPlaybackLooper
,可為新的 ExoPlayer 執行個體設定既有的播放執行緒。 - 允許清除下載管理員協助程式。(#10776)。
- 新增參數至
BasePlayer.seekTo
,以指示用於搜尋的指令。 - 在 API 21 以上版本載入可繪項目時使用主題。(#220)。
- 新增
ConcatenatingMediaSource2
,允許將多個媒體項目合併至單一視窗。(#247)。
- 調整轉譯器的解碼器排序邏輯,以維持
- 擷取工具:
- 剖析 trak atom 時,如果範例資料表 (stbl) 缺少必要的範例說明 (stsd),則請擲回
ParserException
而非NullPointerException
。 - 在 fMP4 中直接搜尋同步影格時,正確略過範例 (#10941)。
- 剖析 trak atom 時,如果範例資料表 (stbl) 缺少必要的範例說明 (stsd),則請擲回
- 音訊:
- 使用壓縮的音訊格式位元率來計算直接播放 (直通) 中
AudioTrack
的緩衝區大小下限。
- 使用壓縮的音訊格式位元率來計算直接播放 (直通) 中
- 文字:
- 如果字幕檔案不含任何提示,請修正
TextRenderer
將無效 (負面) 索引傳遞至Subtitle.getEventTime
的問題。 - SubRip:針對開頭為位元組順序標記的 UTF-16 檔案新增支援。
- 如果字幕檔案不含任何提示,請修正
- 中繼資料:
- 依據 ID3 v2.4 的許可,從 ID3 影格剖析多個以空值分隔的值。
- 新增
MediaMetadata.mediaType
,來表示內容類型或中繼資料說明的資料夾類型。 - 新增
MediaMetadata.isBrowsable
以取代MediaMetadata.folderType
。資料夾類型會在下一個版本中淘汰。
- DASH:
- 為圖片調整集新增完整剖析功能,包括圖塊數量。(#3752)。
- UI:
- 工作階段:
- 新增抽象
SimpleBasePlayer
,以協助實作自訂播放器的Player
介面。 - 新增輔助方法,將平台工作階段符記轉換為 Media3
SessionToken
(#171)。 - 使用
onMediaMetadataChanged
觸發平台媒體工作階段的更新作業 (#219)。 - 將媒體工作階段新增為
getMediaButtons()
的DefaultMediaNotificationProvider
引數,並使用不可變動的清單以確保清晰度。(#216)。 - 新增
onSetMediaItems
回呼監聽器,提供修改/設定MediaItem
清單的方式,在播放器上設定索引和位置之前,依工作階段起始索引和位置 (#156)。 - 避免在非藍牙媒體按鈕事件上輕觸兩下偵測 (#233)。
- 使
QueueTimeline
出現可疑的舊版工作階段狀態時更可靠 (#241)。
- 新增抽象
- 中繼資料:
- 依據 ID3 v2.4 的許可,從 ID3 影格剖析多個以空值分隔的值。
- 新增
MediaMetadata.mediaType
,來表示內容類型或中繼資料說明的資料夾類型。 - 新增
MediaMetadata.isBrowsable
以取代MediaMetadata.folderType
。資料夾類型會在下一個版本中淘汰。
- Cast 擴充功能:
- 將 Cast SDK 版本遞增升級至 21.2.0。
- IMA 擴充功能:
- 移除應用程式執行緒上
ImaServerSideAdInsertionMediaSource
的播放器監聽器,以免發生執行緒問題。 - 將屬性
focusSkipButtonWhenAvailable
新增至ImaServerSideAdInsertionMediaSource.AdsLoader.Builder
,以要求在電視裝置上聚焦略過按鈕,並根據預設將其設定為 true。 - 將方法
focusSkipButton()
新增至ImaServerSideAdInsertionMediaSource.AdsLoader
,以程式輔助方式要求聚焦略過按鈕。 - 將 IMA SDK 版本遞增升級至 3.29.0。
- 移除應用程式執行緒上
- 試用版應用程式:
- 在執行階段要求下載通知的通知權限。(#10884)。
1.0.0-beta03 版
2022 年 11 月 22 日
發布了 androidx.media3:media3-*:1.0.0-beta03
。1.0.0-beta03 版包含此連結所列的修訂項目。
此版本可對應至 ExoPlayer 2.18.2 版。
- 核心程式庫:
- 新增
ExoPlayer.isTunnelingEnabled
來檢查目前所選的音軌是否已啟用穿隧。(#2518)。 - 新增
WrappingMediaSource
來將換行簡化為MediaSource
。(#7279)。 - 在播放因可用記憶體不足而卡住時捨棄背景緩衝區。
- 啟用卸載時關閉追蹤「doSomeWork」區塊。
- 修正
PlaybackStatsListener
中快速跳轉的工作階段追蹤問題。(#180)。 - 在單一項目播放清單中呼叫
seekToNext
或seekToPrevious
時,傳送缺少的onMediaItemTransition
回呼 (#10667)。 - 新增
Player.getSurfaceSize
,傳回影片算繪所在途徑的大小。 - 修正在播放器釋出期間移除事件監聽器會導致
IllegalStateException
的錯誤。(#10758)。
- 新增
- 版本:
- 強制執行最低
compileSdkVersion
,以避免編譯錯誤。(#10684)。 - 避免包含在其他 Gradle 版本時,發布模塊。
- 強制執行最低
- 音軌選取:
- 如果螢幕不支援 Dolby Vision,則使用其他音軌。 (#8944)。
- 下載內容:
- 影片:
- 如果螢幕不支援 Dolby Vision,不妨試試替代解碼器。 (#9794)。
- 音訊:
- 將
SingleThreadExecutor
用於發布AudioTrack
執行個體,以免同時發布多個播放器時發生 OutOfMemory 錯誤。(#10057)。 - 已針對 AudioTrack 卸載狀態新增
AudioOffloadListener.onExperimentalOffloadedPlayback
。(#134)。 - 始
AudioTrackBufferSizeProvider
成為公用介面。 - 新增
ExoPlayer.setPreferredAudioDevice
以設定偏好的音訊輸出裝置 (#135)。 - 將
androidx.media3.exoplayer.audio.AudioProcessor
重新命名為androidx.media3.common.audio.AudioProcessor
。 - 將 8 聲道和 12 聲道音訊對應到所有 7.1 和 7.1.4 聲道遮罩 (#10701)。
- 將
- 中繼資料:
- 現在可以設定
MetadataRenderer
,以在中繼資料可用時盡快轉譯。建立具有MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
的執行個體,以指定轉譯器要否要提早輸出中繼資料,或與播放器位置同步。
- 現在可以設定
- DRM:
- 解決 Android 13 ClearKey 實作中的錯誤,該錯誤會傳回非空白但無效的授權網址。
- 修正在播放清單中切換數位版權管理配置 (例如 Widevine 至 ClearKey) 時會發生
setMediaDrmSession failed: session not opened
錯誤。
- 文字:
- CEA-608:確保系統正確處理欄位 2 的服務切換指令。(#10666)。
- DASH:
- 從資訊清單中剖析
EventStream.presentationTimeOffset
(#10460)。
- 從資訊清單中剖析
- UI:
- 將播放器目前的覆寫設定做為
TrackSelectionDialogBuilder
中的預設值使用 (#10429)。
- 將播放器目前的覆寫設定做為
- 工作階段:
- 即使某些需要非同步解析,仍可確保指令以正確順序執行 (#85)。
- 新增
DefaultMediaNotificationProvider.Builder
以建構DefaultMediaNotificationProvider
執行個體。建構工具可以設定供應商使用的通知 ID、通知管道 ID 和通知管道名稱。此外,請新增方法DefaultMediaNotificationProvider.setSmallIcon(int)
,以設定通知小圖示。(#104)。 - 確保在不捨棄
MediaController.release()
前傳送指令。(#99)。 SimpleBitmapLoader
可以從file://
URI 載入點陣圖 (#108)。- 修正防止
MediaController
在一段時間內搜尋廣告 (#122) 的斷言。 - 播放結束後,
MediaSessionService
就會停止在前景播放,並顯示可重新啟動播放上一次所播放媒體項目的通知。(#112)。 - 請勿為了暫停而啟動具有待處理意圖的前景服務。(#167)。
- 手動隱藏與
DefaultNotificationProvider
在 API 26 和 API 27 (API 28 以上版本會自動隱藏標記) 上建立通知相關聯的「標記」(#131)。 - 修正從舊版 MediaSession 至 Media3 MediaController 的第二個繫結機制連線導致 IllegalStateException 的錯誤。(#49)。
- RTSP:
- 我是:
- FFmpeg 擴充功能:
- 新增必要的旗標,以連結 FFmpeg 程式庫與 NDK 23.1.7779620 以上版本 (#9933)。
- AV1 擴充功能:
- 請更新 CMake 版本,以免與最新的 Android Studio 版不相容 (#9933)。
- Cast 擴充功能:
- 實作
getDeviceInfo()
,以便在使用MediaController
控制播放時能夠識別CastPlayer
。(#142)。
- 實作
- 轉換程式:
- 新增多工器監控計時器,以偵測何時產生輸出樣本時太慢。
- 移除已淘汰的符號:
- 移除
Transformer.Builder.setOutputMimeType(String)
。這項功能已停用。使用預設多工器時,MIME 類型一律為 MP4。
- 移除
1.0.0-beta02 版
2022 年 7 月 21 日
發布了 androidx.media3:media3-*:1.0.0-beta02
。查看 1.0.0-beta02 版的修訂項。
此版本可對應至 ExoPlayer 2.18.1 版。
- 核心程式庫:
- 確認透過
ExoPlayer.setShuffleOrder
變更ShuffleOrder
會導致使用reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
向Player.Listener#onTimelineChanged
呼叫 (#9889)。 - 如果是漸進式媒體,請只加入在緩衝處理位置選取的曲目 (#10361)。
- 允許所有 ExoPlayer 記錄輸出使用自訂記錄器 (#9752)。
- 修正
DefaultMediaSourceFactory
中的setDataSourceFactory
實作,在某些情況下無法正常運作的問題 (#116)。
- 確認透過
- 擷取工具:
- DASH:
- 從資訊清單中剖析 ClearKey 授權網址 (#10246)。
- UI:
- 確保 TalkBack 會在播放控制項選單中公告目前使用中的速度選項 (#10298)。
- RTSP:
- 新增 VP8 片段化封包處理 (#110)。
- Leanback 擴充功能:
- 監聽
LeanbackAdapter
中的playWhenReady
變更 (10420)。
- 監聽
- 投放:
1.0.0-beta01 版
2022 年 6 月 16 日
發布了 androidx.media3:media3-*:1.0.0-beta01
。1.0.0-beta01 版包含此連結所列的修訂項目。
這與 ExoPlayer 2.18.0 版相對應。
- 核心程式庫:
- 透過
MediaMetricsManager
啟用 Android 平台診斷支援功能。ExoPlayer 會向平台傳送播放事件和效能資料,有助於在裝置提供系統效能與偵錯資訊。如果裝置使用者已啟用分享使用狀況與診斷資料功能,則 Google 也可能會收集以上資料。您可以透過ExoPlayer.Builder.setUsePlatformDiagnostics(false)
,讓應用程式選擇不採用 ExoPlayer 的平台診斷貢獻功能。 - 修正使用
MergingMediaSource
會造成音軌重設過度頻繁的問題,例如在播放途中側載字幕及變更選取的字幕便會發生這個情況 (#10248)。 - 停止在 API 29 及 30 偵測 5G-NSA 網路類型。這些播放動作會假設是透過 4G 網路進行。
- 不允許將
null
傳遞至MediaSource.Factory.setDrmSessionManagerProvider
和MediaSource.Factory.setLoadErrorHandlingPolicy
。如有必要,可以明確傳遞DefaultDrmSessionManagerProvider
和DefaultLoadErrorHandlingPolicy
的執行個體。 - 新增
MediaItem.RequestMetadata
,方便在LocalConfiguration
還不明確時,代表播放媒體所需的中繼資料。另外也移除MediaMetadata.mediaUrl
,因為現在這個中繼資料已內含在RequestMetadata
。 - 新增
Player.Command.COMMAND_SET_MEDIA_ITEM
,以便讓播放器設定單翼項目。
- 透過
- 音軌選取:
- 將
TrackSelectionOverrides
類別壓平合併至TrackSelectionParameters
,並將TrackSelectionOverride
升級至頂層類別。 - 將
TracksInfo
重新命名為Tracks
,並將TracksInfo.TrackGroupInfo
重新命名為Tracks.Group
。Player.getCurrentTracksInfo
和Player.Listener.onTracksInfoChanged
也已經重新命名為Player.getCurrentTracks
和Player.Listener.onTracksChanged
。這包括「取消淘汰」Player.Listener.onTracksChanged
方法名稱,不過參數類型不同。 - 將
DefaultTrackSelector.buildUponParameters
和DefaultTrackSelector.Parameters.buildUpon
變更為回傳DefaultTrackSelector.Parameters.Builder
,而不是已淘汰的DefaultTrackSelector.ParametersBuilder
。 - 新增系統預設啟用的
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
。啟用後,DefaultTrackSelector
會偏好使用頻道數量並未超出裝置輸出能力範圍的音軌。在手持裝置上,DefaultTrackSelector
比起多頻道音訊格式更偏好使用立體聲/單聲道,除非多頻道格式可以設定空間音訊 (Android 12L 以上) 或是 Dolby 環場音效格式。另外,若在可以支援空間音訊的裝置上,則DefaultTrackSelector
會監控空間音訊化屬性的變更情況,並在變更時觸發選取新的音軌。設有television
UI 模式的裝置不受這些限制,系統會偏好使用最多頻道數量的格式。如要啟用這項功能,必須用Context
建構DefaultTrackSelector
執行個體。
- 將
- 影片:
- 將
DummySurface
重新命名為PlaceholderSurface
。 - 新增
MediaCodecVideoRenderer.getCodecMaxInputSize
的 AV1 支援功能。
- 將
- 音訊:
- 使用 LG AC3 音訊解碼器通告非標準的 MIME 類型。
- 將
AudioAttributes.getAudioAttributesV21()
的傳回類型從android.media.AudioAttributes
變更為新的AudioAttributesV21
包裝函式類別,防止 API 21 以下會發生 ART 驗證過慢的情況。 - 在 HTTP 即時串流不分區塊準備時,會發生未設定格式音訊頻道數量的情況,此時請查詢平台 (API 29 以上) 或為音訊直通假設音訊編碼頻道數量 (10204)。
- 如果解碼器輸出 12 頻道 PCM 音訊,請用頻道遮罩
AudioFormat.CHANNEL_OUT_7POINT1POINT4
設定AudioTrack
(#10322)。
- DRM
- 如果在變更格式後需要立即尋求 DRM 工作階段,請確定 DRM 工作階段一律可以正常更新 (10274)。
- 文字:
- 將
Player.getCurrentCues()
變更為回傳CueGroup
,而不是List<Cue>
。 - SSA:在
BorderStyle == 3
的情況下支援OutlineColour
樣式設定 (也就是說OutlineColour
會設定提示的背景) (#8435)。 - CEA-708:將資料剖析為多個服務區塊,並忽略並未和目前選取的服務編號相關的區塊。
- 移除
RawCcExtractor
,這個項目只有 Google 內部字幕格式使用。
- 將
- 擷取工具:
- UI:
- 修正
useController=false
時,在PlayerView
上遞送事件到OnClickListener
組合的問題 (#9605)。同時,修正所有檢視畫面設定的遞送事件到OnLongClickListener
的問題。 - 修正在
ACTION_UP
之前,誤將退出PlayerView
邊界的觸控事件序列視為點擊的問題 (#9861)。 - 修正
PlayerView
輕觸時可能會觸發播放而不是隱藏控制項的無障礙功能問題 (#8627)。 - 重新編寫
TrackSelectionView
和TrackSelectionDialogBuilder
,以便正確搭配Player
介面使用,而不是ExoPlayer
。這樣做可讓檢視畫面和其他Player
實作內容一同使用,並可移除 UI 模組對於 ExoPlayer 模組的依附性。這是一項破壞性變更。 - 不在
PlayerView
音軌選取器內顯示強制文字音軌,當選擇「None」(無) 時,保留合適的強制文字音軌 (#9432)。
- 修正
- DASH:
- 從 DTS
AudioChannelConfiguration
元素剖析頻道數量,這樣便能重新啟用 DTS 串流的音訊直通 (#10159)。 - 禁止將
null
傳遞至DashMediaSource.Factory.setCompositeSequenceableLoaderFactory
。如果有必要的話,可以明確傳遞DefaultCompositeSequenceableLoaderFactory
的執行個體。
- 從 DTS
- HLS:
- 如果播放清單的轉碼器屬性並未含有該音訊轉碼器,則使用備用的分區塊準備 (#10065)。
- 禁止將
null
傳遞至HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
、HlsMediaSource.Factory.setPlaylistParserFactory
及HlsMediaSource.Factory.setPlaylistTrackerFactory
。如有需要,可以明確傳遞DefaultCompositeSequenceableLoaderFactory
和DefaultHlsPlaylistParserFactory
的執行個體或DefaultHlsPlaylistTracker.FACTORY
的參考資料。
- 流暢串流:
- 禁止將
null
傳遞至SsMediaSource.Factory.setCompositeSequenceableLoaderFactory
。如果有必要的話,可以明確傳遞DefaultCompositeSequenceableLoaderFactory
的執行個體。
- 禁止將
- RTSP:
- 新增 H263 的 RTP 讀取工具 (#63)。
- 新增 MPEG4 的 RTP 讀取工具 (#35)。
- 新增 HEVC 的 RTP 讀取工具 (#36)。
- 新增 AMR 的 RTP 讀取工具。目前僅支援單頻道和非交錯 AMR 串流。不支援複合 AMR RTP 酬載。 (#46)
- 新增 VP8 的 RTP 讀取工具 (#47)。
- 新增 WAV 的 RTP 讀取工具 (#56)。
- 修正 RTSP 基本授權標頭。(#9544)。
- 停止檢查強制性的 SDP 欄位,因為 ExoPlayer 不需要這些欄位 (#10049)。
- 在剖析 RTSP 時間點時擲回已檢查過的例外狀況 (#10165)。
- 新增 VP9 的 RTP 讀取工具 (#47)。
- 新增 OPUS 的 RTP 讀取工具 (#53)。
- 資料來源:
- 將
DummyDataSource
重新命名為PlaceholderDataSource
。 - 解決 OkHttp 中斷處理的問題。
- 將
- 工作階段:
- 將
MediaSession.MediaItemFiller
替換為MediaSession.Callback.onAddMediaItems
,以便要求使用非同步解析。 - 當
MediaController
連結到舊版工作階段時,支援setMediaItems(s)
方法。 - 移除
MediaController.setMediaUri
和MediaSession.Callback.onSetMediaUri
。您可以用MediaController.setMediaItem
和MediaSession.Callback.onAddMediaItems
達到相同功能。 - 將舊版的
MediaController
播放媒體呼叫傳遞給MediaSession.Callback.onAddMediaItems
,而不是onSetMediaUri
。 - 新增
MediaNotification.Provider
和DefaultMediaNotificationProvider
,以便自訂通知內容。 - 新增
BitmapLoader
和SimpleBitmapLoader
,以便下載作品圖片。 - 新增
MediaSession.setCustomLayout()
,以便為舊版工作階段提供回溯相容性。 - 新增
MediaSession.setSessionExtras()
,以便提供和舊版工作階段同等的功能。 - 將
MediaSession.MediaSessionCallback
重新命名為MediaSession.Callback
,MediaLibrarySession.MediaLibrarySessionCallback
重新命名為MediaLibrarySession.Callback
,並將MediaSession.Builder.setSessionCallback
重新命名為setCallback
。 - 修正
MediaControllerImplLegacy
中的 NPE (#59)。 - 更新時間軸的工作階段位置 (#51)。
- 修正釋放控制器之後
MediaControllerImplBase
裡的 NPE (#74)。
- 將
- 廣告播放 / IMA:
- 將廣告輪詢頻率從 100 毫秒降為 200 毫秒,以符合美國媒體評議會 (MRC) 建議內容。
- FFmpeg 擴充功能:
- 將 CMake 版本更新至
3.21.0+
,以避免發生導致 AndroidStudio Gradle 同步化失敗的 CMake 錯誤 (#9933)。
- 將 CMake 版本更新至
- 移除已淘汰的符號:
- 移除
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
。改用Player.Listener.onTracksChanged(Tracks)
。 - 移除
Player.getCurrentTrackGroups
和Player.getCurrentTrackSelections
。請改用Player.getCurrentTracks
。您也可以繼續使用ExoPlayer.getCurrentTrackGroups
和ExoPlayer.getCurrentTrackSelections
,不過這些項目會繼續視為已淘汰的方法。 - 移除
DownloadHelper
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
和DEFAULT_TRACK_SELECTOR_PARAMETERS
等常數。請盡量改為使用getDefaultTrackSelectorParameters(Context)
或DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
。 - 移除建構函式
DefaultTrackSelector(ExoTrackSelection.Factory)
。請改用DefaultTrackSelector(Context, ExoTrackSelection.Factory)
。 - 移除
Transformer.Builder.setContext
。Context
應改為傳遞至Transformer.Builder
建構函式。
- 移除
1.0.0-alpha03 版本
2022 年 3 月14 日
發布了 androidx.media3:media3-*:1.0.0-alpha03
。查看 1.0.0-alpha03 版的修訂項。
這與 ExoPlayer 2.17.1 版相對應。
- 音訊:
- 修正在 HLS 中檢查 Dolby Atmos (E-AC3-JOC) 音訊功能時發生的錯誤。
- 擷取工具:
- FMP4:修正針對同時包含 v0 和 v1 emsg Atom 的串流,emsg 範例中繼資料可能以錯誤順序輸出的問題 (#9996)。
- 文字:
- 修正
SingleSampleMediaSource.Factory.setTrackId
和MediaItem.SubtitleConfiguration.Builder.setId
的互動方式,以便優先處理SubtitleConfiguration
欄位;如果未設定,改回使用Factory
值 (#10016)。
- 修正
- 廣告播放:
- 修正即時 HLS SSAI 串流中,廣告時段之間的音訊欠載問題。
1.0.0-alpha02 版
2022 年 3 月 2 日
發布了 androidx.media3:media3-*:1.0.0-alpha02
。1.0.0-alpha02 版包含此連結所列的修訂項目。
這與 ExoPlayer 2.17.0 版相對應。
- 核心程式庫:
- 新增受保護的方法
DefaultRenderersFactory.getCodecAdapterFactory()
,讓覆寫buildVideoRenderers()
或buildAudioRenderers()
的DefaultRenderersFactory
子類別可以存取轉碼器轉接器工廠,並將其傳遞至所建立的MediaCodecRenderer
執行個體。 - 將 ICY 標頭欄位
name
和genre
分別傳播至MediaMetadata.station
和MediaMetadata.genre
,這樣他們才能透過Player.Listener.onMediaMetadataChanged()
到達應用程式 (#9677 )。 - 從
DefaultHttpDataSource#getResponseHeaders
移除空值索引鍵。 - 建立
MediaCodec
執行個體失敗時,休眠然後再試一次。這個方法適用於部分裝置將途徑從安全轉碼器切換至其他轉碼器時發生的問題 (#8696)。 - 新增
MediaCodecAdapter.getMetrics()
,以便讓使用者從MediaCodec
取得指標資料。(#9766)。 - 修正 Maven 依附元件解析度 (#8353)。
- 針對未啟用低延遲功能或使用者要求設定速度的直播,停用自動速度調整項 (#9329)。
- 將
DecoderCounters#inputBufferCount
重新命名為queuedInputBufferCount
。 - 將
SimpleExoPlayer.renderers
設為私人。轉譯器可透過ExoPlayer.getRenderer
存取。 - 已將部分
AnalyticsListener.EventFlags
常數值更新為符合Player.EventFlags
中的值。 - 將
AnalyticsCollector
分割為介面和預設實作作業,若應用程式不需要,即可用 R8 將其移除。
- 新增受保護的方法
- 音軌選取:
- 在音軌選取中支援偏好的影片角色旗標 (#9402)。
- 更新影片音軌選取邏輯,在選取多重影片音軌以便調整時,採用偏好的 MIME 類型和角色旗標 (#9519)。
- 更新影片和音軌選取邏輯,僅選擇具有相同解碼器和硬體支援等級的可調整選項格式 (#9565)。
- 更新影片軌選取邏輯,如果主要的硬體加速解碼器支援多個轉碼器,則偏好選用效率較高的轉碼器 (#4835)。
- 偏好音訊內容偏好設定 (例如「預設」音軌或符合系統語言代碼語言的音軌),而不是技術音軌選取限制 (例如偏好的 MIME 類型或頻道數量上限)。
- 修正音軌選取問題:覆寫其中一個音軌組時,並未停用相同類型的其他音軌組 (#9675)。
- 修正未正確套用非空白及空白混合音軌覆寫的音軌選取問題 (#9649)。
TrackGroupArray
中TrackGroup
禁止重複。您隨時可以在TrackGroup
建構函式中設定id
,藉此區分TrackGroup
。此做法修正使用主動音軌覆寫後,在應用程式背景作業後恢復播放時發生的異常終止問題 (#9718)。- 修正
AdaptiveTrackSelection
中的邏輯,允許在網路頻寬足夠時提高品質,即使播放品質已非常接近目前最佳串流品質 (#9784)。
- 影片:
- 修正 Dolby Vision 中的解碼器備用邏輯,視需要使用相容的 H264/H265 解碼器。
- 音訊:
- 擷取工具:
- 文字:
- DRM:
- 從
DrmSessionManager.(pre)acquireSession
中playbackLooper
移除。當自訂MediaSource
中的應用程式使用DrmSessionManager
時,必須改將playbackLooper
傳遞至DrmSessionManager.setPlayer
。
- 從
- 廣告播放 / IMA:
- 新增 IMA 動態廣告插播 (DAI) 支援 (#8213)。
- 將方法新增至
AdPlaybackState
以允許重設廣告群組,以便系統再次播放廣告群組 (#9615)。 - 在廣告播放期間強制執行 1.0 的播放速度 (#9018)。
- 修正廣告群組載入失敗,並導致播放立即重設的問題 (#9929)。
- UI:
- DASH:
- HLS:
- RTSP:
- 轉換程式:
- 將最低 API 版本提升至 21。
TransformationException
現已用於描述轉換期間發生的錯誤。- 新增
TransformationRequest
來指定轉換選項。 - 允許註冊多個事件監聽器。
- 修正轉換程式在部分轉碼器輸出讀取後卡住的問題。
- 修正釋出多工器時,
Transformer.getProgress
中可能擲回的 NPE。 - 新增用於套用轉換的試用版應用程式。
- MediaSession 擴充功能:
- 根據預設,
MediaSessionConnector
現在會在停止時清除播放清單。 如果希望應用程式保留播放清單,可在連接器上呼叫setClearMediaItemsOnStop(false)
。
- 根據預設,
- Cast 擴充功能:
- FFmpeg 擴充功能:
- 讓
build_ffmpeg.sh
依賴 LLVM 而非 GNU 的作業區公用程式 (#9933)。
- 讓
- Android 12 相容性:
- 升級 Cast 擴充功能,使其仰賴
com.google.android.gms:play-services-cast-framework:20.1.0
。先前版本的play-services-cast-framework
與指定 Android 12 的應用程式不相容,並在建立PendingIntent
時會因IllegalArgumentException
異常終止 (#9528)。
- 升級 Cast 擴充功能,使其仰賴
- 移除已淘汰的符號:
- 移除
Player.EventListener
。改用Player.Listener
。 - 移除
MediaSourceFactory#setDrmSessionManager
、MediaSourceFactory#setDrmHttpDataSourceFactory
和MediaSourceFactory#setDrmUserAgent
。改用MediaSourceFactory#setDrmSessionManagerProvider
。 - 移除
MediaSourceFactory#setStreamKeys
。改用MediaItem.Builder#setStreamKeys
。 - 移除
MediaSourceFactory#createMediaSource(Uri)
。改用MediaSourceFactory#createMediaSource(MediaItem)
。 - 將
setTag
從DashMediaSource
、HlsMediaSource
和SsMediaSource
中移除。改用MediaItem.Builder#setTag
。 - 移除
DashMediaSource#setLivePresentationDelayMs(long, boolean)
。使用MediaItem.Builder#setLiveConfiguration
和MediaItem.LiveConfiguration.Builder#setTargetOffsetMs
覆寫資訊清單,或使用DashMediaSource#setFallbackTargetLiveOffsetMs
提供備用值。 - 移除
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
。無法再選擇不採用執行緒強制執行功能。 - 移除
ActionFile
和ActionFileUpgradeUtil
。使用 ExoPlayer 2.16.1 以下版,以使用ActionFileUpgradeUtil
將舊版操作檔案合併到DefaultDownloadIndex
。 - 移除
ProgressiveMediaSource#setExtractorsFactory
。改用ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
建構函式。 - 移除
ProgressiveMediaSource.Factory#setTag
和ProgressiveMediaSource.Factory#setCustomCacheKey
。改用MediaItem.Builder#setTag
和MediaItem.Builder#setCustomCacheKey
。 - 移除
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
和DefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
建構函式。改用DefaultRenderersFactory(Context)
建構函式、DefaultRenderersFactory#setExtensionRendererMode
和DefaultRenderersFactory#setAllowedVideoJoiningTimeMs
。 - 移除所有公開的
CronetDataSource
建構函式。改用CronetDataSource.Factory
。
- 移除
- 請將下列
IntDefs
變更為僅限@Target(TYPE_USE)
。這可能會導致 Kotlin 環境中的用量編譯作業中斷,移動備註類型的註解可修正此問題 (Int
)。@AacAudioObjectType
@Ac3Util.SyncFrameInfo.StreamType
@AdLoadException.Type
@AdtsExtractor.Flags
@AmrExtractor.Flags
@AspectRatioFrameLayout.ResizeMode
@AudioFocusManager.PlayerCommand
@AudioSink.SinkFormatSupport
@BinarySearchSeeker.TimestampSearchResult.Type
@BufferReplacementMode
@C.BufferFlags
@C.ColorRange
@C.ColorSpace
@C.ColorTransfer
@C.CryptoMode
@C.Encoding
@C.PcmEncoding
@C.Projection
@C.SelectionReason
@C.StereoMode
@C.VideoOutputMode
@CacheDataSource.Flags
@CaptionStyleCompat.EdgeType
@DataSpec.Flags
@DataSpec.HttpMethods
@DecoderDiscardReasons
@DecoderReuseResult
@DefaultAudioSink.OutputMode
@DefaultDrmSessionManager.Mode
@DefaultTrackSelector.SelectionEligibility
@DefaultTsPayloadReaderFactory.Flags
@EGLSurfaceTexture.SecureMode
@EbmlProcessor.ElementType
@ExoMediaDrm.KeyRequest.RequestType
@ExtensionRendererMode
@Extractor.ReadResult
@FileTypes.Type
@FlacExtractor.Flags
(com.google.android.exoplayer2.ext.flac
套件中)@FlacExtractor.Flags
(com.google.android.exoplayer2.extractor.flac
套件中)@FragmentedMp4Extractor.Flags
@HlsMediaPlaylist.PlaylistType
@HttpDataSourceException.Type
@IllegalClippingException.Reason
@IllegalMergeException.Reason
@LoadErrorHandlingPolicy.FallbackType
@MatroskaExtractor.Flags
@Mp3Extractor.Flags
@Mp4Extractor.Flags
@NotificationUtil.Importance
@PlaybackException.FieldNumber
@PlayerNotificationManager.Priority
@PlayerNotificationManager.Visibility
@PlayerView.ShowBuffering
@Renderer.State
@RendererCapabilities.AdaptiveSupport
@RendererCapabilities.Capabilities
@RendererCapabilities.DecoderSupport
@RendererCapabilities.FormatSupport
@RendererCapabilities.HardwareAccelerationSupport
@RendererCapabilities.TunnelingSupport
@SampleStream.ReadDataResult
@SampleStream.ReadFlags
@StyledPlayerView.ShowBuffering
@SubtitleView.ViewType
@TextAnnotation.Position
@TextEmphasisSpan.MarkFill
@TextEmphasisSpan.MarkShape
@Track.Transformation
@TrackOutput.SampleDataPart
@Transformer.ProgressState
@TsExtractor.Mode
@TsPayloadReader.Flags
@WebvttCssStyle.FontSizeUnit
1.0.0-alpha01 版
2021 年 10 月 27 日
發布了 androidx.media3:media3-*:1.0.0-alpha01
。1.0.0-alpha01 版本包含以下修訂項目。
新功能
Media3 是媒體支援程式庫 (包括 ExoPlayer) 的新園地。第一個 Alpha 版包含下列早期功能性程式庫實作,目的是用於實作媒體應用實例:
- ExoPlayer,這是 Android 的應用程式等級媒體播放器,易於自訂及擴充。
- 媒體工作階段功能,用於公開和控制播放。這個新的工作階段模組使用與 ExoPlayer 相同的
Player
介面。 - 用於建立媒體播放使用者介面的 UI 元件。
- 其他程式庫中可與 ExoPlayer 搭配使用的模組包裝功能,例如透過 IMA SDK 插入廣告。
詳情請參閱 Media3 GitHub 專案。
ExoPlayer 先前是在另一個 ExoPlayer GitHub 專案中代管。在 Media3 中,其套件名稱為 androidx.media3.exoplayer
。我們打算持續維護及發布 ExoPlayer GitHub 專案一段時間,讓應用程式有時間遷移至 Media3。Media3 將取代所有 ExoPlayer 模組 (舊版 Media2 和 mediasession 擴充功能除外,前述兩者會以新版 media3-session
模組取代)。如此一來,不需使用轉接器/連接器類別,就能直接整合播放器及媒體工作階段。