Media3

媒體用途的支援程式庫。
最近更新時間 穩定版 候選版 Beta 版 Alpha 版
2026 年 10 月 26 日 1.11.1 - - 1.12.0-alpha02

宣告依附元件

如果要為 Media3 新增依附元件,您必須將 Google Maven 存放區新增至專案。詳情請參閱 Google 的 Maven 存放區。

在應用程式或模組的 build.gradle 檔案中,新增您需要的構件依附元件:

Groovy

dependencies {
    def media3_version = "1.11.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 Jetpack Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs using Jetpack Compose with Material Design 3
    implementation "androidx.media3:media3-ui-compose-material3:$media3_version"
    // For building media playback UIs using Views
    implementation "androidx.media3:media3-ui:$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 inspecting media files
    implementation "androidx.media3:media3-inspector:$media3_version"
    // For extracting and processing video frames
    implementation "androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames
    implementation "androidx.media3:media3-effect-lottie:$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.11.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 inspecting media files
    implementation("androidx.media3:media3-inspector:$media3_version")
    // For extracting and processing video frames
    implementation("androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames
    implementation("androidx.media3:media3-effect-lottie:$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.12.0 版

1.12.0-alpha02 版

2026 年 10 月 26 日

1.12.0-alpha02 版本包含以下修訂項目。

  • Effect Play 服務:
    • 推出新的 media3-effect-play-services 模組,提供 Google Play 服務媒體效果,包括用於影片強化的 EnhancementSessionDecorator 和用於音訊來源分離的 StudioSoundAudioProcessor。

1.12.0-alpha01 版

2026 年 10 月 21 日

1.12.0-alpha01 版本包含以下修訂項目。

  • 通用程式庫:
    • 新增 C.COLOR_SPACE_DISPLAY_P3,並在 MediaFormatUtil 和 ColorInfo ISO 色彩對應中支援 Display P3 色域。
    • 新增中央 Flags 註冊資料庫,用於管理實驗性功能旗標和階段推出 (Flags.setCanaryModeEnabled)。已遷移許多現有的 @ExperimentalApi 方法,改用新的旗標 API。
    • 新增 MediaMetadata.playlistId、MediaMetadata.Builder.setPlaylistId(String)、MediaMetadata.categories 和 MediaMetadata.Builder.setCategories(List<String>)。
    • 將 androidx.media3.common.util.NonNullApi 替換為 JSpecify org.jspecify.annotations.NullMarked。
  • ExoPlayer:
    • 修正 DASH 多時段播放時,如果下個時段的第一個區塊無法載入,播放就會卡住的問題 (#3396)。
    • 載入重試次數用盡時,在 AnalyticsListener.onLoadError 和 MediaSourceEventListener.onLoadError 中回報 wasCanceled = true。
    • 支援使用 ExoPlayer.addVideoFrameMetadataListener 和 ExoPlayer.removeVideoFrameMetadataListener 註冊多個 VideoFrameMetadataListener 執行個體,並淘汰 ExoPlayer.setVideoFrameMetadataListener 和 ExoPlayer.clearVideoFrameMetadataListener。
    • 分割並偏移每個時段的 AdPlaybackState,即可支援多時段內容 (例如 DASH) 中的廣告。
    • 修正 PreCacheHelper 中的競爭狀況,取消進行中的準備要求仍可能啟動背景下載。
    • 限制 ProgressiveMediaSource 和 DefaultMediaSourceFactory 上的 setLoadOnlySelectedTracks(true),只篩除未選取的影片和圖片軌。系統一律會載入音訊和文字軌,以便順暢切換音軌,不必重新緩衝處理。
    • 預設在 ProgressiveMediaSource 和 DefaultMediaSourceFactory 上啟用 setLoadOnlySelectedTracks(true)。這樣可以節省記憶體,並在未選取所有音軌時,更準確地計算 DefaultLoadControl 緩衝區分配。請注意,如果在播放期間啟用未選取的影片或圖片軌,可能會導致額外的緩衝處理。
    • 修正啟用動態排程時,Player.getCurrentPosition() 可能會傳回過時值 (每秒僅更新幾次) 的問題 (#3286)。
    • 修正 AudioTrack 播放頭位置意外減少或重設,可能誤視為整數溢位,導致播放停滯在緩衝狀態的問題 (#3407)。
    • 移除實驗性 DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean)。
    • 避免從插頁式廣告或廣告返回結尾處剪輯的內容時,不必要地重新啟用轉譯器和發生故障 (#3371)。
    • 修正以下問題:啟用 Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION 時,即將播放的播放清單項目發生轉譯器錯誤,可能會提前中斷目前的播放作業。
    • 修正啟用 Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION 時,ExoPlayer 將轉譯器轉換至未準備好的媒體週期,可能發生的 NullPointerException。
    • 修正啟用 Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS 時,動態排程期間可能會意外略過或捨棄影片影格的問題。
    • 修正直播廣告期間停止播放時,數據分析事件監聽器中的 ArrayIndexOutOfBoundsException (#3423)。
    • 修正以下問題:PreloadMediaSource 可能會在從未呼叫 preload() 時,意外發布預先載入事件 (#3408)。
    • 修正中繼資料軌忽略 Format.subsampleOffsetUs 的問題,這會導致解碼的 SCTE-35 拼接指令中出現不正確的播放時間戳記 (#3413)。
    • 修正對相同來源多次呼叫 preload() 時,PreloadMediaSource 和 DefaultPreloadManager 中的記憶體流失問題 (#3445)。
    • 修正內容時間軸重新整理作業待處理時,釋出 AdsMediaSource 會發生 NullPointerException 的問題 (#3442)。
    • 修正以下問題:在跳轉後載入 (或在非零位置開始播放) 失敗並重試時,漸進式媒體的播放可能會跳至錯誤位置 (#3440)。
    • 新增 Xiaomi TV Stick 4K (MiTV-AYFR0) H.264 解碼器在無縫變更解析度時凍結的解決方法 (#3457)。
    • 修正 SteeringManifestTracker 中的 NullPointerException,在發布的載入完成或錯誤回呼執行前,追蹤器會停止 (#3443)。
    • 支援從 MP4 檔案中的 mebx 盒裝中繼資料軌,播放 HAGC (ST 2094-50) 定時中繼資料。
    • 修正問題:播放清單中準備速度緩慢的媒體時段可能會遭到略過。
  • CompositionPlayer:
    • 支援使用 Composition.Builder.setVideoFrameAggregationParameters 設定影片影格匯總的影格率,以便用於播放工作流程。
    • 在影格匯總期間,選取時間戳記最接近的影格,修正因時間戳記量化或捨入不相符,導致多序列組合結構中影格遺漏的問題。這項功能僅適用於 API 29 以上版本,因為每個影片序列都需要額外保留一個影格。
  • 轉換程式:
    • 支援使用 Composition.Builder.setVideoFrameAggregationParameters 設定影片影格匯總的影格率,以便匯出工作流程。
    • 在影格匯總期間,選取時間戳記最接近的影格,修正因時間戳記量化或捨入不相符,導致多序列組合結構中影格遺漏的問題。這項功能僅適用於 API 29 以上版本,因為每個影片序列都需要額外保留一個影格。
    • 使用 AudioProcessors 時,請遵循 Transformer#setAudioMimeType(AUDIO_RAW)。在修正前,要求 MimeTypes.AUDIO_RAW 並套用 AudioProcessor 會導致輸出內容遭到壓縮。
  • 音軌選取:
    • 修正問題:在某些裝置上,系統會錯誤地優先選擇 SDR 軌,而非支援的 Dolby Vision 軌 (#3135)。
  • 擷取工具:
    • Mp4Extractor:修正 MP4 中 Opus 的 dOps 方塊剖析問題,其中 PreSkip、InputSampleRate 和 OutputGain 未從大端序轉換為小端序,導致在沒有編輯清單時,前 ~299 毫秒的音訊會遭到捨棄 (#3431)。
    • 移除 Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES、Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265、FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES 和 FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265,因為 H.264 和 H.265 的 GOP 內樣本依附元件剖析功能預設為啟用。
    • Mp4Extractor:修正從包含高度座標的 xyz 方塊剖析地點中繼資料,以填入 Mp4LocationData 的問題。
    • 新增 ExtractorUtil.getFramesPerEncodedSample,計算編碼音訊格式每個樣本的音訊影格數 (#3367)。
    • 在 Mp4Extractor 中新增 FLAG_READ_XMP_METADATA,從頂層 UUID 方塊擷取 XMP 中繼資料。
    • 在 PsExtractor 中,先從每個 PES 封包中移除 private_stream_1 子串流標頭,再將酬載傳遞至音訊讀取器,藉此修正播放 DVD 樣式 MPEG-PS 內容時,AC-3、DTS 和 LPCM 音訊損毀的問題 (#3327)。
    • 修正第 1 版 tfdt 方塊編碼負 baseMediaDecodeTime 時,FragmentedMp4Extractor 失敗的問題 (#3412)。
    • MPEG-TS:支援剖析 H.264 和 H.265 影格封裝排列 SEI 訊息,以填入 Format.stereoMode (#3419)。
    • 剖析 Dolby Vision Profile 20 設定資料,並拒絕不支援的 Dolby Vision 設定檔,而不是以不正確的顏色播放標準 HEVC (#3427)。
    • MP3:還原 LAME/Xing 編碼器延遲和填補中繼資料調整,因為與許多 MediaCodec MP3 解碼器不相容 (#3425)。
    • Matroska:修正剖析巢狀 ChapterAtom 元素時的 NullPointerException (#3438)。
    • Ogg:修正錯誤,避免大小為 255 位元組倍數且在頁面邊界結束的封包與後續封包合併。
    • MP4:剖析 Mp4Extractor 和 FragmentedMp4Extractor 中 mebx 方格的時間中繼資料軌。含有 it35 金鑰的音軌會公開為 MimeTypes.APPLICATION_ITUT_T35 (啟用 HAGC 播放)。除非設定 FLAG_EMIT_RAW_MEBX_DATA,否則系統會忽略其他 mebx 軌。如果設定 FLAG_EMIT_RAW_MEBX_DATA,所有 mebx 軌都會以原始 MimeTypes.APPLICATION_MEBX 的形式發出。
    • Ogg:支援擷取 Opus 結尾邊框間距,以便無縫播放 (#2576),並在跳轉至以連續封包開頭的頁面後,修正樣本時間戳記。
    • Ogg:忽略串流中的 Opus ID 和註解標頭封包,修正鏈結 Ogg Opus 串流中的解碼錯誤和約 1 秒的時間戳記跳躍。
  • 檢查器:
    • 支援使用 MetadataRetriever 從 MP4 檔案擷取 XMP 中繼資料。
    • 支援將 MediaExtractorCompat 中的 mebx 盒裝定時中繼資料軌擷取為 MimeTypes.APPLICATION_MEBX。
  • 檢查器頁框:
    • 使用 FrameExtractor 擷取 Ultra HDR 影格時,修正 SDR 基本圖片中廣色域 BT.2020 色彩的裁剪問題。色域外的顏色現在會輕微壓縮至 sRGB 色域,而非遭到截斷。
  • 音訊:
    • 針對在錯誤執行緒上叫用 android.media.AudioDeviceCallback 的裝置,新增解決方法 (#3386)。
    • 修正使用壓縮卸載功能切換曲目後,播放可能停滯的問題。
    • 解決 Amazon Fire TV Stick 在時段轉換期間,AC-3 音訊可能凍結的問題 (#3448)。
    • 支援修剪 Ogg 和 WebM/Matroska Opus 無縫播放的串流結尾編碼器邊框間距 (#2576)。
    • 修正動態卸載無縫延遲和曲目轉換期間的填補更新,以便套用至即將播放的曲目,而非正在播放的曲目。
    • 除了播放清單中的無縫轉場效果外,還會修剪單一串流和播放清單中最終串流的編碼器結尾邊框間距 (#2576)。
    • 在串流開頭編碼器延遲修剪完成後,且不需要修剪串流結尾邊框時,避免在 TrimmingAudioProcessor 中複製不必要的音訊緩衝區。
  • 影片:
    • 修正釋出時間戳記相同的延遲影片影格回報方式,改為回報為捨棄而非略過。
  • 文字:
    • 新增 MediaItem.SubtitleConfiguration.timeOffsetUs,即可相對於媒體,調整側載字幕的時間戳記。播放期間,可以使用 Player.replaceMediaItem(int, MediaItem) 變更偏移量,而不會中斷播放 (#1976)。
    • SubRip:新增支援,可將 CharsetDetector 插入 DefaultSubtitleParserFactory,偵測沒有位元組順序標記的獨立 SubRip 字幕字元編碼 (#2247)。
  • 效果:
    • 使用 StudioSound GMSCore 模組,實作 SoundSeparationAudioProcessor 來分離音訊來源。
  • 多工器:
    • 修正 Mp4Muxer 和 FragmentedMp4Muxer 中 Opus 的 dOps 方塊寫入問題,其中 PreSkip、InputSampleRate 和 OutputGain 是以小端序而非大端序寫入 (#3431)。
    • 支援使用 Mp4Muxer 在 Mp4LocationData 中寫入 GPS 海拔高度。
    • 新增 Muxer.Factory.create(ParcelFileDescriptor),允許直接多工處理至 ParcelFileDescriptor。
    • 根據預設,在分段 MP4 檔案的 traf 方塊中寫入 tfdt (Track Fragment Base Media Decode Time) 方塊,提供媒體解碼時間戳記。
    • 支援在 Mp4Muxer 中寫入 E-AC-3 和 E-AC-3 JOC (Dolby Atmos) dec3 容器方塊。
    • 新增 MediaMuxerCompat 的 WebM 格式支援。
    • 在分段 MP4 檔案結尾寫入 mfra (電影片段隨機存取) 方塊,以便使用 FLAG_READ_MFRA_FOR_SEEK_MAP 在 FragmentedMp4Extractor 中搜尋。
    • 修正問題:在寫入其他樣本前,寫入 EOS 樣本會導致 Mp4Writer 和 FragmentedMp4Writer 當機。
    • 在容器標頭中宣傳 dby1 相容品牌,修正將 Dolby 內容多工處理至 MP4 或片段 MP4 檔案時的容器相容性 (#3369)。
    • 支援 Mp4Muxer 和 FragmentedMp4Muxer 中的 32 位元浮點 PCM 音軌 (#3389)。
    • 新增音軌時,拒絕 Mp4Muxer 和 FragmentedMp4Muxer 中不支援的 Dolby Vision 設定檔。
    • 支援 Mp4Muxer 和 FragmentedMp4Muxer 中的 24 位元和 32 位元整數 PCM 音軌。
  • IMA 擴充功能:
    • 在 ImaServerSideAdInsertionMediaSource 中,將播放器暫停和繼續事件轉送至 IMA SDK。
  • 工作階段:
    • 新增 MediaConstants.EXTRAS_KEY_PLAYLIST_ID、MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE、MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI 和 MediaConstants.EXTRAS_KEY_CATEGORIES,從舊版中繼資料和說明填入播放清單和項目中繼資料,並新增 MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE 和 MediaConstants.EXTRAS_KEY_TTL_SECONDS,用於建議 LibraryParams.extras。
    • 修正了在強制執行嚴格 PendingIntent 限制的裝置上,建立或釋出 MediaSession 時發生的 SecurityException 異常終止問題。
    • 修正以下問題:在 Android 12 (API 31 和 32) 上,當 MediaSessionService 尚未在前景執行時,MediaSession.getControllerForCurrentRequest() 會在播放要求期間傳回 null。
    • 修正 MediaController 連線至回報負數最大音量的舊版工作階段時,IllegalArgumentException 異常終止的問題。
    • 修正以下問題:在暫停的舊版 MediaSessionCompat 上呼叫 MediaController.setMediaItem 或 setMediaItems,然後呼叫 play(),可能會調度不支援的 onPrepareFrom* 回呼,而不是 onPlayFrom*,或調度 onPlay(),而不重新初始化要求的媒體項目。
    • 修正收到自訂指令回應時,舊版 MediaBrowser 中的 NullPointerException (#3432)。
    • 修正 IllegalArgumentException 接收舊版中繼資料時,基礎 Bundle 中有重複鍵而導致當機的問題。
    • 控制舊版 MediaSessionCompat 時,合併在同一個 Looper 疊代中發出的傳出 MediaControllerCompat.TransportControls 呼叫 (例如,同時呼叫 setMediaItem、prepare 和 play 現在會調度單一 onPlayFrom* 回呼)。
  • UI:
    • 修正啟用雙向文字換行時,RTL 字幕標點符號位置和跨度範圍保留的問題 (#3454、#3455)。
    • 將 TrackSelectionState 和 TrackSelectionParametersState 類別及其對應的可組合項狀態記住函式新增至 media3-ui-compose 模組。
    • 導入 PresentationState.videoAspectRatio,並讓 Modifier.resizeWithContentScale 採用 aspectRatio: Float?,而非 sourceSizeDp: Size?。
    • 將 CuesState 類別和 rememberCuesState 可組合函式新增至 media3-ui-compose 模組,用於監聽播放器目前的字幕。
    • 如果 ProgressSlider 是以 ExoPlayer 或 CompositionPlayer 為基礎,請新增對拖曳模式的支援。
    • 在 PresentationState 中新增 showArtwork 支援,並用來計算 ContentFrame 和 Player 中提供的選用 artwork 可組合函式的算繪時間。新增 Artwork 可組合項,做為 artwork 版位的預設值。
    • 在 PlayPauseButtonState (showBuffering、showRetry、showReplay) 中新增欄位,並在 PlayPauseButton 中使用這些欄位,算繪更多圖示和緩衝指標。
    • 新增 PlaybackState 類別,以便自訂播放狀態觀測,並導入 BufferingIndicator 做為與按鈕無關的元件。
    • 修正 PlayerView 和 PlayerControlView 在多時段直播的片尾廣告預留位置時段邊界顯示廣告標記的問題。
    • Player、ContentFrame、PlayerDefaults 和 MiniController 的可組合版位不再接收播放器或控制項顯示設定做為參數。請改為從呼叫範圍擷取 (例如 topControls 現在是 @Composable BoxScope.() -> Unit)。這是不穩定 API 的破壞性變更。
    • 將 alignment 參數新增至 ContentFrame、Player 和 Modifier.resizeWithContentScale,將縮放後的內容置於容器內,並將 ContentFrame 的內容裁剪至其邊界,這樣使用 ContentScale.Crop 縮放的影片就不會再繪製到容器外。
    • 透過公開 isLive 和 liveOffsetMs,為 ProgressSlider、ProgressStateWithTickCount 和 ProgressStateWithTickInterval 新增直播 UI 支援。將 LiveButton 可組合函式新增至 media3-ui-compose-material3 (#2213)。
  • Ktor 擴充功能:
    • 修正 KtorDataSource 可能會將串流中連線失敗視為輸入結束,而非擲回 HttpDataSourceException 的問題 (#3460)。
  • HLS 擴充功能:
    • 將 EXT-X-STREAM-INF 和 EXT-X-I-FRAME-STREAM-INF 上的 VIDEO-RANGE (PQ 和 HLG) 剖析為 Format.colorInfo (#3441)。
    • 修正剖析含有 PES 媒體樣本的 MPEG-TS EXT-X-MAP 初始化片段時,發生的 NullPointerException 問題 (#3456)。
    • 修正迴歸問題:Format.id 和 Format.metadata 針對公開的 HLS 軌道為 null (#3402)。
    • 將素材資源清單廣告剪輯至 X-PLAYOUT-LIMIT,並略過完全超過限制的廣告,以及在插頁式廣告省略 X-RESUME-OFFSET 且時間長度不明時,將內容繼續播放偏移量預設為 0 (即使已設定 X-PLAYOUT-LIMIT)。
    • 修正以下問題:解析 X-ASSET-LIST 插頁式廣告時,會覆寫同一廣告群組中其他插頁式廣告的內容繼續播放偏移量。
  • DASH 擴充功能:
    • 支援剖析 DashManifestParser 中的替代 MPD 插入 (urn:mpeg:dash:event:alternativeMPD:insert:2025) 和取代 (urn:mpeg:dash:event:alternativeMPD:replace:2025) 事件,並在 Period.alternativeMpdEvents 中將其公開為 AlternativeMpdEvent 執行個體。這項破壞性變更會影響子類別為 DashManifestParser 的應用程式:DashManifestParser.buildPeriod 現在會採用額外的 List<AlternativeMpdEvent> 參數,且先前的超載已移除。覆寫 DashManifestParser.parseEventStream(XmlPullParser) 的應用程式必須改為覆寫 DashManifestParser.parseEventStream(XmlPullParser, String),因為前者已淘汰,並將在日後版本中設為私人。
    • 將 EssentialProperty 和 SupplementalProperty 描述元中的 CICP 顏色資訊 (ColourPrimaries、TransferCharacteristics、MatrixCoefficients 和 VideoFullRangeFlag) 剖析為 Format.colorInfo (#3426)。
    • 支援在特技模式 (http://dashif.org/guidelines/trickmode) 描述元 @value 屬性中,以空格分隔 @id 值清單 (#3315)。
    • 支援剖析 DashManifestParser 中的 <ProducerReferenceTime>、在 AdaptationSet.producerReferenceTimes 中公開,並用於填入 VOD 串流的 Timeline.Window.presentationStartTimeMs 和 Timeline.Window.windowStartTimeMs。
    • 新增 DASH 內容導向支援 (#1689)。
    • 修正剖析 DASH 資訊清單時,如果 <UTCTiming> 元素缺少屬性,可能會發生 NullPointerException 的問題 (#3436)。
  • RTSP 擴充功能:
    • 修正 RTSP 用戶端關閉後,處理延遲的網路回應時發生的 IllegalStateException 異常終止問題。
    • 修正快速拖曳可能錯誤觸發 TCP 通訊協定備用機制的問題。
    • 修正 IllegalStateException 當機問題:在 RTSP 用戶端於曲目重新選取、工作階段終止或 URI 重新導向期間重設狀態後,處理延遲的網路回應時,可能會發生這個問題。
    • 修正問題:在重新開始播放前再次跳轉,可能會導致 IllegalStateException 停止運作。
    • 修正問題:在跳轉作業待處理時向後跳轉,可能會導致音訊中斷和影片播放凍結。
    • 修正以下問題:以匯總或非 IDR 封包結尾的 H.264 和 H.265 關鍵影格存取單元未標記為關鍵影格,導致播放作業持續緩衝處理 (#3434)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
    • Opus 擴充功能:修正解碼無效 Opus 資料時發生的 JNI 異常終止問題。
    • Opus 擴充功能:修正預先略過和捨棄邊框間距落在同一個封包時,系統會忽略捨棄邊框間距的問題 (#2576)。
  • Cast 擴充功能:
    • 導入 SessionAvailabilityListener.SessionUnavailableReason 來代表工作階段無法使用的原因,並為 SessionAvailabilityListener.onCastSessionUnavailable 提供超載方法來公開該原因。
    • 修正停止投放工作階段後,播放作業會在裝置上意外恢復的問題。
    • 當 RemoteMediaClient 中的 RemoteCastPlayer 作業 (例如播放、暫停、變更速度、重複播放模式、音量、靜音或選取音軌) 失敗時,記錄錯誤 (#3373)。
    • 修正 Cast 接收器佇列在搜尋作業待處理時變更或縮小時,RemoteCastPlayer 中的 ArrayIndexOutOfBoundsException (#3372)。
    • 修正預設 Cast 接收器的問題:時間軸只會填入目前播放項目周圍的媒體項目,而非整個播放清單 (#3129)。
    • 修改播放清單 (setMediaItems、addMediaItems、moveMediaItems、removeMediaItems) 或在 RemoteCastPlayer 中跳轉時,立即更新時間軸和播放位置,並將連續的播放清單作業排入佇列,以便依序可靠地執行 (#2639、#3272)。
    • 修正以下問題:在 RemoteCastPlayer 的空白佇列上呼叫 addMediaItems 時,無法在 Cast 接收端載入媒體項目 (#2402)。
    • 修正 RemoteCastPlayer 中的問題:到達 Cast 接收器佇列結尾時,系統會清除時間軸,而非保留播放清單。
    • 修正以下問題:在載入媒體項目之前,如果在 RemoteCastPlayer 上設定 playWhenReady、repeatMode 和 playbackParameters,系統不會轉移或套用這些項目 (例如在 CastPlayer 中從本機轉移至遠端播放時) (#889)。
  • 試用版應用程式:
    • 在工作階段示範應用程式目錄中,新增對受 DRM 保護媒體項目的支援,以及額外的 HLS 範例串流。
    • 在工作階段試用應用程式中,使用 CastTrackSelector 設定 RemoteCastPlayer,即可在投放時選取字幕和音軌。
  • 移除已淘汰的符號:
    • 移除 DashUtil.buildDataSpec(Representation, RangedUri, int) 和 DashUtil.buildDataSpec(Representation, String, RangedUri, int)。請改用 DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>)。
  • 版本:
    • 將 Gradle minSdk 提高至 24。

1.11.0 版

1.11.1

2026 年 9 月 10 日

  • ExoPlayer:
    • 將漸進式媒體的 HAGC 中繼資料啟用/停用旗標從 MediaSource.Factory 移至 ExtractorsFactory。先前的 setExperimentalEnableHagcPlayback 方法已移除,並由 ExtractorsFactory.setParseHagcMetadata 取代。這也解決了 Matroska/WebM 容器無法停用的問題。
    • 修正預熱非轉換次要轉譯器時,導致播放停滯的問題。
    • 修正預熱問題:當跳轉重設並停用兩個轉譯器時,Surface 應傳回主要轉譯器。
    • 修正 ArrayIndexOutOfBoundsException,當直播時間軸重新整理時,預設位置會移至目前播放的伺服器端插入廣告之後 (#3348)。
    • 修正拖曳模式問題:啟用 ScrubbingModeParameters.allowSkippingMediaCodecFlush 拖曳時,可能會短暫顯示過時的影片影格。
  • 擷取工具:
    • Matroska:修正放置在叢集後的音軌不會產生可跳轉時間軸的問題 (#3377)。
  • 音訊:
    • 修正 SilenceSkippingAudioProcessor 中的緩衝區空間計算,避免靜音時間長度下限因影格大小而錯誤縮減 (#3271)。
    • 修正 PcmAudioUtil 中的 8 位元 PCM 處理方式,按照 Android 定義將樣本視為不帶正負號 (#3271)。
    • 修正卸載問題:由於硬體緩衝區空間有限,播放作業可能會在片頭廣告或無縫轉換期間停滯。
    • 修正 DefaultAudioSink 中的錯誤:播放執行緒不再運作時,釋出計數不會減少 (#3338)。
  • 工作階段:
    • 修正從 Player.Listener 回呼釋出程序內 MediaController 時,會發生 NullPointerException 的問題 (#3375)。
    • 修正以下問題:當舊版 MediaBrowser 連線至從 onGetLibraryRoot() 或 onConnectAsync() 傳回非同步結果的服務時,主執行緒會發生死結 (#3393)。
  • HLS 擴充功能:
    • 修正當貼齊的目標區隔尚未在播放清單中時,內容繼續偏移的計算方式 (#3322)。
    • 修正以下問題:完全耗盡的 HlsMediaChunk 在收到擷取器的 EOFException 時,會重試載入 (#3350)。
  • DASH 擴充功能:
    • 修正 presentationTimeOffset 圖片軌的樣本時間戳記計算錯誤問題 (#3334)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
    • Opus:修正同時初始化多個 OpusDecoder 執行個體時,記憶體損毀的問題。
    • MPEG-H:修正記憶體流失、非 ASCII 字元截斷,以及在記憶體不足的情況下,傳送指令至 MpeghUiManager 時可能發生的原生程式碼錯誤 (#3365)。

1.11.0 版

2026 年 8 月 5 日

  • 通用程式庫:
    • 新增 Format.channelMask 以明確表示音訊聲道遮罩,並新增 Util.getAudioTrackChannelConfig(Format) 超載以安全地解析。
    • 將 Kotlin 從 2.0.20 升級至 2.2.0。
  • ExoPlayer:
    • 修正與時間相關的並行錯誤,這類錯誤可能會導致 ExoPlayer 發生 IllegalStateException 或 IndexOutOfBoundsException。
    • 放寬 AdsMediaSource 中的廣告群組數量檢查,允許在廣告群組完全處理完畢時減少廣告群組數量 (hasUnplayedAds() 為 false),以便在重設工作流程期間動態調整廣告群組大小。
    • 將 getFlags() 和 FLAG_STRICT_DURATION 新增至 SampleStream,讓串流回報標記,並更新轉譯器,以動態方式檢查這些標記。
    • 當串流格式未提供有效值時,改用 MediaCodecVideoRenderer 中的影格率估算器和 MediaCodecAudioRenderer 中的轉碼器輸出格式,計算轉碼器運作速率,並避免不必要的轉碼器重設。
    • 移除核心播放器中用戶端插入廣告的內容剪輯。而是由 AdsMediaSource 處理裁剪邏輯。自訂用戶端插入廣告來源必須更新,才能在內部導入內容剪輯。
    • 將具有格式正確但無法辨識的轉碼器設定檔或層級的曲目標示為 supported=NO_EXCEEDS_CAPABILITIES,而不是 supported=YES (這是標示缺少或格式錯誤的設定檔或層級資訊的曲目的方式)。這樣一來,當有更合適的替代方案時,系統就不會選取這些裝置可能不支援的音軌。
    • 新增 DefaultPreloadManager.SimpleRankingDataComparator,這是 RankingDataComparator,會根據媒體項目與目前播放媒體項目索引的距離,比較媒體項目的排名。如果需要更精細的比較邏輯,應用程式可以覆寫其 compare(Integer, Integer) 方法。自訂 SimpleRankingDataComparator 可透過 DefaultPreloadManager.Builder 的新建構函式插入。
    • 如果可用堆積記憶體似乎不足,請改用緩衝區位元組大小限制,降低 DefaultLoadControl.prioritizeTimeOverSizeThresholds 的 OOM 風險。
    • 調整未設定 MediaItem.imageDurationUs 時靜態圖片的處理方式:JPEG 和 HEIC 靜態圖片現在會以極短的預設時間長度「播放」(與 PNG 和其他圖片先前的行為相同)。
    • 新增 MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter),將 BandwidthMeter 連結至 MediaSource。不過,系統預設仍會呼叫採用自訂實作的已淘汰方法,因此建議您實作新方法,並使用 BandwidthMeter.getTransferListener() 達到與舊方法相同的效果。
    • 在 DefaultBandwidthMeter 中,新增對自訂 InitialBitrateSupplier 的支援。這樣一來,應用程式就能提供自己的邏輯,用於判斷初始位元率估計值,並在建立 DefaultBandwidthMeter 和變更網路類型時使用。供應商可透過 DefaultBandwidthMeter.Builder.setInitialBitrateSupplier() 設定。
    • 預設啟用動態排程。ExoPlayer 播放工作迴圈會動態執行,而非以靜態間隔執行。
    • 移除不必要的重設,這類重設可能會在將含有片頭廣告樣本的音軌加入有效播放時發生。
    • 在 DefaultBandwidthMeter 中,最佳化 getInitialBitrateCountryGroupAssignment 以傳回封裝成 32 位元整數 (而非陣列) 的國家/地區群組指派,減少程式碼大小並避免分配。
    • 確保重試邏輯在其他重試 (將緩衝區大小減半) 失敗時,一律嘗試至少 1 秒的緩衝區空間,藉此修正部分裝置上的 AudioTrack 初始化失敗問題 (#3207)。
    • 修正部分裝置的轉碼器問題:如果轉碼器在接收輸入緩衝區前已清除,則會吞掉所有樣本。
    • 新增實驗性 ExoPlayer.Builder.enablePerStreamMediaProgression(),允許依串流推進媒體處理。這可縮短播放清單項目之間的啟動延遲時間,並避免播放內容過短時「卡住」(#3122)。
    • 修正與音訊工作階段 ID 使用方式相關的競爭狀況,系統會使用 ExoPlayer 自動產生的初始音訊工作階段 ID,而非 setAudioSessionId 設定的值 (#3241)。
    • 新增實驗性 HAGC (ST 2094-50) 時間中繼資料播放支援,適用於漸進式媒體 (例如 MP4、Matroska)。播放器會自動將 HAGC 中繼資料軌與相關聯的影片軌合併,並在 API 37 以上版本的裝置上,將中繼資料頻外傳送至解碼器。您可以透過 DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false) 停用這項行為。
    • 新增 Format.selectionPriority,代表曲目選取中 Format 的相對偏好設定 (#3236)。
    • 修正潛在的拖曳模式問題:跳轉至「串流結尾」時,拖曳可能會停滯。
  • CompositionPlayer:
    • 修正 TrackSelector 例項未釋出的問題。
  • 轉換程式:
    • 修正 ExportResult.fileSizeBytes 可能超報的問題。
  • 音軌選取:
    • 公開 BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR 並新增 AdaptiveTrackSelection.Factory.setTrackFormatComparator,允許自訂格式排序和 ABR 選取優先順序,不限於僅依位元率排序。
    • 修正與時間相關的並行問題,避免快速依序更新曲目選取參數時,導致部分更新遺失或遭到覆寫。
  • 擷取工具:
    • MP4、MP3 和 FLAC:新增 FLAG_DISABLE_ARTWORK_METADATA,允許在剖析容器時捨棄附加圖片和封面設計中繼資料,減少執行階段記憶體消耗量 (#2077)。這項功能也可以透過 DefaultExtractorsFactory.setDisableArtworkMetadata 集中啟用。
    • MP4:新增支援,可擷取 ITU-T T.35 (it35) 定時中繼資料軌。
    • MP4:新增支援功能,可擷取章節中繼資料 (Nero 和 QuickTime 格式)。如果兩者皆有,系統會優先採用 QuickTime 章節。擷取的章節資訊會以 Chapter 項目形式顯示在曲目的 Metadata 中,以便在 MP4、M4A 和 M4B 檔案 (例如有聲書和 Podcast) 中原生瀏覽章節 (#2803)。
    • WAV、Matroska 和 MP4:新增 64 位元浮點 PCM 音訊支援 (#3090)。
    • Matroska:使用轉碼器位元串流中繼資料填入正確的 ColorInfo。
    • MP4:新增支援,在沒有 sidx 方塊時,使用 mfra 方塊在片段式 MP4 檔案中跳轉。如要啟用這項功能,請將 FLAG_READ_MFRA_FOR_SEEK_MAP 提供給 FragmentedMp4Extractor,現在預設會在 DefaultExtractorsFactory 中完成 (#3088)。
    • 忽略版本不受支援的 av1C 資料。
    • MP4:在 fpcm 方塊中,新增對大端序浮點 PCM 的支援。
    • Matroska:將章節資訊剖析為音軌 Metadata 中的 Chapter 項目。
    • MPEG-TS:將核心和擴充子串流合併為單一樣本,改善 DTS-HD 和 DTS Express 串流的擷取作業,修正先前將兩者輸出為獨立樣本時的播放問題 (#3147)。
    • MP4:剖析空白中繼資料標記項目時,防止無限迴圈和超出範圍的讀取 (#3191)。ilst
    • MPEG-TS:確保最後一個 PES 封包長度已知的串流,會算繪最後一個影格 (#3206)。
    • MP3:修正含有 Xing 和 VBRI 標頭的檔案位元率回報問題。
    • Matroska:處理最後一個叢集中定義的音軌 (#3250)。
    • Matroska:新增 ALAC 支援 (#3268)。
    • MP4:允許在片段式 MP4 檔案中使用可變長度的 sgpd 方塊 (#3243)。
    • AVI:修正問題,先前播放音軌上沒有主要畫面格標記的檔案時,會導致音訊遺失和 OutOfMemoryError。
    • MP3:使用 Xing/Info 標頭中不含間隔的持續時間 (#3183)。
    • MP3:調整 LAME/Xing 編碼器延遲和填補中繼資料,以符合解碼的 PCM 修剪 (#3200)。
  • 音訊:
    • 在 ExoPlayer 的音訊轉譯器中,從就緒狀態轉換為未就緒狀態時,新增 100 毫秒的寬限期,以消除暫時性欠載,並避免在播放期間出現非預期的緩衝狀態 (#3210)。
    • 變更 DefaultAudioTrackBufferSizeProvider 中的預設 PCM 緩衝區空間邏輯,改用固定的 500 毫秒緩衝區,減少對裝置的依賴。
    • 更新 MediaCodecAudioRenderer,從平台解碼器擷取空間 channelMask,讓 DefaultAudioSink 使用這個明確遮罩,而非從聲道數量推論。
    • 將 AudioSink.configure 的參數轉換為資料類別。ForwardingAudioSink.configure 的自訂覆寫值必須遷移至新的方法簽章。
    • 新增支援,在使用 EditedMediaItem.Builder#setSpeed(SpeedParameters) 延展音訊串流時間時維持音高。
    • 強化 ToFloatPcmAudioProcessor,支援將 8 位元 PCM、16 位元大端序 PCM 和 64 位元浮點 PCM 轉換為 32 位元浮點 PCM (#3090)。
    • 將 DecoderAudioRenderer.getChannelMapping 的傳回值變更為 ImmutableIntArray。
    • 修正錯誤:在壓縮卸載模式下播放無間隙音訊播放清單時,播放會卡住。
    • 將 Timeline 和週期 UID 轉送至 AudioSink.configure 和 AudioProcessor.StreamMetadata,為音訊處理器提供播放清單背景資訊 (#418)。
    • 設定正確的 AudioProcessor.StreamMetadata.positionOffsetUs,允許以時間為基礎的音訊處理 (#418)。
    • 新增對大端序 32 位元和 64 位元浮點 PCM 的支援。
    • 移除 EAC3-JOC 到 EAC3 的備用路徑,以便在 Google Pixel 裝置上播放,因為標準 EAC3 解碼器無法解碼 EAC3-JOC 串流 (#3257)。
  • 影片:
    • 修正影片加入邏輯,將加入期間捨棄的緩衝區計為略過,而非捨棄。
    • 修正設定新介面時的立即算繪決策,避免不支援預留位置介面的裝置發生影格掉格。
    • 修正 MediaCodecVideoRenderer 中的影格率估算,考量捨棄或略過的影格,提高準確度。
    • 允許設定提早排定影格的門檻。預設值為 50 毫秒,但可透過 MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold() 自訂。
    • 修正 VideoFrameReleaseHelper 中的錯誤,避免顯示變更觸發多餘的 Choreographer 回呼,以及主執行緒上過多的 CPU 喚醒。
  • 文字:
    • TTML:區域從 style 備用至 displayAlign (#2559)。
    • TTML:從 <p> 元素的父項沿用提示開始時間 (#3246)。
  • 中繼資料:
    • 新增 MediaMetadata.discSubtitle 欄位,並從 ID3v2.4 TSST 和 Vorbis DISCSUBTITLE 資料剖析。
    • 從 ID3 TPOS 影格剖析光碟編號和數量。
  • 效果:
    • 清除 FinalShaderProgramWrapper 中的重繪狀態,避免播放器在跳轉時凍結。
  • 多工器:
    • 透過新的 addTrackReference API,在 Mp4Muxer 中新增對曲目參照 (tref 方塊) 的支援。這可建立軌道之間的關係,例如將中繼資料軌連結至其描述的影片軌。
    • 新增 OggMuxer,允許將 OPUS 或 VORBIS 媒體串流多工處理為 ogg 檔案格式。
    • 新增 WavMuxer 以生成 WAV 檔案 (支援整數和浮點 PCM)。
    • 將 setAttemptStreamableOutputEnabled 新增至 InAppMp4Muxer.Factory,即可在沒有保留空間的情況下,寫入較小的非串流檔案。
    • 在 Mp4Muxer 和 FragmentedMp4Muxer 中新增 IAMF 音訊支援。
  • IMA 擴充功能:
    • 新增 ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot,即可提供用於影片暫停廣告的廣告版位。
    • 修正以下錯誤:連續播放可略過的 VAST 廣告時,第二則廣告會立即顯示略過按鈕 (#3165)。
  • 工作階段:
    • 修正使用背景執行緒播放器迴圈的工作階段時,MediaNotificationManager 內可能發生的死結和 IllegalStateException 異常終止問題。
    • 對 MediaSession 方法強制執行更嚴格的執行緒規定。無效方法現在會自動將執行作業發布至應用程式迴圈執行緒,而狀態存取子 (getter) 則會明確擲回 IllegalStateException (如果從應用程式迴圈以外的執行緒呼叫)。
    • 在工作階段端追蹤每個控制器的狀態一致性,修正超出範圍的時間軸合併當機問題 (MediaUtils.mergePlayerInfo 中的 IllegalStateException)。
    • 新增 androidx.media3.session.MediaSessionManager,以便支援查詢有效媒體工作階段,並傳回 Media3 SessionToken 執行個體。
    • 如果未覆寫方法,僅提供不受信任控制器的讀取權限,請變更 MediaSession.Callback.onConnect 的預設行為。
    • 新增支援功能,可透過新的 API MediaSession.Builder#setPackageNameOverride 建立 MediaSession 時覆寫套件名稱。呼叫端必須具備 android.permission.OVERRIDE_MEDIA_SESSION_OWNER 權限,才能覆寫工作階段的套件名稱。
    • 新增 MediaSession.Callback.onConnectAsync()。新方法可讓您以非同步方式處理控制器的連線嘗試。應用程式可以透過 Futures.immediateFuture(ConnectionResult) 立即傳回 Future,以達到先前的行為。建議您改用新方法,因為 Callback.onConnect 可能會遭到淘汰。
    • 修正問題:藍牙 AVRCP 瀏覽功能無法在 API 36 和 37 上辨識 MediaLibraryService。
    • 修正圖片大小接近平台限制時,MediaSession 中圖片雙重縮小比例的問題,解決通知模糊的問題 (#3134)。
    • 修正 MediaNotificationManager 中的 ForegroundServiceStartNotAllowedException 異常終止問題:當應用程式在背景執行時,非同步圖片點陣圖載入回呼嘗試啟動前景服務 (#3270)。
    • 修正問題:MediaController 接收的 PositionInfo 物件缺少原始 Timeline UID。工作階段現在會在狀態更新期間,可靠地轉譯及傳播這些 UID。
    • 在 MediaSessionService.stopSelfSafely() 中擷取 ForegroundServiceStartNotAllowedException,修正當機問題 (#3310)。
    • 修正當在同一個媒體項目中跳轉時,MediaController 上出現非預期的 onMediaItemTransition() 回呼 (#3248)。
  • UI:
    • 修正播放途中重新組成 ContentFrame 時,第一個影格會以錯誤大小算繪的問題 (#3238)。
    • 將 CurrentMediaItemState 類別和對應的 rememberCurrentMediaItemState 可組合項新增至 media3-ui-compose 模組。這個狀態容器用於 demo-compose,顯示目前播放 MediaItem 的各種中繼資料資訊。
    • 將 PlaylistState 類別和對應的 rememberPlaylistState 可組合函式新增至 media3-ui-compose 模組。這個狀態容器用於 demo-compose,顯示播放器上設定的 MediaItems 各種中繼資料資訊。
    • 在 PlaybackSpeedState 中新增快轉/慢動作 API。在 demo-compose 中使用這項功能,展示長按快轉。
    • 將 MiniController 可組合函式新增至 media3-ui-compose-material3 模組。這項功能提供精簡的預設控制項,可控制 Player,同時顯示目前媒體項目的標題、藝人、圖片和進度。
    • 將 ErrorState 類別和對應的 rememberErrorState 可組合函式新增至 media3-ui-compose 模組。將 ErrorText 可組合函式新增至 media3-ui-compose-material3,並設為 Player 的預設疊加層。
    • 發布 PlayerDefaults 物件,其中包含 TopControls、CenterControls、BottomControls 和 ErrorOverlay 的可組合項。
    • 將 FocusRequester 新增至 Player 可組合函式及其內容版位。
    • 發布 PlayerPool (common-ktx) 和 rememberPooledPlayer (ui-compose),支援在滑動視窗 UI 環境中預先載入 MediaItems。在 demo-compose 中使用新的 ShortFormPlayerScreen 展示這項功能。
    • 修正 PlayerView 和 Compose PresentationState 中的快門抑制錯誤,該錯誤會導致不支援期間 UID 查詢的時間軸發生當機 (#3264)。
  • 下載內容:
    • 擷取媒體播放清單進行下載時,解析其中的 HLS 變數 (#3258)。
  • Ktor 擴充功能:
    • 新增 media3-datasource-ktor 擴充功能模組,提供由 Ktor HTTP 堆疊支援的 KtorDataSource。
    • 修正 KtorDataSource 在開啟連線時將整個 HTTP 回應主體載入記憶體的問題 (#3305)。
  • HLS 擴充功能:
    • 新增對 HLS 內容導向和路徑複製的支援 (#1689)。
    • 將 setWithAssetListReset 新增至 HlsInterstitialsAdsLoader,讓應用程式將已完整處理的素材資源清單插頁式廣告重設回無法使用的狀態,以便隨選重新解析。
    • 剖析 EXT-X-STREAM-INF 和 EXT-X-I-FRAME-STREAM-INF 的 SCORE 屬性,並填入 Format.selectionPriority (#3236)。
    • 修正錯誤:即使播放清單不再是主要或有效播放清單,排定的 HTTP 即時串流播放清單重新整理作業仍會繼續 (#3254)。
    • 修正解析插頁式廣告素材清單時,內容繼續播放偏移量的計算方式 (#3322)。
    • 修正播放清單要求失敗後,恢復低延遲直播播放時,音軌時間戳記意外不連續的問題 (#3311)。
    • 修正 HlsMediaPeriod.getStreamKeys() 中的錯誤:音訊轉碼中的 ID3 軌會被視為字幕 (#3333)。
  • DASH 擴充功能:
    • 根據語言將 CEA 隱藏式輔助字幕分隔成不同的 TrackGroup (#3113)。
    • 新增支援,可從資訊清單 (MPD) 剖析多個 Location 元素,並在資訊清單載入失敗時,在 DashMediaSource 中執行位置備用。
    • 修正開啟含有空白 <SegmentTimeline/> 元素的資訊清單時,會發生當機 (IndexOutOfBoundsException) 的問題 (#3326)。
  • RTSP 擴充功能:
    • 修正 UDP 通訊埠繫結錯誤,導致 RTSP 播放準備期間暫時停止播放或失敗的問題。
  • Cast 擴充功能:
    • 新增 CastParams 類別,允許透過呼叫 Cast.initialize(CastParams) 設定 Cast。
    • 新增 CastParams.getShowSystemOutputSwitcherOnCastIconClick() 選項,在可用時觸發使用 SystemUI 輸出切換器,而非應用程式內 Cast 裝置挑選器。
    • 新增 MediaRouteButtonState 和 rememberMediaRouteButtonState,支援觀察媒體路徑挑選器的顯示狀態,並在 MediaRouteButton 中新增 state 參數 (#3172)。
    • 修正以下錯誤:RemoteCastPlayer 在選取音軌後,可能會永久卡在音軌遮蓋狀態,導致忽略 Cast 接收端後續的音軌更新 (#3237)。
    • 修正錯誤:DefaultMediaItemConverter 嘗試加入從非 Media3 傳送端啟動的投放工作階段時,會擲回 NullPointerException。
    • 變更使用中的播放器時,防止 CastPlayer 轉移無法播放的 MediaItems (#3199)。
    • 修正未設定的直播 (liveConfiguration == UNSET) 會排入 STREAM_TYPE_BUFFERED 佇列的錯誤 (#3318)。
  • 測試公用程式:
    • 展開 DataSourceContractTest,加入對 POST 要求的支援,包括標頭和主體,將一些 POST 資源新增至 HttpDataSourceTestEnv,並在 WebServerDispatcher 中新增預期 HTTP 方法、標頭和主體的斷言。
    • 針對 DataSource.open() 傳回的長度,加強 DataSourceContractTest 中的斷言。可能導致 C.LENGTH_UNSET 的資源應使用 TestResource.Builder.setMayResolveToUnknownLength(boolean) 指出。
    • 將 setPlaybackLooper 新增到 TestExoPlayerBuilder 中。
  • 移除已淘汰的符號:
    • 移除 androidx.media3.exoplayer.MetadataRetriever。改用 androidx.media3.inspector.MetadataRetriever。
    • 移除 androidx.media3.exoplayer.MediaExtractorCompat。改用 androidx.media3.inspector.MediaExtractorCompat。
    • 移除 Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA。請改用 HeifExtractor 從 HEIC 檔案擷取動態相片中繼資料。
    • 移除 androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata。改用 androidx.media3.extractor.metadata.MotionPhotoMetadata。
    • 移除 androidx.media3.extractor.DummyTrackOutput。改用 androidx.media3.extractor.DiscardingTrackOutput。
    • 移除 androidx.media3.extractor.DummyExtractorOutput。改用 androidx.media3.extractor.NoOpExtractorOutput。
    • 移除 androidx.media3.common.C.generateAudioSessionIdV21。改用 androidx.media3.common.util.Util.generateAudioSessionId。
  • 建構
    • 更新 README.md 操作說明,以便在本機依附 Media3 使用 Gradle 複合建構 (includeBuild)。core_settings.gradle 指令碼已移除,且不再使用 androidxMediaModulePrefix 和 androidxMediaEnableMidiModule 屬性。

1.11.0-rc01

請使用 1.11.0 穩定版。

1.11.0-beta01

2026 年 7 月 7 日

請使用 1.11.0 穩定版。

1.11.0-alpha01

2026 年 6 月 24 日

請使用 1.11.0 穩定版。

1.10.0 版本

1.10.1

2026 年 5 月 12 日

  • 通用程式庫:
    • 修正 SimpleBasePlayer 和 ForwardingSimpleBasePlayer 中 onAudioSessionIdChanged 的處理方式。
  • ExoPlayer:
    • 修正與音訊工作階段 ID 產生相關的競爭狀況,避免在通道模式下發生 IllegalStateException。(#3099)。
    • 修正使用轉譯器預熱功能從解碼器錯誤復原時,可能發生的應用程式當機問題。
    • 修正使用 AV1 型 Dolby Vision 轉碼器時,因提供初始化資料而導致影片不自然的問題 (#3153)。
  • 音軌選取:
    • 調整 VideoTrackInfo 中的音軌選取邏輯,解析備用 MIME 類型,並將 HDR 和轉碼器分數偏好設定移至畫質偏好設定 (#3135)。
  • 擷取工具:
    • MP3:如果 Xing 資料長度超過已知串流長度,則忽略該資料 (#3117)。
    • 修正設定 FLAG_OMIT_TRACK_SAMPLE_TABLE 且曲目缺少同步範例 (stss) 方塊時,Mp4Extractor 中的 ArrayIndexOutOfBoundsException。
  • 音訊:
    • 修正以下錯誤:如果播放器中新增多個音訊轉譯器,音訊事件可能會轉送錯誤。
  • 影片:
    • 調整 API 30 以下版本在影格率變更時重複使用轉碼器的邏輯,避免在不必要的情況下重設轉碼器 (#3120)。
    • 在 queueSecureInputBuffer 中停用 API 31 以上版本的強制同步處理因應措施。這項因應措施是人為瓶頸,會強制解密作業依序執行,避免因 API 31 之前存在的架構問題而導致影片出現亂碼。
  • 圖片:
    • 修正拖曳模式中的問題:圖片更新只有在使用者「停止拖曳」時才會生效 (#2815)。
  • 工作階段:
    • 修正以下錯誤:如果應用程式執行緒不是主執行緒,ForegroundServiceStartNotAllowedException 不會跨執行緒邊界傳播 (#2499)。
    • 修正以下錯誤:連線至僅限平台的會話時,COMMAND_SEEK_TO_MEDIA_ITEM 在 MediaController 中無法使用,該會話支援跳轉至其他項目,但不支援修改播放清單。
    • 修正 MediaController 無法在不允許 PREPARE_FROM 動作的平台媒體工作階段中設定媒體項目的問題。
    • 修正透過平台控制器連線時,在 API 27 或更早版本上,自身程序未標示 Controller.isTrusted() 的錯誤。
  • HLS 擴充功能:
    • 修正以下錯誤:如果選取的音軌是可用音軌的子集,系統會在串流備用期間擲回 ArrayIndexOutOfBoundsException (#3161)。
    • 修正以下問題:如果後續更新未重複 #EXT-X-MAP 標記,初始化片段就不會沿用至媒體播放清單更新 (#3105)。
  • DASH 擴充功能:
    • 修正 SampleQueue 在跳轉至目前取消的區塊時會當機的問題。

1.10.0

2026 年 3 月 26 日

  • 通用程式庫:
    • 將 Player.mute() 和 Player.unmute() 從 UnstableApi 升級為穩定版。
    • 將 Format.pcmEncoding 和 C.PcmEncoding 從 UnstableApi 升級為穩定版。
    • 新增 Format.primaryTrackGroupId,以識別內嵌 Format 執行個體的主要群組 (#294)。
  • ExoPlayer:
    • 為 AdsMediaSource 新增剪輯功能。
    • 在 MediaCodecVideoRenderer 中新增動態排程支援,以便根據可處理影片影格的時間,更妥善地安排排程工作和 CPU 喚醒週期。您可以使用 DefaultRenderersFactory 中的 experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() 啟用這項功能。
    • 允許在 DefaultPreloadManager.Builder 中設定自訂 DataSource.Factory。
    • 將部分預設常數移至 ExoPlayer.Builder,允許在不使用 Robolectric 的情況下模擬 ExoPlayer。一般不建議模擬這個複雜的介面,除非使用量極少/簡單/附隨性 (#2985)。
      • 因此必須將 DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS 從 ExoPlayer 移至 ExoPlayer.Builder (不淘汰)。
    • 修正 ProgressiveMediaSource 將過時的時間軸資訊傳播至播放器,導致佇列中的時段意外遭到移除的錯誤 (#3016)。
    • 修正問題:在通話期間要求播放時,ExoPlayer 不會要求延遲音訊焦點。
    • 修正從隨選內容轉換至直播內容時,可能會在隨選內容結尾重新緩衝處理的錯誤 (#3052)。
    • 新增 Dolby Vision Profile 10 支援 (#2830)。
    • 修正未初始化的片頭廣告會產生 ArrayIndexOutOfBoundsException 的錯誤 (#3125)。
  • CompositionPlayer:
    • 新增對 EditedMediaItem.removeVideo 的支援。
  • 轉換程式:
    • EditedMediaItem.Builder.setFrameRate() 現在可以設定影片的最大輸出影格率,這在使用 setSpeed() 提高媒體速度時特別有用。
  • 音軌選取:
    • 變更 DefaultTrackSelector.selectAllTracks 的簽章,加入輸出陣列做為參數,並預先填入曲目覆寫。
    • 修正無論是否選取對應的主要音軌,都會選取內嵌中繼資料音軌的問題 (#294)。
    • preferredVideoLanguages、preferredVideoLabels、preferredAudioLabels、preferredTextLabels 和 selectTextByDefault 的穩定 TrackSelectionParameters 選項。
  • 擷取工具:
    • MP4:支援在 moov 等其他方塊前有大型 uuid 方塊的檔案 (#3046)。
    • MP4:新增 MP4 容器中多功能視訊編碼 (VVC) 軌道的支援。
  • 檢查器:
    • 破壞性變更:移除 FrameExtractor。使用者現在應依附新的 :media3-inspector-frame 模組,並將匯入項目更新為 androidx.media3.inspector.frame.FrameExtractor。
    • 導入新模組,用於擷取及處理已解碼的影片影格。
  • 音訊:
    • 將 IAMF 解碼器擴充功能的基礎解碼程式庫從 libiamf 變更為 iamf_tools。
    • IAMF 解碼支援透過解碼器 (使用 IAMF 解碼器擴充功能時) 或 Android Spatializer 輸出雙耳音訊。
    • 在 Automotive 情境中評估 AC-4 解碼器支援時,正確移除對 AC4Profile22 和其他舊版設定檔的支援 (#2609)。
    • 改善 DefaultAudioSink 中 AudioOutput 初始化的重試邏輯 (#2905)。
    • 解碼 IAMF 時,嘗試比對喇叭 (或空間音效處理器,如適用) 的輸出配置,同時使用 IAMF 擴充功能和媒體轉碼器解碼器,並由 AudioCapabilities 和 AudioCapabilitiesReceiver 中的新欄位和邏輯支援。
    • 修正錯誤:在壓縮卸載模式下播放無間隙音訊播放清單時,播放會卡住。
  • 文字:
    • VobSub:使用 START 和 STOP SPU 控制指令衍生提示時間長度,而非一律預設為 5 秒 (#2935)。
  • 中繼資料:
    • 將中繼資料轉譯器的預設數量增加到四個,涵蓋 HLS 變體和轉譯版本發布的所有潛在中繼資料軌 (#3043)。
  • 效果:
    • 將 LottieOverlay 移至新的 :media3-effect-lottie 模組 (這也涉及將其從 androidx.media3.effect.LottieOverlay 重新命名為 androidx.media3.effect.lottie.LottieOverlay)。
  • Effect Lottie:
    • 推出新的 :media3-effect-lottie 模組,提供將 Lottie 效果套用至影片影格的功能。
  • IMA 擴充功能:
    • 將 IMA SDK 版本更新至 3.39.0,才能使用最新的廣告媒體資訊 API。
    • 修正錯誤:廣告 MIME 類型與 IMA LOADED 事件中提供的 MIME 類型不符。修正後,系統會使用 IMA 提供的廣告媒體資訊,對應廣告 MIME 類型。
    • 在 ImaAdsLoader 和 ImaServerSideAdInsertionMediaSource 中新增 setEnableCustomTabs,讓使用者控制是否要使用自訂分頁啟動廣告點擊到達網址。
    • 新增 ImaAdTagUriBuilder,這個類別提供建構 adTagUri 的替代方式。其中包含 setPreferredLinearOrientation API。這個 API 處於 Alpha 版測試階段,可讓您設定線性廣告偏好的方向。如要加入 Alpha 版測試群組,請與帳戶合作夥伴聯絡。
  • 工作階段:
    • 修正 MediaMetadata.artworkData 中大型陣列可能導致應用程式當機的錯誤。
    • 在 ActionFactory 介面中,對 @Player.Command 引數使用 int 類型 (#2933)。
    • 將 MediaSessionService 和 MediaLibraryService 設為 LifecycleService,以便將生命週期感知作業附加至服務的生命週期 (#187)。
    • 停止支援 MediaController 和 MediaBrowser 的裝置音量變更指令,用於本機播放。應用程式不應變更本機裝置音量,如有需要,可使用 AudioManager API 達到此目的。
    • 偵測將服務做為前景服務啟動的過時 Intent 執行個體。這可避免系統擲回 ForegroundServiceDidNotStartInTimeException。這項破壞性變更會影響不穩定 API,因為實作自訂 MediaNotification.Provider 的應用程式需要新的必要方法。
    • 新增 PendingIntent 執行個體的建構工具,以便與主畫面小工具搭配使用 (#2933)。
    • 新增靜態方法,為以 Compose 為基礎的主畫面小工具建立 Intent 執行個體 (#2933)。
    • 修正以下錯誤:當播放作業從特定媒體項目索引轉換至另一個具有相同媒體項目的索引,且不連續原因為「AUTO」和「SEEK」時,系統不會向控制器回報媒體項目轉換 (#2997)。
    • 修正系統 UI 按鈕位置解決方法對其他 UI 介面 (例如 Android Auto) 或不需要解決方法的製造商造成負面影響的問題 (#3041)。
    • 修正訂閱項目存取權未同步的問題 (#3056)。
    • 解決 API 29 的 SysUI 錯誤,避免特定大小的媒體工作階段圖片導致 SysUI 停止運作,並強制裝置重新啟動 (#3118)。
    • 修正 Android Q 上的通知圖片圖示縮放問題 (#3084)。
  • UI:
    • 將 PlaybackSpeedControl 可組合函式新增至 media3-ui-compose,用於顯示及修改播放速度。
    • 將 PlaybackSpeedToggleButton 可組合函式新增至 media3-ui-compose-material3,用於控制播放速度。
    • 將 ProgressSlider 可組合函式新增至 media3-ui-compose-material3,用於顯示播放器進度,以及透過拖曳和輕觸執行跳轉 (#2288)。
    • 避免在 PlayerControlView 動畫中,使用大型螢幕外緩衝區。
    • 將 Player 可組合項新增至 media3-ui-compose-material3,其中結合了 ContentFrame 與可自訂的控制項,並對齊頂端、中央和底部。
    • 在無障礙服務中隱藏播放位置,避免在 PlayerControlView 顯示時持續更新通知。
  • HLS 擴充功能:
    • 支援 X-PLAYOUT-LIMIT 與 HLS 插播廣告 (#2484)。
    • 支援 #EXT-X-DEFINE 的 QUERYPARAM 屬性 (#1854)。
    • 快取規則運算式比對器,最佳化 HLS 播放清單剖析 (#3008)。
    • 在音訊轉碼中公開 ID3 (EMSG) 中繼資料軌 (#3043)。
    • 如果不同位置有備援串流,允許在發生載入錯誤時切換位置 (#1988)。
    • 修正 HLS 插播廣告的 X-SNAP 行為,正確計算開始和繼續播放位置 (#3013)。
  • DASH 擴充功能:
    • 修正區隔開始時間未對齊的音軌,導致播放開始時延遲或遺漏樣本的問題 (#3057)。
    • 修正頻內 EMSG v0 中繼資料的時間戳記未正確設定的錯誤 (#3024)。
  • RTSP 擴充功能:
    • 修正 H.264 和 H.265 串流中的迴歸問題,避免錯誤剖析跨多個 RTP 封包的相同存取單元樣本。這會導致影片中出現視覺不自然感和損毀 (#3121)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
    • 在 MPEG-H 解碼器擴充功能中,新增 MPEG-H UI 管理工具支援 (#3066)。
  • Cast 擴充功能:
    • 新增 RemoteCastPlayer.Builder#setTrackSelector 方法,以便為投放播放作業實作音軌選取功能。
  • 移除已淘汰的符號:
    • 移除 ExperimentalFrameExtractor。改用 androidx.media3.inspector.frame.FrameExtractor。
    • 移除 ChannelMixingMatrix.create()。改用 ChannelMixingMatrix.createForConstantGain()。
    • 移除 androidx.media3.extractor.metadata.flac.VorbisComment。改用 androidx.media3.extractor.metadata.vorbis.VorbisComment。
    • 移除 MediaSource.prepareSource(MediaSourceCaller, TransferListener)。 改用 MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId)。

1.10.0-rc03

2026 年 3 月 25 日

請使用 1.10.0 穩定版。

1.10.0-rc02

2026 年 3 月 16 日

請使用 1.10.0 穩定版。

1.10.0-rc01

2026 年 3 月 10 日

請使用 1.10.0 穩定版。

1.10.0-beta01

2026 年 2 月 25 日

請使用 1.10.0 穩定版。

1.10.0-alpha01

2026 年 2 月 6 日

請使用 1.10.0 穩定版。

1.9.0 版

1.9.4

2026 年 5 月 16 日

1.9.4 版包含以下修訂項目。

  • 效果:
    • 從無介面情境轉換時,請明確設定 GL_DRAW_BUFFER 和 GL_READ_BUFFER。

1.9.3

2026 年 3 月 16 日

1.9.3 版包含以下修訂項目。

  • 音訊:
    • 修正錯誤:在壓縮卸載模式下播放無間隙音訊播放清單時,播放會卡住。

1.9.2

2026 年 2 月 6 日

1.9.2 版包含以下修訂項目。

  • ExoPlayer:
    • 修正 ProgressiveMediaSource 將過時的時間軸資訊傳播至播放器,導致佇列中的時段意外遭到移除的錯誤 (#3016)。
  • 工作階段:
    • 修正系統 UI 按鈕位置解決方法對其他 UI 介面 (例如 Android Auto) 或不需要解決方法的製造商造成負面影響的問題 (#3041)。
  • Cast 擴充功能:
    • 修正從 Cast 轉移至本機播放時發生的錯誤。

1.9.1

2026 年 1 月 26 日

1.9.1 版包含這些修訂項目。

  • 通用程式庫:
    • 支援時區偏移中僅包含小時的日期時間字串 (#2929)。
  • ExoPlayer:
    • 允許動態排程在音訊開始後才減慢 doSomeWork 間隔,以便在播放開始時更流暢地同步影音。
    • 修正 DefaultLoadErrorHandlingPolicy 中的錯誤,避免 FileNotFoundException 和類似的例外狀況類型多次重試。
    • 修正動態排程的錯誤,其中下一個 doSomeWork 的計算時間會因目前 doSomeWork 疊代的經過時間而錯誤減少。解決這個問題有望延長 CPU 閒置時間並節省電力。
    • 修正問題:嘗試使用備用 AVC 或 HEVC 轉碼器時,部分 Dolby Vision 檔案無法播放。
    • 修正從播放清單中移除目前播放的項目時,播放結束後仍會繼續載入的錯誤 (#2873)。
    • 避免在同一項目上重複使用 ExoPlayer.replaceMediaItem 時,洩漏 MediaItem 執行個體 (#2993)。
    • 避免因緊急 Wake Lock 釋放而導致潛在的 ANR (#2979)。
  • 擷取工具:
    • MP3:剖析 LAME ReplayGain 資料 (#2840)。
  • 音訊:
    • 在 Automotive 情境中評估 AC-4 解碼器支援時,正確移除對 AC4Profile22 和其他舊版設定檔的支援 (#2609)。
  • 影片:
    • 內容影格率變更時,在 API 30 以下的裝置上捨棄影片轉碼器,避免播放時發生卡頓 (#2941)。
  • 文字:
    • VobSub:正確處理僅含單一控制序列,或重要資訊分散在多個控制序列的 SPU,修正部分字幕遺漏的問題 (#2935)。
  • IMA 擴充功能:
    • 修正錯誤:修正廣告 MIME 類型與 IMA LOADED 事件中提供的 MIME 類型不符的問題。修正後,系統會使用廣告連播索引和廣告排序,對應廣告 MIME 類型。
    • 在存取 getAdsManager() 和 AdEvent.getAd() 的結果之前,請先新增空值檢查。
  • 工作階段:
    • 修正以下錯誤:如果停止播放廣告時,停止與平台工作階段連結的 MediaController,會導致應用程式停止運作 (#2948)。
    • 在各種類別的 extras Bundle 執行個體上新增額外驗證,防範其他程序傳送格式錯誤的 Bundle 執行個體。
    • 修正缺少 COMMAND_SEEK_NEXT 或 COMMAND_SEEK_BACK 指令,導致系統媒體通知出現空白的問題 (#2976)。
    • 將通知圖示的點陣圖縮放作業移出主執行緒 (#2829)。
    • 修正從舊版 MediaMetadataCompat 和 MediaDescriptionCompat 轉換時,未將作者、作詞者和作曲者做為備用項目的錯誤 (#3018)。
  • 下載內容:
    • 修正 SegmentDownloader 處理 PriorityTooLowException 時可能發生的無限迴圈 (適用於 DASH、HLS 和 SmoothStreaming)。使用受保護的 execute 方法自訂覆寫 SegmentDownloader 時,必須提供包裝在 Supplier 中的工作,以便重新建立 (#2931)。
  • HLS 擴充功能:
    • 將原始資產清單 JSON 文件傳遞至 Listener.onAssetListLoadCompleted 回呼。這是不穩定 API 的破壞性變更,實作這個回呼的應用程式必須新增 JSONObject 類型的引數 (#2950)。
  • RTSP 擴充功能:
    • 正確處理時間戳記會循環的 RTP 封包 (#2930)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
    • 修正處理第一個影片影格前,跳轉時可能發生的 NullPointerException (#2965)。
  • Cast 擴充功能:
    • 修正錯誤:更換播放清單時,RemoteCastPlayer 時間軸無法正確更新。

1.9.0

2025 年 12 月 17 日

  • 通用程式庫:
    • 將 minSdk 更新為 23,與其他 AndroidX 程式庫保持一致。
    • 新增 PlayerTransferState,有助於在 Player 執行個體之間轉移播放狀態。
    • 在 Player 中新增 void mute() 和 void unmute() 方法,以便在將音量設為零之前和之後,保留並還原 Player 的音量。
    • 發布公用程式類別 WakeLockManager、WifiLockManager、AudioFocusManager、AudioBecomingNoisyManager 和 StuckPlayerDetector,這些類別先前由 ExoPlayer 內部使用,可供其他播放器重複使用 (#1893)。
    • 修正基礎委派播放器使用參照相等性比較事件監聽器例項時,ForwardingPlayer 事件監聽器的處理方式 (#2675)。
    • 在 media3-common-ktx 程式庫中新增 Player.listenTo 暫停擴充功能函式,指定應執行的特定 Player.Events。
    • 修正 BasePlayer.getBufferedPercentage 中的當機問題,該問題是由於回報的緩衝位置遠大於回報的時間長度,導致整數溢位所造成 (#2750)。
    • 修正 TrackGroup 軌道類型的自動偵測功能,不忽略自訂樣本 MIME 類型,並改用容器 MIME 類型中可能錯誤的軌道類型 (#2860)。
  • ExoPlayer:
    • 新增偵測功能,在播放器似乎卡住時,觸發 StuckPlayerException 播放器錯誤。這種情況會在下列情況發生,如有需要,可在 ExoPlayer.Builder 中設定每個預設逾時:
      • 嘗試播放 10 分鐘後,STATE_BUFFERING 仍未開始緩衝處理。
      • 嘗試播放 STATE_READY 10 秒後,仍未開始播放。
      • STATE_READY 超過宣告時間長度 1 分鐘,但未達到項目結尾。
      • 嘗試播放時,因播放抑制原因而經過 10 分鐘。
    • 根據預設,啟用 Wake Lock 處理功能,修正背景播放期間的緩衝問題。這相當於將 ExoPlayer.Builder.setWakeMode 設為 C.WAKE_MODE_LOCAL。
    • 新增監聽邏輯,在系統向原本傳遞至 ExoPlayer.Builder 的 Context 回報變更時,自動更新虛擬裝置 ID。
    • 新增 ExoPlayer.setVirtualDeviceId,手動更新從傳遞至 ExoPlayer.Builder 的 Context 取得的虛擬裝置 ID。
    • 確保轉譯器不會在目前項目結束前 10 秒以上,就開始消耗下一個播放清單項目的資料。
    • 將 setSeekBackIncrementMs、setSeekForwardIncrementMs 和 setMaxSeekToPreviousPositionMs 新增至 ExoPlayer,以便在建構後更新這些設定 (#2736)。
    • 在 DefaultPreloadManager 中新增預先快取功能。應用程式現在可以透過 TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) 傳回 DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) 或 DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs),表示需要預先快取媒體項目。
    • 在短片試用應用程式中,使用 DefaultPreloadManager 的預先快取功能。
    • 新增本機播放的 DefaultLoadControl.Builder 設定器,並調整 DefaultLoadControl 的預設值,以便與各種本機檔案搭配使用。
    • 修正錯誤:設定空白播放清單可能會使播放器處於 STATE_READY 或 STATE_BUFFERING 狀態。
    • 強化預先載入管理工具 API:
      • 新增 addMediaItems(List<MediaItem>, List<T>) 和 addMediaSources(List<MediaSource>, List<T>),以批次方式新增媒體項目或媒體來源,並在之後自動呼叫 invalidate()。
      • 新增 removeMediaItems((List<MediaItem>) 和 removeMediaSources(List<MediaSource>),以批次移除媒體項目或媒體來源,並確保預先載入管理工具不會在移除後開始預先載入或繼續預先載入任何項目。
      • 允許 DefaultPreloadManager.setCurrentPlayingIndex(int) 自動失效。更新目前播放索引後,應用程式就不必再明確呼叫 invalidate()。
    • 新增功能,可在拖曳模式下略過同一組圖片中向前跳轉的關鍵影格重設。
    • 新增 DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int),讓應用程式為具有指定 playerName 的播放器設定目標緩衝區位元組值。DefaultLoadControl 現在可以根據分配的位元組和目標緩衝區位元組,分別為每個播放器做出決策。
    • 在 AdPlaybackState.AdGroup 中加入 SkipInfo,以傳送廣告群組中每個廣告的可略過資訊。
    • 修正錯誤:在播放片尾廣告時呼叫 removeMediaItems(List) 會導致當機 (#2746)。
    • 修正播放清單播放時出現的部分卡頓問題,即影格一律誤設為最後一個樣本並算繪。
    • 如果播放器無法產生音訊工作階段 ID,則啟用重試路徑 (#2382、#2678)。
    • 新增支援功能,可控制 DefaultPreloadManager 中來源的緩衝區總位元組數,避免預先載入的緩衝區總位元組數任意增加。如要使用預設控制邏輯,應用程式可以透過 DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) 為 PlayerId.Preload.name (「預先載入」) 的 playerName 設定預先載入的目標緩衝區位元組,並透過 DefaultPreloadManager.Builder.setLoadControl(LoadControl) 插入建立的 DefaultLoadControl。
    • 使用預設實作,將 cloneAndSet(int, int) 新增至 ShuffleOrder (#2834)。
    • 在跳轉調整或自動轉換後略過廣告播放時,附加內容繼續播放偏移量 (#2484)。
    • 新增 API,用於設定及觀察音訊和影片軌的轉碼器參數。這項功能適用於以 MediaCodec 為基礎的轉譯器,且需要 API 29 以上版本。
      • 使用 ExoPlayer.setAudioCodecParameters() 和 ExoPlayer.setVideoCodecParameters() 套用參數。
      • 使用 ExoPlayer.addAudioCodecParametersChangeListener() 和 ExoPlayer.addVideoCodecParametersChangeListener() 監聽變更。如要觀測供應商專屬金鑰,必須使用 API 31 以上版本。
    • 修正 IllegalStateException 問題:在跳轉至非零位置後,設定空白媒體來源,然後使用非空白媒體來源準備播放器,就會發生這個問題。
    • 修正錯誤:在拖曳模式下跳轉至其他媒體項目時,可能會導致 IllegalStateException。
    • 修正 DefaultPlaybackSessionManager 中潛在的 NullPointerException (#2885)。
    • 為符合資格的影片啟用跳轉效能改善功能。
    • 在 API 36 以上版本中,重新啟用 MediaCodec 的非同步解密功能,因為這個平台 API 的逾時問題已修正 (#1641)。
    • 將 MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs 的預設值變更為 15 毫秒,並在解碼符合條件的影片前,更有效率地捨棄影片影格。
    • 在 DefaultLoadControl 的自動記憶體計算中,新增記憶體上限。只有在選取過多音軌時,這項設定才會生效 (#2860)。
    • 修正以下錯誤:在播放清單或重複播放模式下播放時,在拖曳模式下跳轉至接近結尾處,可能會導致跳轉至下一個媒體項目。
  • CompositionPlayer:
    • 在新的 @ExperimentalApi 註解下發布 CompositionPlayer,表示該功能可供實驗,但仍在開發中。部分 API 在日後版本中可能會有重大變更,且某些用途存在已知問題和限制 (部分未記錄)。
    • 在 CompositionPlayer 中新增 COMMAND_SET_AUDIO_ATTRIBUTES 和音訊焦點處理支援。
    • 在 CompositionPlayer 中新增次要序列的速度變更支援。
    • 新增對 EditedMediaItem.removeVideo 的支援。
  • 轉換程式:
    • 使用 InAppMp4Muxer 做為預設多工器。
    • 新增 EditedMediaItem.Builder#setSpeed() 並淘汰 Effects#createExperimentalSpeedChangingEffects()。
    • 在 EditedMediaItemSequence 中,將 forceAudioTrack 和 forceVideoTrack 替換為 trackTypes。
  • 音軌選取:
    • 新增 TrackSelectionParameters.selectTextByDefault,即可優先選取任何文字軌,而不必指定其他更具體的偏好設定。
    • 在 TrackSelectionParameters 中新增 preferredVideoLabels、preferredAudioLabels 和 preferredTextLabels,指定偏好具有特定標籤的音軌,例如從 HLS NAME 標記讀取的音軌 (#1666)。
  • 擷取工具:
    • FLAC:加強標頭偵測,降低在編碼 FLAC 資料中找到假標頭的機率,避免解碼錯誤 (#558)。
    • MP3:允許 MP3 檔案開頭的 ID3 標記之間 (和之前) 有間隔 (#811、#5718)。
    • MP3:將探測限制提高至 128 kB,以符合同步位元組的現有搜尋限制 (#2713)。
    • MP3:變更 FLAG_ENABLE_INDEX_SEEKING,優先從中繼資料標頭 (例如 Xing 和 VBRI) 尋找資訊 (如有),如果沒有其他搜尋資訊,則改為以索引為基礎的搜尋。這可提升含有搜尋中繼資料的檔案效能 (#2839)。
    • MP3:即使設定 FLAG_ENABLE_INDEX_SEEKING,當找不到搜尋中繼資料 (例如 Xing、VBRI) 時,將 Mp3Extractor 變更為預設為固定位元率 (CBR) 假設。這是根據 MP3 規格歷史,其中 CBR 是標準,而 VBR 需要明確的標頭。這項功能可提升沒有中繼資料的檔案的即時搜尋能力,但可能會降低沒有標頭的 VBR 檔案的準確度。如果 CBR 假設無法跳轉 (例如長度未知的串流),現在會改用索引跳轉 (#2848)。
    • MP4:在從擷取器發出音軌格式之前,先查看第一個樣本的層值,區分 audio/mpeg (MP3)、audio/mpeg-L1 和 audio/mpeg-L2 MIME 類型 (#2683)。
    • MP4:假設 stbl 方塊大於 1 MB,表示檔案必須未分段,藉此提升超大檔案的探測效率 (#2650)。
    • MP4:新增 ©mvn (樂章名稱) 和 ©mvi (樂章索引) 中繼資料的支援,現在會以 Format.metadata 中的 TextInformationFrame 物件形式發出,ID 分別為 MVNM 和 MVIN (#2754)。
    • MP4:忽略缺少 stsd 方塊的音軌 (而非無法剖析整個檔案)。
    • Matroska:新增 DTS-HD 偵測支援 (#6225)。
    • 修正 MatroskaExtractor 中的問題:針對有多個音軌的檔案,跳轉功能可能不準確。提示點現在會正確與各自的音軌建立關聯,讓跳轉更精確。
    • MPEG-TS:修正因 PES 封包沒有時間戳記,導致 ReorderingBufferQueue 發生 IllegalArgumentException 的問題 (#2764)。
    • 新增擷取 HEIC 動態相片的支援。HeifExtractor 現在可以剖析含有嵌入影片和音軌的 HEIC 檔案。
  • 檢查器:
    • 推出新的 :media3-inspector 模組,做為媒體檢查公用程式的專屬主畫面。這個模組現在包含新的 androidx.media3.inspector.MetadataRetriever,可為中繼資料和影格擷取提供統一的 API。現有的 androidx.media3.exoplayer.MetadataRetriever 已淘汰,改用這個新版本。
    • 推出 androidx.media3.inspector.FrameExtractor,這是用於擷取影格的新公開 API。這個 AutoCloseable 類別提供一種方法,可擷取支援 HDR 影片、影片效果和自訂解碼器選取的影格。應透過特定 MediaItem 的 Builder 建立。
    • FrameExtractor:新增 getThumbnail(),從媒體檔案中擷取代表性的縮圖影格,不需指定時間戳記。
    • 新增 androidx.media3.inspector.MediaExtractorCompat,這是平台 android.media.MediaExtractor 的替代方案,可從媒體檔案中擷取原始、編碼的媒體樣本。現有的 androidx.media3.exoplayer.MediaExtractorCompat 已淘汰,改用這個新類別。
  • 音訊:
    • 讓 AudioProcessor 執行個體知道跳轉動作。
    • 允許將新的 AudioOutputProvider 介面插入 DefaultAudioSink.Builder,以支援自訂音訊輸出路徑。預設值為 AudioTrackAudioOutputProvider。
    • 在 GainProcessor 中處理跳轉。
    • 在音軌格式支援評估中,使用 AC-4 解碼器設定檔和等級功能 (#2580)。
    • 避免在播放開始時處理轉送變更回呼,以免造成延遲 (#2646)。
    • 允許重複使用 EAC3、EAC3-JOC 和 AC-4 格式的轉碼器 (#1346)。
    • 在 Sonic 中新增浮點 PCM 樣本支援。
    • 在 ToFloatPcmAudioProcessor 中新增 16 位元 PCM 樣本支援。
  • 影片:
    • 針對具有不同設定檔的 Dolby-Vision 內容,停用轉碼器重複使用功能。
    • 重新啟用安全轉碼器效能點數錯誤回報的解決方法 (#2856)。
  • 文字:
    • 修正 Dolby Vision 內容中 CEA-6/708 字幕的剖析問題 (#2775)。
  • 圖片:
    • 修正 ScrubbingMode 問題:播放器在拖曳 DASH 縮圖軌時卡住 (#2815)。
  • DRM:
    • 將 MediaDrmCallback 方法的傳回類型從 byte[] 變更為新的 MediaDrmCallback.Response 類型,以便傳回額外的選用資訊。這項來源破壞性變更,只要在傳回前使用 new Response 包裝先前的 byte[] 傳回值,即可輕鬆解決。
    • 在 AnalyticsListener.onDrmKeysLoaded 中新增網址和延遲時間等重要要求資訊 (#1001)。
    • 將佈建要求資料從網址參數移至 POST 主體。
  • 效果:
    • 使用單一邊長建立 Presentation 時,請新增 Presentation.copyWithUnsetSideRoundedTo,將未設定的輸出邊四捨五入。
  • 多工器:
    • 新增 MediaMuxerCompat,可直接取代架構 MediaMuxer。
    • 新增 MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo(),允許建立動態相片。
    • 新增 WebmMuxer,允許將 OPUS、VORBIS、VP8 和 VP9 媒體串流多工處理為 webm 檔案格式。
  • IMA 擴充功能:
    • 移除自訂 ProGuard 規則,讓應用程式改用 IMA Android 封存檔中發布的規則。
    • 新增 ImaServerSideAdInsertionUriBuilder.setNetworkCode,這個新 API 可為 IMA SDK 設定 Google Ad Manager 聯播網代碼,以便按照 Google Ad Manager 設定處理廣告 ID。網路代碼為選用,但建議用於完整服務串流請求。如要找出聯播網代碼,請參閱這篇文章。
    • 將 IMA 依附元件升級至 3.37.0,這需要啟用核心程式庫脫糖功能。相依應用程式也必須啟用這項功能。請參閱 IMA 的設定附註。* 在 SSAI URI 建構工具中,支援 IMA DAI 自訂 UI 選項。伺服器端廣告插播的自訂 UI 選項包括「可略過」和「關於這則廣告」算繪支援。這項功能目前僅供許可清單中的特定發布商使用。這項異動也會將 IMA SDK 升級至 3.38.0 版 (版本資訊),以便存取自訂 UI 選項 API。
    • 修正廣告後內容的內容準備錯誤,會誤報為廣告播放錯誤的問題 (#2656)。
  • 工作階段:
    • 在 MediaSession.Callback.onPlaybackResumption 中新增參數,指出呼叫是否僅用於收集資訊或開始播放 (#1764)。
    • 更新 MediaSession.ControllerInfo.isTrusted,將自身應用程式的控制器也宣告為受信任 (#2542)。
    • 新增 MediaSessionService.triggerNotificationUpdate,手動觸發通知更新 (#1833)。
    • 將 ProgressListener 新增至自訂指令方法。
    • 將 MediaLibrarySession.Builder.setLibraryErrorReplicationMode 的預設值變更為非致命。
    • 在 MediaButtonReceiver.onForegroundServiceStartNotAllowedException 中新增 Context 參數 (#2625)。
    • 從平台 PlaybackInfo 讀取音量控制 ID,而不是透過繫結器擷取。這可確保播放類型和音量控制 ID 是以不可分割的方式讀取,且彼此相符。
    • 修正錯誤:ACTION_UP 按鍵事件在傳遞至回呼進行自訂處理前,會先遭到篩除。這與 media1 和平台的功能一致 (#2637)。
    • 修正即使指令無法使用,getCurrentTimeline() 仍會呼叫 PlayerWrapper 的錯誤 (#2665)。
    • 修正以下錯誤:訊息留在主要迴圈器的訊息佇列中,導致服務終止後記憶體流失 (#2692)。
    • 使用 MediaBrowser 連線至舊版工作階段應用程式時,只有在自訂動作在舊版工作階段的 PlaybackStateCompat 中宣傳 為自訂動作時,系統才會將自訂 指令傳送至工作階段。所有其他自訂動作都會傳送至服務。
    • 實作 onAudioSessionIdChanged,在工作階段設定音訊工作階段 ID 時通知媒體控制器 (#244)。
    • 修正錯誤:KEYCODE_HEADSETHOOK 未在媒體按鍵事件 Intent 抵達 onStartCommand() 時啟動播放器。我們已修正這個問題,現在系統會像處理 KEYCODE_MEDIA_PLAY_PAUSE 一樣處理「KEYCODE_HEADSETHOOK」(#2816)。
    • 修正工作階段和控制器之間未傳達 Surface 大小的錯誤,導致無法在示範工作階段中套用影片效果。如果您使用控制器,當播放器無法處理 setVideoSurfaceHolder 呼叫時,這可能會是破壞性變更。
    • 修正非 String CharSequence 中繼資料值 (例如 span 樣式字串) 的傳播問題 (#2853)。
    • 新增 CommandButton.executeAction,讓控制器能更輕鬆地觸發預期動作。此外,您也可以為部分播放器和工作階段指令指定參數,定義要觸發的動作。
    • 使用 Player.Command 或非自訂 SessionCommand 定義動作,為 CommandButton 執行個體新增回溯相容性。現在,這些狀態會在平台媒體工作階段中正確顯示,例如系統 UI 或 Android Auto。
    • 修正問題:將 MediaController 連線至平台媒體工作階段時,系統會多次壓縮同一個 Bitmap。
  • UI:
    • 將 ProgressStateWithTickInterval 類別和對應的 rememberProgressStateWithTickInterval 可組合項新增至 media3-ui-compose 模組。這個狀態容器用於 demo-compose,以文字形式顯示目前的位置和時間長度。
    • 將 MuteButtonState 新增至 ui-compose,用於處理 Player 音量的靜音。這個狀態容器用於 demo-compose,顯示靜音/取消靜音切換鈕。
    • 將 ProgressStateWithTickCount 類別和對應的 rememberProgressStateWithTickCount 可組合項新增至 media3-ui-compose 模組。這個狀態容器用於 demo-compose,以水平唯讀進度列的形式顯示進度。
    • 將 ContentFrame 可組合函式新增至 media3-ui-compose,結合 PlayerSurface 管理、顯示比例調整大小,以及使用快門遮蓋。
    • 解決已知的 API 34 平台錯誤:在 Compose AndroidView 中使用 SurfaceView 時,影片會遭到拉伸/裁剪,進而影響 ContentFrame 和 PlayerSurface 可組合項與 SURFACE_TYPE_SURFACE_VIEW (#1237、#2811)。
    • 建立新的 media3-ui-compose-material3 模組,並在其中加入 Material3 主題的可組合項 (PlayPauseButton、NextButton、PreviousButton、SeekBackButton、SeekForwardButton、RepeatButton、ShuffleButton、MuteButton)。
    • 將 TimeText 可組合函式新增至 media3-ui-compose-material3,以文字形式顯示玩家進度。可設定為顯示目前位置、持續時間或剩餘時間。
    • 新增支援在 PlayerView 中放置媒體路徑按鈕。
    • 使用 BidiFormatter 正確顯示 RTL 文字字幕中的標點符號 (#11214)。
  • HLS 擴充功能:
    • 剖析 HLS 插播廣告略過屬性。
    • 將 HLS 播放清單和資產清單文件中的略過控制項屬性,對應至 AdPlaybackState,以便公開存取。
    • 修正以下錯誤:從播放清單中移除定義開始時間的 EXT-X-PROGRAM-START-DATE 標記時,播放清單的開始時間會遭到捨棄 (#2760)。
    • 使用二進位搜尋,找出播放清單中指定位置的區隔索引 (#2826)。
    • 新增 HlsInterstitialsAdsLoader.skipCurrentAd() 和 skipCurrentAdGroup() 以及對應的方法,依索引略過廣告和廣告群組。
    • 新增 HlsInterstitialsAdsLoader.Listener.onAdStarted,回報廣告時段的開始時間 (#2859)。
    • 接受空格做為 ISO 8601 日期時間字串中的日期/時間分隔符。
    • 妥善處理擷取不含區隔的 HlsMediaPlaylist 下一個區塊 (#2821)。
    • 直播片頭廣告使用預設開始位置。
  • DASH 擴充功能:
    • 修正使用非階層式 data: URI 資訊清單播放 DASH 串流時,會發生 UnsupportedOperationException 的問題 (#2688)。
    • 在釋出時,以及使用者更新媒體項目時,將 LiveConfiguration 重設為 DashMediaSource 的 MediaItem 提供的值 (#2606)。
    • 避免因無效資訊清單更新而導致當機,且未回報為播放器錯誤 (#2805)。
  • RTSP 擴充功能:
    • 處理 H264 和 H265 的片段 NAL 單元時,處理缺少 RTP 封包的錯誤 (#2613)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
    • AV1 擴充功能:AV1 軟體解碼器現在使用高效能 dav1d 程式庫,取代先前的 libgav1 實作,提升解碼速度。
    • FFmpeg 擴充功能:確保 STREAMINFO 區塊正確剖析並傳遞至解碼器,修正部分 FLAC 檔案無法播放的問題 (#2887)。
  • Cast 擴充功能:
    • 新增 CastPlayer.Builder,讓 CastPlayer 同時執行本機和 Cast 播放。如要保留舊的 CastPlayer 行為 (僅支援投放播放),可以使用 RemoteCastPlayer。現有的 CastPlayer 建構函式會保留舊行為,但已淘汰,建議改用 CastPlayer 或 RemoteCastPlayer 建構工具。
    • 停止在 DefaultMediaItemConverter 中強制執行非空值 MIME 類型。
    • 使用 MediaItem.mediaMetadata.mediaType 推論要在 DefaultCastOptionsProvider#toMediaQueueItem 中使用的 Cast MEDIA_TYPE (如有)。
    • 在 DefaultCastOptionsProvider 中啟用遠端到本機轉移功能。
    • 在工作階段示範中新增 Cast 支援。
    • 新增在可組合 UI 上顯示媒體路徑按鈕的支援。
    • 新增支援,在動作列選單中顯示媒體路徑按鈕。
    • 新增支援,可將媒體路徑按鈕顯示為 View UI。
  • 測試公用程式:
    • 新增 FakeClock 自動跳轉行為的時間差上限。預設為 1 秒,但可透過 FakeClock.Builder 設定。
    • 新增 RobolectricUtil.runMainLooperUntil (和 runLooperUntil) 訊息之間的時間差上限。預設值為 1 秒,但可透過這些方法的新超載進行設定。
    • 將 CapturingRenderersFactory 從 test-utils 移至 test-utils-robolectric。
  • 移除已淘汰的符號:
    • 移除已淘汰的 DefaultPreloadManager 建構函式。改用 DefaultPreloadManager.Builder。
    • 移除已淘汰的 EditedMediaItemSequence 建構函式。改用 EditedMediaItemSequence.Builder。
    • 移除 BitmapFactoryImageDecoder.BitmapDecoder。改用 ExternallyLoadedImageDecoder。
    • 移除已淘汰的 ShadowMediaCodecConfig.forAllSupportedMimeTypes()。改用 ShadowMediaCodecConfig.withAllDefaultSupportedCodecs()。
    • 移除已淘汰的 ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes()。改用 ShadowMediaCodecConfig.withNoDefaultSupportedCodecs()。

1.9.0-rc01

2025 年 12 月 1 日

請使用 1.9.0 穩定版。

1.9.0-beta01

2025 年 11 月 20 日

請使用 1.9.0 穩定版。

1.9.0-alpha01

October 22, 2025

請使用 1.9.0 穩定版。

1.8.0 版

1.8.1

2026 年 5 月 21 日

1.8.1 版包含以下修訂項目。

  • 效果:
    • 從無介面情境轉換時,請明確設定 GL_DRAW_BUFFER 和 GL_READ_BUFFER。

1.8.0 版

2025 年 7 月 30 日

1.8.0 版包含這些修訂版本。

  • 通用程式庫:
    • 新增在 ForwardingSimpleBasePlayer 中替換播放器的支援。
  • ExoPlayer:
    • 在 ExoPlayer 介面中新增隨機播放模式的 getter (#2522)。
    • 如果從多個執行緒存取 DefaultAudioSink,則會更明確地擲回例外狀況。如果這是因為在播放器外部呼叫 RendererCapabilities.getFormatSupport 所致,請務必在與 ExoPlayer 播放執行緒相同的執行緒上呼叫這個方法,或使用與播放所用執行緒不同的例項 (#1191)。
    • 修正以下錯誤:電視上的非立體聲音訊格式可能會標示為 DefaultTrackSelector 不支援。
    • 使用 MediaCodec 的 DECODE_ONLY 旗標 (在拖曳模式中預設為啟用) 時,請確保最後一個影格正確算繪。
    • 新增支援功能,可使用從 Context 傳遞至 ExoPlayer.Builder 的虛擬裝置 ID。
    • 在拖曳模式下,預設啟用動態排程。
    • 跳轉至項目結尾時,避免不必要地重新載入來源。
    • 在拖曳模式中,預設使用 MediaCodec.BUFFER_FLAG_DECODE_ONLY。
    • 當 PreloadMediaSource 由 ExoPlayer 播放,且播放執行緒與預先載入執行緒不同時,擲回 IllegalStateException (#2495)。
    • 使用預設實作項目將 cloneAndMove 新增至 ShuffleMode (#2226)。
    • 如果不需要呼叫 render,請變更 Renderer.getMinDurationToProgressUs 的預設行為,傳回較大的值。
    • 修正錯誤:在暫停狀態下跳轉至結尾時,內部排程會延遲最後一個影格。目前,只有在啟用 ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled 時,錯誤修正才會生效。
    • 新增 ExoPlayer.setScrubbingModeEnabled(boolean) 方法。這項設定可最佳化播放器,因應頻繁的跳轉操作 (例如使用者拖曳拖曳列)。您可以使用 ExoPlayer 和 ExoPlayer.Builder 上的 setScrubbingModeParameters(..) 自訂拖曳模式的行為。
    • 允許在拖曳模式下自訂部分跳轉容許值。
    • 提高拖曳模式下的轉碼器運作速率。
    • 修正 AdsMediaSource 內容中的準備錯誤可能不會回報的錯誤 (#2337)。
    • 修正 MergingMediaSource 中的記憶體流失問題,例如側載字幕時使用的記憶體 (#2338)。
    • 允許 CmcdConfiguration.Factory 傳回 null,停用特定媒體項目的 CMCD 記錄 (#2386)。
    • 將預設圖片緩衝區空間從 128 kB (文字軌複製貼上錯誤) 增加到 26 MB,足以容納 50 MP Ultra HDR 圖片 (#2417)。
    • 新增 PreCacheHelper,允許應用程式預先快取單一媒體,並指定開始位置和時間長度。
    • 新增從 DefaultPreloadManager 中指定位置預先載入的支援。
  • 轉換程式:
    • 新增 CodecDbLite,以便針對晶片組進行影片編碼設定的最佳化。
    • 在 DefaultEncoderFactory 中加入 setEnableCodecDbLite 旗標,啟用 CodecDB Lite 設定最佳化功能。根據預設,這個旗標會設為 false。
    • 現在,如要使用無聲音訊填補初始間隔 (透過 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 或子母畫面版面配置。
  • 擷取工具:
    • 從片段化 MP4 檔案剖析中繼資料 (#2084)。
    • JPEG:支援開頭沒有 Exif 區隔的動態相片 (#2552)。
    • 新增支援,可在含有多個 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)。
    • MP3:因 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) 而改用固定位元率搜尋時,使用不可搜尋的 Xing、VBRI 和類似可變位元率中繼資料的持續時間和資料大小 (#2194)。
  • 音訊:
    • 修正音訊播放開始時間非常接近媒體結尾時,不會呼叫 AnalyticsListener.onAudioPositionAdvancing 的錯誤。
    • 在 ChannelMappingAudioProcessor 和 TrimmingAudioProcessor 中新增對所有線性 PCM 取樣格式的支援。
    • 新增 CompositionPlayer 音訊間隔支援。
    • 從 BaseAudioProcessor#reset() 移除對 BaseAudioProcessor#flush() 的虛假呼叫。
    • 允許在 DefaultAudioMixer 中進行恆定功率上混/下混。
    • 將 ChannelMappingAudioProcessor、TrimmingAudioProcessor 和 ToFloatPcmAudioProcessor 設為公開 (#2339)。
    • 在 AudioTrackPositionTracker 中使用 AudioTrack#getUnderrunCount() 偵測 DefaultAudioSink 中的緩衝區不足,而非盡力估算。
    • 改善音訊時間戳記平滑處理,避免音訊輸出裝置發生非預期的位置偏移。
    • 修正錯誤:連上藍牙裝置後,從暫停狀態恢復播放時,前 10 秒的影音同步會中斷。
    • 修正 AnalyticsListener.onAudioPositionAdvancing 未回報音訊開始前進的時間,而是回報第一次測量的時間。
    • 修正部分裝置在備用立體聲音訊後,無法復原至多聲道音訊的問題 (#2258)。
  • 影片:
    • 將分離介面解決方法擴充至「lenovo」和「motorola」裝置 (#2059)。
    • 如果音訊樣本未在要求的確切位置開始播放,則改善啟動時影片影格的流暢度。
    • 將分離介面解決方法擴充至「realme」裝置 (#2059)。
    • 新增實驗性 ExoPlayer API,在將僅解碼輸入緩衝區排入佇列時,加入 MediaCodec.BUFFER_FLAG_DECODE_ONLY 旗標。這個標記會指示解碼器略過僅解碼緩衝區,進而加快跳轉速度。請使用 DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag 啟用。* 改善軟體視訊轉碼器的轉碼器效能檢查。這可能會導致部分額外音軌標示為 EXCEEDS_CAPABILITIES。
    • 修正部分裝置上的 VP9 Widevine 播放錯誤 (#2408)。
  • 文字:
    • 新增 MP4 檔案中 VobSub 音軌的支援 (#2510)。
    • 修正字幕片段一開始無法載入,但之後成功載入,接著出現多個空白字幕片段時,播放作業會停滯的問題 (#2517)。
    • 修正 SSA 和 SubRip,在啟用字幕時顯示進行中的提示 (#2309)。
    • 修正從有字幕錯誤的串流切換至字幕軌空白的直播時,播放作業會卡住的問題 (#2328)。
    • 修正播放含有 B 影格的 H.262 串流時,CEA-608 字幕亂碼的問題 (#2372)。
    • 在 Matroska 檔案中新增對 SSA 字幕和 CodecId = S_TEXT/SSA 的支援。先前 MatroskaExtractor 僅支援 CodecId = S_TEXT/ASS,代表 SubStation Alpha 字幕的「進階」(v4+) 變化版本 (但 ExoPlayer 的剖析邏輯對這兩種變化版本都相同) (#2384)。
    • 在 SubStation Alpha (SSA) 字幕檔案中新增 layer 屬性支援,用於定義畫面上同時顯示多個提示時的 z 順序 (#2124)。
  • 中繼資料:
    • 新增對 MetadataRetriever 擷取媒體時間長度和 Timeline 的支援,並將其遷移至以執行個體為基礎的 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 不同)。
  • DRM:
    • 新增接受 MediaItem.DrmConfiguration 的 OfflineLicenseHelper.newWidevineInstance 新超載,以便正確套用 HTTP 要求標頭 (#2169)。
  • 效果:
    • 新增 Presentation.createForShortSide(int),建立 Presentation,確保最短邊一律符合指定值,無論輸入方向為何。
  • 多工器:
    • 修正錯誤:未針對分段 MP4 中的音訊樣本設定正確的樣本標記。
    • writeSampleData() API 現在使用多工器專屬的 BufferInfo 類別,而非 MediaCodec.BufferInfo。
    • 新增 Muxer.Factory#supportsWritingNegativeTimestampsInEditList,預設值為 false。
  • IMA 擴充功能:
    • 修正錯誤:某個廣告載入錯誤,可能導致另一個廣告群組意外失效。
    • 修正隨選影片視窗結束後,廣告群組導致播放停滯的錯誤。開始時間晚於時間範圍的廣告群組不會再排入 MediaPeriodQueue (#2215)。
  • 工作階段:
    • 修正錯誤:系統會忽略來自第三方非特殊權限 Media3 控制器的連線。
    • 傳送自訂指令至舊版 MediaBrowserServiceCompat 時,移除可用指令檢查。這與舊版控制器/瀏覽器連線至舊版應用程式時的行為相同。
    • 修正錯誤:播放器首次播放錯誤時,會誤視為永久自訂例外狀況。這會導致應用程式無法復原。
    • 修正錯誤:工作階段未處理的部分控制器變更可能會導致 IllegalStateExceptions。
    • 修正錯誤:工作階段未處理的控制器動作可能會導致控制器處於無效狀態。
    • 修正 StrictMode 不安全啟動違規警告 (#2330)。
    • 修正以下錯誤:從與主執行緒不同的應用程式執行緒執行播放器時,從主執行緒呼叫 setSessionExtras 會導致 IllegalStateException (#2265)。
    • 如果播放器已設定媒體項目,但未準備或播放,請勿自動顯示通知 (#2423https://github.com/androidx/media/issues/2423)。這項行為可透過 MediaSessionService.setShowNotificationForIdlePlayer 設定。
    • 為所有或所選控制器新增自訂 PlaybackException。
    • 修正錯誤:在 MediaController 上跳轉直播內容時,可能會導致 IllegalArgumentException。
    • 如果是直播,請停止發布播放位置,以及在目前項目中搜尋平台媒體控制器的功能,避免 Android Auto UI (以及使用平台媒體工作階段中這項資訊的其他控制器) 出現位置不自然的情況 (#1758)。
    • 修正以下錯誤:將空值傳入與舊版 MediaBrowserServiceCompat 連結的 MediaBrowser 的 getLibraryRoot 時,會產生 NullPointerException。
    • 修正傳送自訂動作、搜尋結果或 getItem 要求時,舊版工作階段應用程式會因 ClassNotFoundException 異常終止的錯誤。
    • 修正 MediaItem.LocalConfiguration.uri 會與平台工作階段的 MediaMetadata 共用的錯誤。如要刻意分享 URI,讓控制器重新要求媒體,請改為設定 MediaItem.RequestMetadata.mediaUri。
  • UI:
    • 修正錯誤:PlayerSurface 在 LazyColumn 等可重複使用的元件中無法正常運作 (#2493)。
    • 修正 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 並下載相應內容。
  • Cronet 擴充功能:
    • 新增自動 Cookie 處理功能 (#5975)。
  • HLS 擴充功能:
    • 修正錯誤:當緩衝區中沒有可用的區塊時,HlsSampleStreamWrapper 會嘗試在緩衝區內搜尋 #2598。
    • 修正以下錯誤:載入低延遲部分和預先載入提示後,音軌選取項目變更可能會導致播放卡住或凍結 (#2299)。
    • 當伺服器不接受 CAN-BLOCK-RELOAD=YES 時,請等待目標時間長度的一半,避免過度重新載入 (#2317)。
    • 修正以下錯誤:在片中廣告前開始插播串流,以及嘗試解析錯誤廣告的素材資源清單時,播放作業會停滯 (#2558)。
    • 修正播放清單剖析功能,接受引號字串屬性值中的 \f (換頁) (#2420)。
    • 支援更新 ID 相同的插頁式廣告 (#2427)。
    • 修正錯誤:直播沒有可載入的片段時,有時不會傳播播放清單載入錯誤 (#2401https://github.com/androidx/media/issues/2401)。
    • 依 NAME 標記將字幕轉譯版本分組,類似於音訊轉譯版本的分組方式 (#1666)。
    • 支援 X-ASSET-LIST 和 HlsInterstitialsAdsLoader 直播。
  • DASH 擴充功能:
    • 修正以下問題:特技播放調整集與主要調整集會合併,形成無效的 TrackGroup (#2148)。
    • 修正以下錯誤:如果縮短 DASH 週期時間長度,且轉譯管道已讀取超過新時間長度的樣本,系統可能會擲回例外狀況 (#2440)。
    • 修正使用 CMCD 查詢參數時,系統未遵循重新導向的錯誤 (#2475)。
  • RTSP 擴充功能:
    • 根據 RFC 7798#4.4.2,新增 H265 的 RTP 匯總封包支援 (#2413)。
    • 修正 RtspClient,在處理 HTTP 302 回應時,使用提供的位置 URI (#2398)。
    • 新增 SessionDescriptions 的剖析支援,其中包含結尾有空白字元的行 (#2357)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
    • 修正 DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange 對音訊解碼器擴充功能無效的錯誤 (#2258)。
  • Cast 擴充功能:
    • 新增對 setVolume() 和 getVolume() 的支援 (#2279)。
    • 防止 CastPlayer 在時間軸空白時進入 STATE_BUFFERING。
    • 新增對 getDeviceVolume()、setDeviceVolume()、getDeviceMuted() 和 setDeviceMuted() 的支援 (#2089)。
  • 測試公用程式:
    • 將 advance(player).untilPositionAtLeast 和 untilMediaItemIndex 新增至 TestPlayerRunHelper,以便將播放器推進至指定位置。在大多數情況下,這些方法比現有的 untilPosition 和 untilStartOfMediaItem 方法更可靠。
    • 將 FakeDownloader 移至 test-utils-robolectric 模組,以便在其他測試中重複使用。
    • 已移除 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.8.0-rc02 版

2025 年 7 月 24 日

請使用 1.8.0 穩定版。

1.8.0-rc01 版

2025 年 7 月 16 日

請使用 1.8.0 穩定版。

1.8.0-beta01 版

2025 年 7 月 2 日

請使用 1.8.0 穩定版。

1.8.0-alpha01 版

2025 年 5 月 19 日

請使用 1.8.0 穩定版。

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 嘗試在 ProgressiveMediaPeriod 準備就緒前呼叫其 getBufferedDurationUs(),導致 ProgressiveMediaPeriod 擲回 IllegalStateException (#2315)。
    • 修正 DASH、HLS 和 SmoothStreaming 的資訊清單要求中傳送 CmcdData 的問題 (#2253)。
    • 確保移除廣告群組後,仍可使用AdPlaybackState.withAdDurationsUs(long[][])。使用者仍須傳入已移除廣告群組的時間長度陣列,該陣列可為空白或空值 (#2267)。
  • 擷取工具:
    • MP4:從 tkhd 方塊剖析 alternate_group,並在每個軌道的 Format.metadata 中,將其公開為 Mp4AlternateGroupData 項目 (#2242)。
  • 音訊:
    • 修正卸載問題:播放短內容的播放清單時,位置可能會卡住 (#1920)。
  • 工作階段:
    • 將平台 MediaSession 回呼的匯總逾時時間從 500 毫秒縮短為 100 毫秒,並新增實驗性 setter,允許應用程式設定這個值。
    • 修正使用者關閉通知後,通知再次出現的問題 (#2302)。
    • 修正以下錯誤:當包裝的播放器實際為空白時,工作階段會傳回單一項目時間軸。當包裝的播放器沒有 COMMAND_GET_TIMELINE,但有 COMMAND_GET_CURRENT_MEDIA_ITEM,且包裝的播放器為空白時,就會發生這種情況 (#2320)。
    • 修正以下錯誤:與服務進行其他互動 (例如 setForegroundServiceTimeoutMs) 後,呼叫 MediaSessionService.setMediaNotificationProvider 會遭到忽略,且不會顯示任何訊息 (#2305)。
  • UI:
    • 啟用 PlayerSurface,以便與 ExoPlayer.setVideoEffects 和 CompositionPlayer 搭配使用。
    • 修正 PlayerSurface 無法使用新 Player 重新組合的錯誤。
  • HLS 擴充功能:
    • 修正 HLS 媒體的 CmcdData 未設定區塊時間長度,導致處理加密媒體區隔時發生斷言失敗的問題 (#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 Compiler Gradle 外掛程式。將 KotlinX Coroutines 程式庫從 1.8.1 升級至 1.9.0。
    • 移除 Format.toBundle(boolean excludeMetadata) 方法,改用 Format.toBundle()。
    • 修正 SimpleBasePlayer 中的錯誤:在 setPlaylist 之後,使用 null MediaMetadata 在 State 中設定新的 currentMediaItemIndex 時,不會重新評估中繼資料 (#1940)。
    • 將 SimpleBasePlayer.State 存取權從受保護變更為公開,以便更輕鬆地處理其他類別的更新 (#2128)。
  • ExoPlayer:
    • 新增 MediaExtractorCompat,這個新類別提供與平台 MediaExtractor 相同的功能。
    • 新增實驗性「ExoPlayer」預熱支援,可使用 MediaCodecVideoRenderer 播放。您可以透過 experimentalSetEnableMediaCodecVideoRendererPrewarming 設定 DefaultRenderersFactory,為 ExoPlayer 提供次要 MediaCodecVideoRenderer。啟用後,ExoPlayer 會在播放期間預先處理連續媒體項目的影片,減少媒體項目轉換延遲時間。
    • 將 DefaultLoadControl 中 bufferForPlaybackMs 和 bufferForPlaybackAfterRebufferMs 的預設值分別減少至 1000 和 2000 毫秒。
    • 非同步初始化 DeviceInfo 和裝置音量 (如果使用 setDeviceVolumeControlEnabled 啟用)。這些值在 ExoPlayer.Builder.build() 之後不會立即提供,且 Player.Listener 會透過 onDeviceInfoChanged 和 onDeviceVolumeChanged 通知變更。
    • 建立播放器後,初始音訊工作階段 ID 不會立即提供。如有需要,您可以使用 AnalyticsListener.onAudioSessionIdChanged 監聽初始更新。
    • 選取影片音軌時,請考量語言。根據預設,系統會選取與所選音軌語言相符的「主要」影片軌 (如有)。您可以使用 TrackSelectionParameters.Builder.setPreferredVideoLanguage(s) 明確指定影片語言偏好設定。
    • 將 selectedAudioLanguage 參數新增至 DefaultTrackSelector.selectVideoTrack() 方法。
    • 在 MediaSourceEventListener.onLoadStarted 和對應的 MediaSourceEventListener.EventDispatcher 方法中新增 retryCount 參數。
    • 修正以下錯誤:在多時段 DASH 串流中,如果播放清單項目或時段的持續時間與實際內容不符,可能會導致項目結尾處畫面凍結 (#1698)。
    • 將 BasePreloadManager.Listener 移至頂層 PreloadManagerListener。
    • 您可以實作 RenderersFactory.createSecondaryRenderer,提供預熱的次要轉譯器。預熱功能可讓媒體項目在播放期間更快轉換。
    • 在自動調整串流格式 DASH、HLS 和 SmoothStreaming 中,啟用傳送 CmcdData 資訊清單要求的功能 (#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:修正處理固定位元率壓縮音訊檔案時,串流標頭儲存位元組數而非區塊數的問題。
    • 修正 NAL 單元的處理方式,長度以 1 或 2 個位元組表示 (而非 4 個)。
    • 修正 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)。
  • 效果:
    • 將 OverlaySettings 的功能移至 StaticOverlaySettings。OverlaySettings 可設為子類別,以便動態調整疊加層設定。
  • 多工器:
    • 將 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)。
  • UI:
    • 將 PlayerSurface、PresentationState、PlayPauseButtonState、NextButtonState、PreviousButtonState、RepeatButtonState、ShuffleButtonState 和 PlaybackSpeedState 的狀態容器和可組合項新增至 media3-ui-compose 模組。
  • 下載內容:
    • 修正 CacheWriter 中的錯誤:如果資料來源擲回 IOException 以外的 Exception,資料來源會保持開啟,快取區域則會鎖定 (#9760)。
  • HLS 擴充功能:
    • 新增 HlsInterstitialsAdsLoader 的第一個版本。廣告載入器會讀取 HLS 媒體播放清單的 HLS 插頁式廣告,並對應至傳遞給 AdsMediaSource 的 AdPlaybackState。這個初始版本僅支援具有 X-ASSET-URI 屬性的 HLS 隨選影片串流。
    • 新增 HlsInterstitialsAdsLoader.AdsMediaSourceFactory。應用程式可以使用這個類別,以便利且安全的方式建立使用 HlsInterstitialsAdsLoader 的 AdsMediaSource 執行個體。
    • 剖析 HLS 播放清單中的 SUPPLEMENTAL-CODECS 標記,偵測 Dolby Vision 格式 (#1785)。
    • 放寬在 HLS 串流中跳轉至同步位置的條件 (#2209)。
  • DASH 擴充功能:
    • 新增 DASH 的 AC-4 Level-4 格式支援 (#1898)。
    • 修正計算多時段直播廣告插入更新間隔時發生的問題 (#1698)。
    • 從 DASH 資訊清單剖析 scte214:supplementalCodecs 屬性,偵測 Dolby Vision 格式 (#1785)。
    • 改善直播中時段轉換的處理方式,其中時段包含超過宣告時段時間長度的媒體樣本 (#1698)。
    • 修正以下問題:標示為 adaptation-set-switching 但語言或角色標記不同的調整集會合併在一起 (#2222)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
    • 新增 MPEG-H 解碼器模組,使用內建的 MPEG-H 解碼器解碼 MPEG-H 音訊 (#1826)。
  • MIDI 擴充功能:
    • 將自訂 AudioSink 和 AudioRendererEventListener 執行個體插入 MidiRenderer。
  • Cast 擴充功能:
    • 將 play-services-cast-framework 依附元件升級至 21.5.0,修正以下問題:在已安裝但停用 Google Play 服務的裝置上,指定 API 34 以上版本的應用程式發生 FLAG_MUTABLE 異常終止 (#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() 從傳遞至 Transformer.start() 的 EditedMediaItem 中移除音訊。
      • setRemoveVideo(),請改用 EditedMediaItem.Builder.setRemoveVideo() 從傳遞至 Transformer.start() 的 EditedMediaItem 中移除影片。
      • setFlattenForSlowMotion(),請改用 EditedMediaItem.Builder.setFlattenForSlowMotion() 壓平傳遞至 Transformer.start() 的 EditedMediaItem。
      • 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)。
      • getRendererCapabilities(RenderersFactory),只要建立含有 RenderersFactory 的 DefaultRendererCapabilitiesList,並呼叫 DefaultRendererCapabilitiesList.getRendererCapabilities(),即可達到相同功能。
      • 已移除 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)。
  • 影片:
    • 復原處理 onOutputFormatChanged 時,使用 MediaCodecAdapter 提供的像素顯示比例值 (#1371)。
  • 文字:
    • 修正 ReplacingCuesResolver.discardCuesBeforeTimeUs 中的錯誤:在 timeUs 處有效的提示 (已開始但尚未結束) 遭到錯誤捨棄 (#1939)。
  • 中繼資料:
    • 從 Vorbis 評論中擷取光碟/曲目編號和類型,並放入 MediaMetadata (#1958)。

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 在非同步模式下運作時 (API 31 以上版本的預設行為),有時會回報為「未預期的執行階段錯誤」的問題。MediaCodec
    • 使用 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[]),並將方法標示為 final,防止覆寫。請改用新的 DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])。
    • 在MergingMediaSource中回報次要來源的MediaSourceEventListener事件。這會導致側載字幕 (使用 MediaItem.LocalConfiguration.subtitleConfigurations 新增的字幕) 回報載入開始/錯誤/取消/完成事件,這些事件可能會顯示為 AnalyticsListener 發出的重複載入事件。
    • 避免字幕和中繼資料錯誤導致播放完全停止。而是停用有問題的音軌,並繼續播放其餘音軌 (#1722)。
      • 在新的字幕處理 (擷取期間) 中,相關剖析 (例如無效字幕資料) 和載入錯誤 (例如 HTTP 404) 會透過 onLoadError 回呼發出。
      • 在舊版字幕處理 (算繪期間) 中,系統只會透過 onLoadError 回呼發出相關聯的載入錯誤,而剖析錯誤則會自動忽略 (這是預先存在的行為)。
    • 修正以下錯誤:在多時段 DASH 串流中,如果播放清單項目或時段的持續時間與實際內容不符,可能會導致項目結尾處畫面凍結 (#1698)。
    • 在 SntpClient 中新增 setter,設定自上次更新後經過的時間上限,超過這個時間後,用戶端會重新初始化 (#1794)。
  • 轉換程式:
    • 新增 SurfaceAssetLoader,支援透過 Surface 將影片資料排入 Transformer 佇列。
    • ImageAssetLoader 會透過 AssetLoader.onError 回報不支援的輸入內容,而不是擲回 IllegalStateException。
    • 匯出圖片時,必須使用 MediaItem.Builder.setImageDurationMs 設定圖片持續時間。
    • 新增匯出支援,可處理音訊 EditedMediaItem 序列中的間隔。
  • 音軌選取:
    • DefaultTrackSelector:在其他因素相同的情況下,優先選擇物件式音訊,而非聲道式音訊。
  • 擷取工具:
    • 允許 Mp4Extractor 和 FragmentedMp4Extractor 識別後續樣本未用作參考的 H264 樣本。
    • 新增選項,可在 AmrExtractor 中啟用以索引為基礎的跳轉功能。
    • 將有效影格之間超過 128kB 的 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 檔案中 H.263 影片的 h263 方塊 (#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() 是否傳回「open」值。
      • 覆寫 DataSourceContractTest.getNotFoundResources() 可讓測試子類別提供多個「找不到」資源,以及任何預期的標頭。這可區分 HTTP 404 (含標頭) 和「找不到伺服器」(不含標頭)。
  • 音訊:
    • 如果媒體中存在 CTA-2075 響度中繼資料,則自動在轉碼器上設定該中繼資料。
    • 確保跳轉時音量平順降低。
    • 修正跳轉時可能出現的爆音。
    • 修正 Sonic 時間延展/音高移位演算法的截斷錯誤累積問題。
    • 修正 SpeedChangingAudioProcessor 中導致輸出影格遭到捨棄的錯誤。
  • 影片:
    • MediaCodecVideoRenderer 會避免解碼未算繪或未做為其他樣本參考的樣本。
    • 在 API 35 以上版本中,MediaCodecAdapter 現在可能會在 configure 中收到 null Surface,並呼叫新方法 detachOutputSurface,在轉碼器支援時移除先前設定的 Surface (MediaCodecInfo.detachedSurfaceSupported)。
    • 處理 onOutputFormatChanged 時,使用 MediaCodecAdapter 提供的像素顯示比例值 (如有) (#1371)。
    • 新增 Galaxy Tab S7 FE 裝置問題的解決方法,該問題會導致 60fps 安全 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 擴充功能:
    • 修正清除播放清單可能會導致 ImaServerSideAdInsertionMediaSource 中出現 ArrayIndexOutOfBoundsException 的錯誤。
    • 修正以下錯誤:伺服器端插入的 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 都支援媒體項目的指令按鈕。請參閱「實作自訂瀏覽動作」。* 修正錯誤:Media3 控制器有時無法在要求 play() 後,讓工作階段應用程式啟動前景服務。
    • 限制 CommandButton.Builder.setIconUri 僅接受內容 URI。
    • 連線至舊版 MediaBrowserCompat 時,將 Media3 瀏覽器的連線提示傳遞至初始 MediaBrowserCompat。服務首次呼叫 onGetRoot() 時,可以接收以根提示形式傳入的連線提示。
    • 修正以下錯誤:MediaBrowser 連線至舊版瀏覽器服務時,在瀏覽器訂閱 parentid 後,未收到服務傳送的錯誤。
    • 改善互通性行為,讓連線至舊版 MediaBrowserService 的 Media3 瀏覽器在訂閱父項時,不會要求 parentId 的子項兩次。
  • UI:
    • 由於 XML 型共用轉場效果發生問題,因此在 PlayerView-in-Compose-AndroidView 解決方法中,將延展/裁剪影片設為選擇加入。在 AndroidView 內使用 PlayerView 的應用程式需要呼叫 PlayerView.setEnableComposeSurfaceSyncWorkaround 才能選擇加入 (#1237、#1594)。
    • 將 setFullscreenButtonState 新增至 PlayerView,允許視需要更新全螢幕按鈕的圖示,也就是頻外更新,而非回應點擊互動 (#1590、#184)。
    • 修正以下錯誤:如果存在應用程式定義的文字音軌選取偏好設定,文字選取中的「None」選項無法運作。
  • DASH 擴充功能:
    • 新增支援從區段中間開始的時段 (#1440)。
  • Smooth Streaming 擴充功能:
    • 修正播放含有文字軌的 SmoothStreaming 串流時,會發生 Bad magic number for Bundle 錯誤的問題 (#1779)。
  • RTSP 擴充功能:
    • 修正網址包含編碼 @ 字元時,使用者資訊移除的問題 (#1138)。
    • 修正剖析含有標頭擴充功能的 RTP 封包時發生的當機問題 (#1225)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1 等):
    • 新增 IAMF 解碼器模組,支援使用 libiamf 原生程式庫合成音訊,播放含有 IAMF 音軌的 MP4 檔案。
      • 播放功能支援立體聲版面配置,以及 5.1 聲道和空間化功能,並可選擇啟用頭部追蹤功能,但目前不支援雙耳播放。
    • 在 Android 15 上,為解碼器擴充功能新增 16 KB 分頁支援 (#1685)。
  • 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:
    • 在 PreloadMediaSource 中以非同步方式處理預先載入回呼 (#1568)。
    • 載入失敗時,無論緩衝時間長度為何,都允許播放 (#1571)。
  • 擷取工具:
    • MP3:根據 Info 影格中的長度欄位,正確忽略結尾的非 MP3 資料,藉此修正 Searched too many bytes 錯誤 (#1480)。
  • 文字:
    • TTML:修正百分比 tts:fontSize 值的處理方式,確保這些值能正確沿用自具有百分比 tts:fontSize 值的父項節點。
    • 修正 LegacySubtitleUtil 中的 IndexOutOfBoundsException,因為系統不正確處理要求輸出開始時間大於或等於 Subtitle 中最終事件時間的情況 (#1516)。
  • DRM:
    • 修正 API 31 以上版本裝置播放 L1 Widevine 內容時發生的 android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE 錯誤。這項錯誤是由於架構 MediaDrm.requiresSecureDecoder 方法 (#1603) 實作不完整所致。
  • 效果:
    • 在 GlObjectsProvider 中新增 release() 方法。
  • 工作階段:
    • 按照說明,將輕觸兩下 KEYCODE_HEADSETHOOK 的動作轉換為「跳轉至下一個」動作 (#1493)。
    • 在決定是否忽略 以避免 ForegroundServiceDidNotStartInTimeException 時,將 KEYCODE_HEADSETHOOK 視為 MediaButtonReceiver 中的「播放」指令 (#1581)。
  • 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 脫糖的編譯依附元件 (#1312)。
    • 請確認系統會忽略傳遞至 MediaItem.Builder.setImageDurationMs() 的時間長度,因為 MediaItem 不是圖片 (如說明文件所述)。
    • 新增 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 中。
    • 將 reset() 新增至 BasePreloadManager,釋出所有保留來源,同時保留預先載入管理工具執行個體。
    • 新增 ExoPlayer.setPriority() (和 Builder.setPriority()),定義 PriorityTaskManager 中使用的優先順序值,以及 API 35 的 MediaCodec 重要性。
    • 修正更新上次重新緩衝時間的問題,該問題會導致 CMCD 中的 bs (緩衝區耗盡) 鍵不正確 (#1124)。
    • 新增 PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource),表示來源已載入至結尾。這樣一來,DefaultPreloadManager 和自訂 PreloadMediaSource.PreloadControl 實作項目就能預先載入下一個來源,或採取其他動作。
    • 修正錯誤:在項目結尾略過無聲片段時,可能會觸發播放例外狀況。
    • 將 clear 新增至 PreloadMediaSource,即可捨棄預先載入期間。
    • 新增錯誤代碼 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)。
    • ExoPlayer.setVideoEffect() 中的 Effects 會收到已移除轉譯器偏移的時間戳記 (#1098)。
    • 修正處理播放器錯誤時可能發生的 IllegalArgumentException,該錯誤發生在預先讀取其他播放清單項目時 (#1483)。
  • 轉換程式:
    • 將 audioConversionProcess 和 videoConversionProcess 新增至 ExportResult,指出輸出檔案中各個音軌的製作方式。
    • 放寬剪輯最佳化 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 影格的資料大小,而非基礎串流回報的大小 (例如檔案大小或 HTTP Content-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 簡單處理「set pen location」指令時,加入重複的新行 (#1315)。
    • 修正 WebVTT 字幕樣本不含任何提示時 (例如在 DASH 串流中),LegacySubtitleUtil 會發生 IllegalArgumentException 的問題 (#1516)。
  • 中繼資料:
    • 修正 MP4 與 ID3 排序標記的對應關係。先前,「專輯排序」(soal)、「藝人排序」(soar) 和「專輯藝人排序」(soaa) MP4 標記錯誤對應至 TSO2、TSOA 和 TSOP ID3 標記 (#1302)。
    • 修正 MP4 (/iTunes) 數值 gnre (類型) 和 tmpo (節奏) 標記值超過一個位元組時的讀取問題。
    • 將 ID3 TCON 影格傳播至 MediaMetadata.genre (#1305)。
  • 圖片:
    • 新增非正方形 DASH 縮圖格線的支援 (#1300)。
    • 新增對 AVIF 的支援 (API 34 以上版本)。
    • 允許 null 做為 ExoPlayer.setImageOutput() 的參數,以清除先前設定的 ImageOutput。
  • DataSource:
    • 導入 android.resource://package/id 原始資源 URI 的支援,其中 package 與目前應用程式的套件不同。先前並未記錄這項功能,但與依名稱存取相比,這種方式能更有效率地存取其他套件中的資源。
    • 在 DataSpec 建構函式中,積極檢查 url 是否為非空值。這個參數已加上非空值註解。
    • 允許 ByteArrayDataSource 在 open() 期間將 URI 解析為位元組陣列,而不是在建構時硬式編碼 (#1405)。
  • DRM:
    • 允許在 DefaultDrmSessionManagerProvider 上設定 LoadErrorHandlingPolicy (#1271)。
  • 效果:
    • 支援在 SpeedChangeEffect 的同一個 EditedMediaItem 或 Composition 中多次變更速度。
    • 支援從 Ultra HDR 點陣圖輸入輸出 HLG 和 PQ。
    • 新增 EGL_GL_COLORSPACE_BT2020_HLG_EXT 支援,改善 ExoPlayer.setVideoEffect 和 Transformer 偵錯 SurfaceView 中的 HLG 介面輸出。
    • 更新疊加層矩陣實作,翻轉 setOverlayFrameAnchor() 中套用的 x 和 y 值,使其與說明文件一致。如果使用 OverlaySettings.Builder.setOverlayFrameAnchor(),請將 x 和 y 值乘以 -1,翻轉這些值。
    • 修正 TimestampWrapper 與 ExoPlayer#setVideoEffects 搭配使用時會異常終止的錯誤 (#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 廣告串流所需的 API 升級為穩定版。
    • 將 replaceAdTagParameters(Map <String, String>) 新增至 ImaServerSideAdInsertionMediaSource.AdLoader,以便在執行階段取代廣告代碼參數。
    • 修正廣告播放期間發生播放器錯誤時,系統未呼叫 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 控制器測試應用程式的程式碼,可用於測試與發布媒體工作階段的應用程式互動。
    • 將傳遞至 media3 MediaSession[Builder].setSessionExtras() 的額外項目傳播至 media1 控制器的 PlaybackStateCompat.getExtras()。
    • 將嚴重和非嚴重錯誤對應至平台工作階段,以及從平台工作階段對應。PlaybackException 會對應至 PlaybackStateCompat 的致命錯誤狀態。傳送至媒體通知控制器的 SessionError (包含 MediaSession.sendError(ControllerInfo, SessionError)) 會對應至 PlaybackStateCompat 中的非重大錯誤,這表示錯誤代碼和訊息已設定,但平台工作階段的狀態仍與 STATE_ERROR 不同。
    • 允許為每個控制器設定工作階段活動,覆寫全域工作階段活動。您可以使用 AcceptedResultBuilder.setSessionActivivty(PendingIntent) 建立 ConnectionResult,在連線時為控制器定義工作階段活動。連線後,即可使用 MediaSession.setSessionActivity(ControllerInfo, PendingIntent) 更新工作階段活動。
    • 改善對 MediaLibrarySession.Callback 呼叫的錯誤複製。現在可以使用 MediaLibrarySession.Builder.setLibraryErrorReplicationMode() 設定錯誤複製功能,選擇錯誤類型或停用預設啟用的錯誤複製功能。
  • UI:
    • 連線至 ExoPlayer 時,為 PlayerView 新增圖片顯示支援 (#1144)。
    • 透過 XML 屬性,在 PlayerControlView 中新增各種圖示的自訂功能,允許每個 PlayerView 執行個體使用不同的可繪項目,而非全域覆寫 (#1200)。
    • 解決平台錯誤:在 API 34 的 Compose AndroidView 中使用 SurfaceView 時,影片會拉伸/裁剪 (#1237)。
  • 下載內容:
    • 確認 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)。
  • DASH 擴充功能:
    • 修正重新準備多時段直播時,可能會擲回 IndexOutOfBoundsException 的錯誤 (#1329)。
    • 新增 dashif:Laurl 授權網址支援 (#1345)。
  • 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:
    • 修正 PreloadMediaPeriod 再次預先載入時無法保留串流的問題。
    • 在重新選取音軌時,將正確對應的 TrackSelectionResult 套用至播放期間。
    • 在媒體項目之間轉換時,只有在播放時間推進後,才啟動提早啟用的轉譯器 (#1017)。
    • 在 DefaultVideoFrameProcessor.Factory.Builder.build() 的 ProGuard -keepclasseswithmembers 規則中,新增缺少的傳回類型 (#1187)。
  • 轉換程式:
    • 針對 API 30 之前 MediaMuxer 不支援負值顯示時間戳記而擲回的例外狀況,新增解決方法。
  • 音軌選取:
    • DefaultTrackSelector:優先選擇影格率「合理」(>=10 fps) 的影片軌,而非影格率較低或未設定的影片軌。這可確保播放器從動態相片擷取的 MP4 中選取「實際」影片軌,其中可能包含兩個 HEVC 軌,其中一個解析度較高,但影格數量極少 (#1051)。
  • 擷取工具:
    • 修正問題:從 WAV 檔案讀取奇數大小的區塊時,系統不會略過邊框間距 (#1117)。
    • MP3:從 XING 和 VBRI 等中繼資料框架填入 Format.averageBitrate。
    • MPEG-TS:還原一項變更,該變更旨在透過將串流的最後一個存取單元傳遞至樣本佇列,確保最後一個影格會算繪 (#7909)。這是因為這項變更會導致僅限 I 影格的 HLS 串流 (#1150) 和 H.262 HLS 串流 (#1126) 發生新問題。
  • 音訊:
    • 如果音軌無法在卸載模式下初始化,請停用卸載功能,允許轉譯器復原。
  • 影片:
    • 新增 Galaxy Tab S7 FE、Chromecast (支援 Google TV) 和 Lenovo M10 FHD Plus 裝置問題的解決方法,該問題會導致 60fps H265 串流標示為不支援
    • 新增權宜措施,確保在通道傳輸時一律會算繪第一個影格,即使裝置未按照 API 要求自動執行此操作也一樣 (#1169)。(#966)。
    • 修正 HDR 色彩資訊處理作業導致轉碼器行為不當,以及無法切換 SDR 影片軌自動調整格式的問題 (#1158)。
  • 文字:
    • WebVTT:避免直接連續的提示從 WebvttParser.parse 建立不正確的其他 CuesWithTiming 執行個體 (#1177)。
  • DRM:
    • 解決在某些 Android 14 裝置上,MediaDrm 架構可能會擲回 NoSuchMethodError,而非 ResourceBusyException 或 NotProvisionedException 的問題 (#1145)。
  • 效果:
    • 轉換色域,改善 PQ 到 SDR 的色調映射。
  • 工作階段:
    • 修正控制器取代目前項目時,目前位置會跳回的問題 (#951)。
    • 修正以下問題:只有非空值 extras 的 MediaMetadata 無法在媒體控制器和工作階段之間傳輸 (#1176)。
  • UI:
    • 如果 Locale 無法識別顯示名稱,則改為加入音軌語言名稱 (#988)。
  • DASH 擴充功能:
    • 將資訊清單中的所有 Label 元素填入 Format.labels (#1054)。
  • RTSP 擴充功能:
    • 在 SDP 剖析中略過空白工作階段資訊值 (i 標記) (#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 依附元件。
    • 當 artworkUri 和 artworkData 至少有一個非空值時,在 MediaMetadata.Builder.populate(MediaMetadata) 中填入這兩個值 (#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) 鍵名稱的規則運算式,改為只檢查連字號 (#1028)。
    • 停止雙重編碼 CMCD 查詢參數 (#1075)。
  • 轉換程式:
    • 新增對 H.265/HEVC SEF 慢動作影片進行扁平化的支援。
    • 提高轉多工速度,尤其是「移除影片」編輯作業。
    • 新增 API,確保輸出檔案從影片影格開始。這樣一來,修剪作業的輸出內容就能與播放器實作項目更相容,直到顯示時間戳記 (#829) 才會顯示第一個影片影格。
    • 新增支援,可最佳化單一素材資源 MP4 剪輯作業。
    • 新增支援,確保影片影格在輸出檔案中具有第一個時間戳記。修正 iOS 播放器輸出檔案開頭為黑色畫面的問題 (#829)。
  • 音軌選取:
    • 新增 DefaultTrackSelector.selectImageTrack 即可啟用圖片軌選取功能。
    • 新增 TrackSelectionParameters.isPrioritizeImageOverVideoEnabled,決定在圖片軌和影片軌都可用時,是否要選取圖片軌。預設值為 false,表示優先選取影片軌。
  • 擷取工具:
    • 在 MP4 擷取器中新增 AV1C 剖析功能,以擷取 ColorInfo.colorSpace、ColorInfo.colorTransfer 和 ColorInfo.colorRange 值 (#692)。
    • MP3:針對含有 Info 標頭 (Xing 標頭的 CBR 對等項目) 的檔案,使用固定位元率 (CBR) 搜尋。先前我們使用 Info 標頭中的跳轉表格,但如果忽略該表格並假設檔案為 CBR,跳轉精確度會降低。
    • MPEG2-TS:新增 DTS、DTS-LBR 和 DTS:X Profile2 支援 (#275)。
    • 從 TS 描述元擷取音訊類型,並對應至角色旗標,讓使用者能更準確地選取音軌 (#973)。
  • 音訊:
    • 改善跳過靜音演算法,採用平滑音量漸變;保留最短靜音時間和更自然的靜音時間長度 (#7423)。
    • 更明確地回報略過的無聲片段 (#1035)。
  • 影片:
    • 將採用 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 提供個別縮圖。
  • DRM:
  • 工作階段:
    • 停用 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:
    • 修正問題:手動跳轉至 LiveConfiguration.min/maxOffset 範圍外時,系統會持續將偏移量調整回 min/maxOffset。
    • 修正 OPUS 和 VORBIS 聲道配置在 3、5、6、7 和 8 聲道時錯誤的問題 (#8396)。
    • 修正以下問題:在直播中跳轉至零後,音軌選取會錯誤地讓直播從預設位置開始 (#9347)。
    • 修正以下問題:CmcdData.Factory 的新執行個體會從區塊來源收到 bufferedDurationUs 的負值,導致 IllegalArgumentException (#888)。
  • 轉換程式:
    • 解決編碼器在設定時因設定高運作率而擲回的問題。
  • 擷取工具:
    • 將 JPEG 動態相片中的次要 (無法播放) HEVC 軌標示為 ROLE_FLAG_ALTERNATE,以免系統因解析度較高而自動選取播放。
    • 修正 TS H264 串流的主要畫面格偵測錯誤 (#864)。
    • 修正超過 47721 秒的 TS 串流時間長度預估 (#855)。
  • 音訊:
    • 修正多次呼叫 SilenceSkippingAudioProcessor 時,EOS 的處理方式 (#712)。
  • 影片:
    • 針對 Galaxy Tab S7 FE、Chromecast (支援 Google TV) 和 Lenovo M10 FHD Plus 的裝置問題新增解決方法,該問題會導致 60fps AVC 串流標示為不支援 (#693)。
  • 中繼資料:
    • 修正錯誤:MediaMetadata 只能從含有大寫鍵的 Vorbis 註解填入 (#876)。
    • 剖析超大型 ID3 影格時,系統會擷取 OutOfMemoryError,這表示播放作業可以繼續進行,但不會顯示標記資訊,而不是完全無法播放。
  • DRM:
    • 將虛假 ClearKey https://default.url 授權網址的解決方法擴充至 API 33 以上版本 (先前該解決方法僅適用於 API 33) (#837)。
    • 修正從加密內容切換至明文內容時,如果沒有任何介面附加至播放器,會發生 ERROR_DRM_SESSION_NOT_OPENED 的問題。這項錯誤是由於不正確地使用安全解碼器播放明文內容所致。
  • 工作階段:
    • 將自訂鍵和值放入 MediaMetadataCompat 至 MediaMetadata.extras,以及 MediaMetadata.extras 至 MediaMetadataCompat (#756、#802)。
    • 修正舊版控制器的廣播 notifyChildrenChanged (#644)。
    • 修正錯誤:為已停用的通知 setWhen 計時器設定負時間,會導致部分裝置當機 (#903)。
    • 修正媒體通知控制器在要求首次通知更新時,尚未完成連線的 IllegalStateException 問題 (#917)。
  • UI:
    • 修正問題:在 BottomSheetDialogFragment 中搭配 Material Design 使用時,快轉和倒轉按鈕不會顯示 (#511)。
    • 修正 PlayerControlView 快轉按鈕中的數字未對齊的問題 (#547)。
  • DASH 擴充功能:
    • 在 DASH 資訊清單中,將「f800」剖析為 Dolby 的聲道數量 5 (#688)。
  • 解碼器擴充功能 (FFmpeg、VP9、AV1、MIDI 等):
    • MIDI:修正快轉時會略過程式變更事件的問題 (#704)。
    • 遷移至 FFmpeg 6.0,並將支援的 NDK 更新至 r26b (#707、#867)。
  • 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 包含其他參數,除了現有的 playbackPositionUs 外,還包括 playbackSpeed 和 lastRebufferRealtimeMs。
    • 強化 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)。
    • 新增功能,可使用查詢參數傳輸通用媒體用戶端資料 (CMCD) 資料 (#553)。
    • 修正 ExperimentalBandwidthMeter 中的 ConcurrentModificationException (#612)。
    • 將 MediaPeriodId 參數新增至 CompositeMediaSource.getMediaTimeForChildMediaTime。
    • 在 ConcatenatingMediaSource2 中支援 ClippingMediaSource (以及其他具有週期/視窗時間偏移的來源) (#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)。
  • 影片:
    • 允許 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)。
    • 呼叫 AdsLoader.destroy() 前,請先釋出 StreamManager
    • 將 IMA SDK 版本升級至 3.31.0。
  • 工作階段:
    • 在 DefaultMediaNotificationProvider 中,將通知前景服務行為設為 FOREGROUND_SERVICE_IMMEDIATE (#167)。
    • 僅在 API 31 以上版本使用 android.media.session.MediaSession.setMediaButtonBroadcastReceiver(),避免 Samsung 裝置上已淘汰的 API 發生問題 (#167)。
    • 使用媒體通知控制器做為 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 分鐘) 連線,事件監聽器會自動繼續播放。
  • 下載內容:
    • 為 DownloadService 宣告「資料同步」前景服務類型,以確保與 Android 14 相容。使用這項服務時,應用程式也需要在資訊清單中將 dataSync 新增為 foregroundServiceType,並新增 FOREGROUND_SERVICE_DATA_SYNC 權限 (#11239)。
  • HLS 擴充功能:
    • 根據上次載入開始時間 (而非上次載入完成時間) 計算出的間隔,重新整理 HLS 直播播放清單 (#663)。
  • DASH 擴充功能:
    • 允許在區隔範本網址中使用多個相同的 DASH ID。
    • 新增實驗性支援,可在擷取期間剖析字幕。這項功能可更妥善地合併重疊的字幕,包括解決字幕片段之間轉換時的閃爍問題。您可以使用 DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() 啟用這項功能 (#288)。
  • RTSP 擴充功能:
    • 修正競爭狀況,避免在改用 TCP 時發生 IndexOutOfBoundsException,或在某些情況下播放作業停止。
    • 在 RTSP 設定中,檢查傳回 RtspMediaPeriod 載入狀態時的狀態 (#577)。
    • 忽略 Options 回應公開標頭中的自訂 Rtsp 要求方法 (#613)。
    • 在傳送 keep-alive RTSP 選項要求的時間間隔內,使用 RTSP 設定回應逾時值 (#662)。
  • 解碼器擴充功能 (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)。
  • 測試公用程式:
    • 讓 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。
    • 在通用媒體用戶端資料 (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)。

1.1.0 版本

2023 年 7 月 5 日

  • 通用程式庫:
    • 新增不適合音訊路徑的抑制原因,並在準備就緒時播放 變更抑制時間過長的原因。 (#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)
    • 為 DeviceInfo 新增 Builder,並淘汰現有建構函式。
    • 新增 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)。已納入 br、bl、cid、rtp 和 sid 欄位 (#8699)。API 結構和 API 方法:
      • CMCD 記錄功能預設為停用,請使用 MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) 啟用。
      • 所有按鍵預設為啟用,請覆寫 CmcdConfiguration.RequestConfig.isKeyAllowed(String key),篩選出要記錄的按鍵。
      • 覆寫 CmcdConfiguration.RequestConfig.getCustomData() 即可啟用自訂按鍵記錄功能。
    • 在主要試用版的資訊清單中新增額外動作,以便使用自訂 *.exolist.json 檔案啟動試用版應用程式 (#439)。
    • 在影片播放期間使用Effect,可獲得 ExoPlayer.setVideoEffects()。
    • 更新 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) 時,行為不一致的問題。
  • 轉換程式:
    • 移除 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 會觸發新的音軌選取。
  • 擷取工具:
    • Ogg:修正跳轉時間軸時,檔案時間過長的問題 (#391)。
    • FMP4:修正 TimestampAdjuster 使用 emsg atom 的中繼資料樣本時間,初始化錯誤時間戳記偏移的問題 (#356)。
  • 音訊:
    • 修正以下錯誤:啟用通道功能且 AudioProcessors 處於啟用狀態時,部分播放作業會失敗,例如無縫剪輯 (#10847)。
    • 在直接播放 (卸載) 中,將 Opus 影格封裝在 Ogg 封包中。
    • 在睡眠期間使用卸載排程推斷目前位置。
    • 新增 Renderer.release() 和 AudioSink.release(),以便在播放器生命週期結束時釋出資源。
    • 監聽 DefaultAudioSink 中的音訊功能異動。在 DefaultAudioSink 的建構函式中新增必要參數 context,DefaultAudioSink 會使用該參數註冊為 AudioCapabilitiesReceiver 的事件監聽器,並在收到功能變更通知時更新其 audioCapabilities 屬性。
    • 透過 AudioSink.Listener 介面中的新事件 onAudioCapabilitiesChanged 傳播音訊功能變更,以及觸發 onRendererCapabilitiesChanged 事件的新介面 RendererCapabilities.Listener。
    • 新增 ChannelMixingAudioProcessor,用於對音訊頻道套用縮放/混音。
    • 在 DISCARD_REASON_AUDIO_BYPASS_POSSIBLE 中新增 int 值 DecoderDiscardReasons,以便在音訊功能變更後,可使用略過模式時捨棄音訊解碼器。
    • 新增 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 容器檔案。
  • IMA 擴充功能:
    • 為 DAI 啟用多週期直播 DASH 串流。請注意,目前的實作方式尚不支援在直播中跳轉 (#10912)。
    • 修正錯誤:由於連續時間軸中計算出的內容位置略有不同,因此會在直播中插入新的廣告群組。
  • 工作階段:
    • 新增輔助方法 MediaSession.getControllerForCurrentRequest,取得目前呼叫 Player 方法的控制器相關資訊。
    • 新增 androidx.media3.session.MediaButtonReceiver,讓應用程式能透過藍牙頭戴式耳機等裝置傳送的媒體按鈕事件,實作繼續播放功能 (#167)。
    • 在 MediaSession.Callback.onAddMediaItems 中新增預設實作,允許將要求的 MediaItems 傳遞至 Player (如果具有 LocalConfiguration,例如 URI) (#282)。
    • 根據預設,在 Android 12 以下版本的精簡媒體通知檢視畫面上,新增「跳轉至上一首」和「跳轉至下一首」指令按鈕 (#410)。
    • 在 MediaSession.Callback.onAddMediaItems 中新增預設實作,允許將要求的 MediaItems 傳遞至 Player (如果具有 LocalConfiguration,例如 URI) (#282)。
    • 根據預設,在 Android 12 以下版本的精簡媒體通知檢視畫面上,新增「跳轉至上一首」和「跳轉至下一首」指令按鈕 (#410)。
  • UI:
    • 新增 Util 方法 shouldShowPlayButton 和 handlePlayPauseButtonAction,編寫含有播放/暫停按鈕的自訂 UI 元素。
  • RTSP 擴充功能:
    • 針對 MPEG4-LATM,如果 Describe Response SDP 訊息中沒有 profile-level-id 值,則使用預設值 (#302)。
    • 如果 DESCRIBE 回應標頭中存在基本 URI,則使用基本 URI 解析 RTSP 工作階段的相對路徑 (#11160)。
  • DASH 擴充功能:
    • 針對多時段 DASH 串流,從 MediaLoadData.startTimeMs 和 MediaLoadData.endTimeMs 移除媒體時間偏移。
    • 修正重新準備多時段直播 DASH 媒體來源時,會產生 IndexOutOfBoundsException 的錯誤 (#10838)。
  • 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 參數的選項。
    • 移除 Charsets 的已淘汰字串常數 (ASCII_NAME、UTF8_NAME、ISO88591_NAME、UTF16_NAME 和 UTF16LE_NAME),改用 kotlin.text 套件、java.nio.charset.StandardCharsets 或 com.google.common.base.Charsets 的 Kotlin Charsets。
    • 移除已淘汰的 WorkManagerScheduler 建構函式,改用未淘汰的建構函式,其中包含提供 Context 參數的選項。
    • 移除已淘汰的方法 createVideoSampleFormat、createAudioSampleFormat、createContainerFormat 和 createSampleFormat,這些方法用於例項化 Format 類別。請改用 Format.Builder 建立 Format 的例項。
    • 移除已淘汰的方法 copyWithMaxInputSize、copyWithSubsampleOffsetUs、copyWithLabel、copyWithManifestFormatInfo、copyWithGaplessInfo、copyWithFrameRate、copyWithDrmInitData、copyWithMetadata、copyWithBitrate 和 copyWithVideoSize,改用 Format.buildUpon() 和 setter 方法。
    • 移除已淘汰的 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。
      • onDecoderInitialized,請改用 onAudioDecoderInitialized 和/或 onVideoDecoderInitialized。
      • onDecoderInputFormatChanged,請改用 onAudioInputFormatChanged 和/或 onVideoInputFormatChanged。
      • 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)。
  • 擷取工具:
    • 重複使用 RTSP 和 MP4 擷取器已使用的剖析邏輯,修正 MPEG-TS 檔案中 H.265 SPS 的剖析問題 (#303)。
  • 文字:
    • SSA:針對開頭為位元組順序標記的 UTF-16 檔案新增支援 (#319)。
  • 工作階段:
    • 修正以下問題:當 MediaController 連線至更新動作的舊版 MediaSessionCompat 時,不會更新可用的指令。
    • 修正以下錯誤:在 API 30 上,系統 UI 呼叫 Callback.onGetLibraryRoot 時,MediaLibraryService 無法針對 params.isRecent == true 呼叫傳回空值 (#355)。
    • 修正 MediaSessionService 或 MediaLibraryService 的記憶體流失問題 (#346)。
    • 修正錯誤:MediaSession 中合併的 Timeline 和位置更新可能會導致 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 時,可用指令不會更新的錯誤。
    • 修正以下問題:如果從 MediaController 傳送的 TrackSelectionOverride 執行個體參照含有 Format.metadata 的群組,系統會忽略這些執行個體 (#296)。
    • 修正問題:Player.COMMAND_GET_CURRENT_MEDIA_ITEM 必須可供存取,才能透過舊版 MediaSessionCompat 存取中繼資料。
    • 修正以下問題:在 MediaSessionService 中使用背景執行緒上的 MediaSession 例項時,會導致當機 (#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 版。

  • 核心程式庫:
    • 修正 API 33 的網路類型偵測功能 (#10970)。
    • 修正呼叫 ExoPlayer.isTunnelingEnabled 時的 NullPointerException (#10977)。
  • 下載內容:
    • 在 SegmentDownloader 和子類別中,將要合併的兩個區隔的開始時間最大差異設為可設定 (#248)。
  • 音訊:
    • 修正 Samsung 裝置上 MP3 無縫播放功能中斷的問題 (#8594)。
    • 修正以下錯誤:停用音訊後立即設定的播放速度,可能會遭到先前的速度變更覆寫 (#10882)。
  • 影片:
    • 將 HEVC HDR10 格式對應至 HEVCProfileMain10HDR10,而非 HEVCProfileMain10。
    • 針對 Chromecast (支援 Google TV) 和 Lenovo M10 FHD Plus 的裝置問題新增解決方法,該問題會導致 60fps AVC 串流標示為不支援 (#10898)。
    • 修正播放媒體時,影格率遠高於螢幕刷新率的影格釋出效能問題。
  • 投放:
    • 修正媒體項目之間轉換時的暫時 STATE_IDLE (#245)。
  • RTSP:
    • 擷取剖析無效 RTSP Describe 回應訊息時擲回的 IllegalArgumentException (#10971)。
  • 工作階段:
    • 修正通知播放/暫停按鈕未隨播放器狀態更新的錯誤 (#192)。
  • IMA 擴充功能:
    • 修正錯誤:由於未收到第一個 (在沒有廣告的情況下,也是唯一一個) 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)。
  • 音訊:
    • 使用壓縮的音訊格式位元率,計算直接播放 (直通) 中 AudioTrack 的緩衝區空間下限。
  • 文字:
    • 如果字幕檔案不含任何提示,則請修正 TextRenderer 將無效 (負面) 索引傳遞至 Subtitle.getEventTime 的問題。
    • SubRip:針對開頭為位元組順序標記的 UTF-16 檔案新增支援。
  • 中繼資料:
    • 依據 ID3 v2.4 的許可,從 ID3 影格剖析多個以空值分隔的值。
    • 新增 MediaMetadata.mediaType,表示內容類型或中繼資料說明的資料夾類型。
    • 新增 MediaMetadata.isBrowsable 以取代 MediaMetadata.folderType。資料夾類型會在下一個版本中被淘汰。
  • DASH:
    • 為圖片調整集新增完整剖析功能,包括圖塊數量 (#3752)。
  • UI:
    • 修正已淘汰的 PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener),確保瀏覽權限變更會傳遞至已註冊的監聽器 (#229)。
    • 修正使用從右到左 (RTL) 版面配置時,PlayerView 內中央播放器控制項的排序方式 (#227)。
  • 工作階段:
    • 新增抽象 SimpleBasePlayer,協助實作自訂播放器的 Player 介面。
    • 新增輔助方法,將平台工作階段符記轉換為 Media3 SessionToken (#171)。
    • 使用 onMediaMetadataChanged 觸發平台媒體工作階段的更新作業 (#219)。
    • 將媒體工作階段新增為 DefaultMediaNotificationProvider 的 getMediaButtons() 引數,並使用不可變動的清單為求明確 (#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)。
  • 下載內容:
    • 修正由同一個 PriorityTaskManager 同時下載和播放而在 ProgressiveDownloader 中可能導致的無限迴圈 (#10570)。
    • 立即顯示下載通知 (#183)。
    • 將平行下載移除限制限制在 1 次,以免建立過多執行緒 (#10458)。
  • 影片:
    • 如果螢幕不支援 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。
    • 在所有 Android 版本中,將 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:
    • 新增 H263 片段化封包處理 (#119)。
    • 新增對 MP4A-LATM 的支援 (#162)。
  • 我是:
    • 新增載入廣告資訊的逾時事件,以處理 IMA SDK 載入廣告時卡住的情況 (#10510)。
    • 避免在跳轉至內容結尾時略過片中廣告 (#10685)。
    • 針對包含伺服器端插入廣告的直播,正確計算視窗持續時間,例如 IMA DAI (#10764)。
  • 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)。
  • 擷取工具:
    • 修正 H265 短期參考相片集的剖析問題 (#10316)。
    • 修正從 esds 方塊剖析位元率的問題 (#10381)。
  • DASH:
    • 從資訊清單中剖析 ClearKey 授權網址 (#10246)。
  • UI:
    • 確保 TalkBack 會在播放控制項選單中公告目前使用中的速度選項 (#10298)。
  • RTSP:
    • 新增 VP8 片段化封包處理 (#110)。
  • Leanback 擴充功能:
    • 監聽 LeanbackAdapter 中的 playWhenReady 變更 (10420)。
  • 投放:
    • 請使用已在 CastTimeline 中以 Window.mediaItem 傳遞至播放清單方法的 MediaItem (#25、#8212)。
    • 支援使用 CastPlayer 的 Player.getMetadata() 和 Listener.onMediaMetadataChanged() (#25)。

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 工作階段一律可以正常更新 (10274)。
  • 文字:
    • 將 Player.getCurrentCues() 變更為回傳 CueGroup,而不是 List<Cue>。
    • SSA:在 BorderStyle == 3 的情況下支援 OutlineColour 樣式設定 (也就是說 OutlineColour 會設定提示的背景) (#8435)。
    • CEA-708:將資料剖析為多個服務區塊,並忽略並未和目前選取的服務編號相關的區塊。
    • 移除 RawCcExtractor,這個項目只有 Google 內部字幕格式使用。
  • 擷取工具:
    • 新增 AVI 支援 (#2092)。
    • Matroska:為 Opus 音軌剖析 DiscardPadding。
    • MP4:從 esds 方格中剖析位元率。
    • Ogg:允許重複的 Opus ID 及留言標頭 (10038)。
  • 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 的執行個體。
  • 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)。
  • 移除已淘汰的符號:
    • 移除 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 解碼器。
  • 音訊:
    • 修正 Dolby Atmos (E-AC3-JOC) 的解碼器備用邏輯,視需要使用相容的 E-AC3 解碼器。
    • 變更 AudioCapabilities API,要求明確傳遞 AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES (而非 null)。
    • 將 AudioTrackBufferSizeProvider 插入 DefaultAudioSink,允許自訂 AudioTrack 緩衝區空間的計算方式。(#8891)。
    • 如果要求的緩衝區空間 > 1 MB,請重新嘗試建立 AudioTrack。(#9712)。
  • 擷取工具:
    • WAV:新增 RF64 串流支援 (#9543)。
    • 修正 H.265 SPS NAL 單元的剖析錯誤 (#9719)。
    • 在 Ogg Opus 和 Ogg Vorbis 檔案中剖析 Vorbis 評論 (包括 METADATA_BLOCK_PICTURE)。
  • 文字:
    • 新增 MediaItem.SubtitleConfiguration.id 欄位,系統會將該欄位套用到透過設定建立的字幕軌的 Format.id 欄位 (#9673)。
    • 在 Matroska 容器中新增 WebVTT 字幕的基本支援 (#9886)。
    • 禁止 Cea708Decoder 讀取超過服務區塊宣告的大小。
  • DRM:
    • 從 DrmSessionManager.(pre)acquireSession 中 playbackLooper 移除。當自訂 MediaSource 中的應用程式使用 DrmSessionManager 時,必須改將 playbackLooper 傳遞至 DrmSessionManager.setPlayer。
  • 廣告播放 / IMA:
    • 新增 IMA 動態廣告插播 (DAI) 支援 (#8213)。
    • 將方法新增至 AdPlaybackState 以允許重設廣告群組,以便系統再次播放廣告群組 (#9615)。
    • 在廣告播放期間強制執行 1.0 的播放速度 (#9018)。
    • 修正廣告群組載入失敗,並導致播放立即重設的問題 (#9929)。
  • UI:
    • 修正使用特定主題時,StyledPlayerView 倒轉和快轉按鈕中數字的顏色 (#9765)。
    • 正確平移播放速度字串 (#9811)。
  • DASH:
    • 在 Representation 中新增剖析的必要和補充屬性 (#9579)。
    • 支援 forced-subtitle 音軌角色 (#9727)。
    • 停止將 main 音軌角色解讀為 C.SELECTION_FLAG_DEFAULT。
    • 針對未宣告 DVB 命名空間的資訊清單,修正基準網址排除邏輯 (#9856)。
    • 支援相對 MPD.Location 網址 (#9939)。
  • HLS:
    • 正確填入純音訊 HLS 串流的 Format.label (#9608)。
    • 預設使用不分區塊準備,以縮短啟動時間。如果轉譯內容包含並未在主要播放清單中宣告的互斥隱藏式輔助字幕軌,您應該將該轉譯內容加入主要播放清單以供播放,或是使用 HlsMediaSource.Factory.setAllowChunklessPreparation(false) 關閉不分區塊準備。
    • 支援在 HLS 中準確搜尋主要畫面格 (#2882)。
  • RTSP:
    • 提供用戶端 API 以覆寫任何伺服器連線所用的 SocketFactory (#9606)。
    • 如果兩者同時存在,請優先採用 DIGEST 驗證方式,而非 BASIC 方法 (#9800)。
    • 在 RTSP 音軌時間碼無法使用時處理 (#9775)。
    • 忽略無效的 RTP-Info 標頭值 (#9619)。
  • 轉換程式:
    • 將最低 API 版本提升至 21。
    • TransformationException 現已用於描述轉換期間發生的錯誤。
    • 新增 TransformationRequest 來指定轉換選項。
    • 允許註冊多個事件監聽器。
    • 修正轉換程式在部分轉碼器輸出讀取後卡住的問題。
    • 修正釋出多工器時,Transformer.getProgress 中可能擲回的 NPE。
    • 新增用於套用轉換的試用版應用程式。
  • MediaSession 擴充功能:
    • 根據預設,MediaSessionConnector 現在會在停止時清除播放清單。 如果希望應用程式保留播放清單,可在連接器上呼叫 setClearMediaItemsOnStop(false)。
  • Cast 擴充功能:
    • 修正導致 CastPlayer 無法正確呼叫 onIsPlayingChanged 的錯誤 (#9792)。
    • 支援音訊中繼資料,包括有 DefaultMediaItemConverter 的圖片 (#9663)。
  • 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)。
  • 移除已淘汰的符號:
    • 移除 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 模組取代)。如此一來,不需使用轉接器/連接器類別,就能直接整合播放器及媒體工作階段。