Media3

  Mã mẫu
Các thư viện hỗ trợ cho trường hợp sử dụng liên quan đến nội dung nghe nhìn.
Bản cập nhật mới nhất Bản phát hành ổn định Bản phát hành dùng thử Bản phát hành beta Bản phát hành alpha
Ngày 20 tháng 12 năm 2024 1.5.1 - - 1.6.0-alpha01

Khai báo phần phụ thuộc

Để thêm một phần phụ thuộc trên Media3, bạn phải thêm kho lưu trữ Google Maven vào dự án. Đọc nội dung Kho lưu trữ Maven của Googleđể biết thêm thông tin.

Thêm các phần phụ thuộc cho cấu phần phần mềm bạn cần trong tệp build.gradle cho ứng dụng hoặc mô-đun của mình:

Groovy

dependencies {
    def media3_version = "1.5.0"

    // 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
    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 integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.5.0"

    // 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
    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 integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

Để biết thêm thông tin về các phần phụ thuộc, hãy xem nội dung Thêm phần phụ thuộc cho bản dựng.

Ý kiến phản hồi

Phản hồi của bạn giúp cải thiện Jetpack. Bạn có thể sử dụng trình theo dõi vấn đề Media3 để tìm câu trả lời cho các thắc mắc, lỗi đã biết cũng như yêu cầu tính năng, đồng thời để báo cáo lỗi mới.

Phiên bản 1.6.0

Phiên bản 1.6.0-alpha01

Ngày 20 tháng 12 năm 2024

Phát hành androidx.media3:media3-*:1.6.0-alpha01. Phiên bản 1.6.0-alpha01 bao gồm các thay đổi sau.

  • Thư viện chung:
    • Xoá phương thức Format.toBundle(boolean excludeMetadata), thay vào đó, hãy sử dụng Format.toBundle().
    • Thêm AudioManagerCompatAudioFocusRequestCompat để thay thế các lớp tương đương trong androidx.media.
  • ExoPlayer:
    • Cân nhắc ngôn ngữ khi chọn kênh video. Theo mặc định, hãy chọn một kênh video "chính" khớp với ngôn ngữ của kênh âm thanh đã chọn (nếu có). Bạn có thể thể hiện lựa chọn ưu tiên về ngôn ngữ video phản cảm bằng TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Thêm tham số selectedAudioLanguage vào phương thức DefaultTrackSelector.selectVideoTrack().
    • Thêm tham số retryCount vào MediaSourceEventListener.onLoadStarted và các phương thức MediaSourceEventListener.EventDispatcher tương ứng.
    • Khắc phục lỗi trong đó các mục hoặc khoảng thời gian trong danh sách phát trong luồng DASH nhiều khoảng thời gian có thời lượng không khớp với nội dung thực tế có thể khiến khung hình bị treo ở cuối mục (#1698).
    • Giảm giá trị mặc định cho bufferForPlaybackMsbufferForPlaybackAfterRebufferMs trong DefaultLoadControl xuống còn 1000 và 2000 mili giây tương ứng.
    • Thêm MediaExtractorCompat, một lớp mới cung cấp các tính năng tương đương với nền tảng MediaExtractor.
    • Di chuyển BasePreloadManager.Listener sang PreloadManagerListener cấp cao nhất.
    • Bạn có thể triển khai RenderersFactory.createSecondaryRenderer để cung cấp trình kết xuất phụ cho quá trình khởi động trước. Tính năng khởi động trước cho phép chuyển đổi mục nội dung nghe nhìn nhanh hơn trong khi phát.
    • Bật tính năng gửi CmcdData cho các yêu cầu tệp kê khai ở định dạng truyền phát thích ứng DASH, HLS và SmoothStreaming (#1951).
    • Cung cấp MediaCodecInfo của bộ mã hoá và giải mã sẽ được khởi chạy trong MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Thay đổi AdsMediaSource để cho phép AdPlaybackStates phát triển bằng cách thêm các nhóm quảng cáo. Phát hiện các nội dung sửa đổi không hợp lệ và gửi một ngoại lệ.
  • Bộ chuyển đổi:
    • Cập nhật các tham số của VideoFrameProcessor.registerInputStreamVideoFrameProcessor.Listener.onInputStreamRegistered để sử dụng Format.
    • Thêm tính năng hỗ trợ chuyển đổi sang các định dạng tương thích ngược thay thế.
    • Tạo siêu dữ liệu tĩnh HDR khi sử dụng DefaultEncoderFactory.
  • Công cụ trích xuất:
    • AVI: Khắc phục việc xử lý các tệp có âm thanh nén tốc độ bit không đổi, trong đó tiêu đề luồng lưu trữ số byte thay vì số khối.
  • Âm thanh:
    • Khắc phục onAudioPositionAdvancing để được gọi khi phát lại tiếp tục (trước đây, phương thức này được gọi khi phát lại bị tạm dừng).
  • Video:
    • Sửa MediaCodecVideoRenderer sao cho khi không có Surface, trình kết xuất chỉ bỏ qua các khung hình chỉ sớm nếu VideoFrameReleaseControl.getFrameReleaseAction không phải là FRAME_RELEASE_TRY_AGAIN_LATER.
  • Văn bản:
    • Ngừng tải tất cả tệp phụ đề được định cấu hình bằng MediaItem.Builder.setSubtitleConfigurations, thay vào đó, chỉ tải một tệp nếu tệp đó được chọn theo lựa chọn bản nhạc (#1721).
  • Hiệu ứng:
    • Di chuyển chức năng của OverlaySettings vào StaticOverlaySettings. Bạn có thể tạo lớp con cho OverlaySettings để cho phép cài đặt lớp phủ động.
  • Trình kết hợp:
    • Di chuyển MuxerException ra khỏi giao diện Muxer để tránh tên đủ điều kiện rất dài.
  • Phiên:
    • Thêm "Context" làm tham số vào "MediaButtonReceiver.shouldStartForegroundService" (#1887).
  • Giao diện người dùng:
    • Thêm Thành phần kết hợp PlayerSurface vào mô-đun media3-ui-compose.
    • Thêm các lớp PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState và các thành phần kết hợp tương ứng rememberPlayPauseButtonState, rememberNextButtonState, rememberPreviousButtonState, rememberRepeatButtonState, rememberShuffleButtonState vào mô-đun media3-ui-compose.
  • Tiện ích HLS:
    • Thêm phiên bản đầu tiên của HlsInterstitialsAdsLoader. Trình tải quảng cáo đọc các quảng cáo xen kẽ HLS của danh sách phát nội dung đa phương tiện HLS và liên kết các quảng cáo đó với AdPlaybackState được truyền đến AdsMediaSource. Phiên bản ban đầu này chỉ hỗ trợ các luồng VOD HLS có thuộc tính X-ASSET-URI.
    • Thêm HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Các ứng dụng có thể sử dụng lớp này để tạo các thực thể AdsMediaSource sử dụng HlsInterstitialsAdsLoader một cách thuận tiện và an toàn.
  • Tiện ích DASH:
    • Thêm tính năng hỗ trợ định dạng AC-4 cấp 4 cho DASH (#1898).
  • Tiện ích bộ giải mã (FFmpeg, VP9, AV1, v.v.):
    • Thêm mô-đun giải mã MPEG-H sử dụng mô-đun giải mã MPEG-H gốc để giải mã âm thanh MPEG-H (#1826).
  • Ứng dụng minh hoạ:
    • Thêm MinimalControls (PlayPauseButton, NextButton, PreviousButton) và ExtraControls (RepeatButton, ShuffleButton) Thành phần giao diện người dùng có thể kết hợp vào demo-compose bằng cách sử dụng PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState.
  • Xoá các biểu tượng không dùng nữa:
    • Xoá phương thức AudioMixer.create() không dùng nữa. Sử dụng DefaultAudioMixer.Factory().create().
    • Xoá các phương thức Transformer.Builder không dùng nữa sau đây:
      • setTransformationRequest(), hãy sử dụng setAudioMimeType(), setVideoMimeType()setHdrMode().
      • setAudioProcessors(), hãy đặt bộ xử lý âm thanh trong EditedMediaItem.Builder.setEffects() và chuyển bộ xử lý đó đến Transformer.start().
      • setVideoEffects(), hãy đặt hiệu ứng video trong EditedMediaItem.Builder.setEffects() và truyền hiệu ứng đó đến Transformer.start().
      • setRemoveAudio(), hãy sử dụng EditedMediaItem.Builder.setRemoveAudio() để xoá âm thanh khỏi EditedMediaItem được truyền đến Transformer.start().
      • setRemoveVideo(), hãy sử dụng EditedMediaItem.Builder.setRemoveVideo() để xoá video khỏi EditedMediaItem được truyền đến Transformer.start().
      • setFlattenForSlowMotion(), hãy sử dụng EditedMediaItem.Builder.setFlattenForSlowMotion() để làm phẳng EditedMediaItem được truyền đến Transformer.start().
      • setListener(), hãy sử dụng addListener(), removeListener() hoặc removeAllListeners().
    • Xoá các phương thức Transformer.Listener không dùng nữa sau đây:
      • onTransformationCompleted(MediaItem), hãy sử dụng onCompleted(Composition, ExportResult).
      • onTransformationCompleted(MediaItem, TransformationResult), hãy sử dụng onCompleted(Composition, ExportResult).
      • onTransformationError(MediaItem, Exception), hãy sử dụng onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationException), hãy sử dụng onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationResult, TransformationException), hãy sử dụng onError(Composition, ExportResult, ExportException).
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), hãy sử dụng onFallbackApplied(Composition, TransformationRequest, TransformationRequest).
    • Xoá lớp TransformationResult không dùng nữa. Thay vào đó, hãy sử dụng ExportResult.
    • Xoá lớp TransformationException không dùng nữa. Thay vào đó, hãy sử dụng ExportException.
    • Xoá Transformer.PROGRESS_STATE_NO_TRANSFORMATION không dùng nữa. Sử dụng Transformer.PROGRESS_STATE_NOT_STARTED.
    • Xoá Transformer.setListener() không dùng nữa. Thay vào đó, hãy sử dụng Transformer.addListener(), Transformer.removeListener() hoặc Transformer.removeAllListeners().
    • Xoá Transformer.startTransformation() không dùng nữa. Sử dụng Transformer.start(MediaItem, String).
    • Xoá SingleFrameGlShaderProgram không dùng nữa. Sử dụng BaseGlShaderProgram.
    • Xoá Transformer.flattenForSlowMotion. Sử dụng EditedMediaItem.flattenForSlowMotion.

Phiên bản 1.5

Phiên bản 1.5.1

Ngày 19 tháng 12 năm 2024

Phát hành androidx.media3:media3-*:1.5.1. Phiên bản 1.5.1 bao gồm các thay đổi sau.

  • ExoPlayer:
    • Tắt tính năng sử dụng giải mã không đồng bộ trong MediaCodec để tránh các vấn đề về thời gian chờ bộ mã hoá và giải mã được báo cáo với API nền tảng này (#1641).
  • Công cụ trích xuất:
    • MP3: Đừng dừng phát sớm khi mục lục của khung VBRI không bao gồm tất cả dữ liệu MP3 trong tệp (#1904).
  • Video:
    • Quay lại sử dụng các giá trị tỷ lệ khung hình pixel do MediaCodecAdapter cung cấp khi được cung cấp trong khi xử lý onOutputFormatChanged (#1371).
  • Văn bản:
    • Khắc phục lỗi trong ReplacingCuesResolver.discardCuesBeforeTimeUs, trong đó tín hiệu hoạt động tại timeUs (bắt đầu trước nhưng chưa kết thúc) bị loại bỏ không chính xác (#1939).
  • Siêu dữ liệu:
    • Trích xuất số đĩa/bản nhạc và thể loại từ bình luận Vorbis vào MediaMetadata (#1958).

Phiên bản 1.5.0

Ngày 27 tháng 11 năm 2024

Phát hành androidx.media3:media3-*:1.5.0. Phiên bản 1.5.0 bao gồm các thay đổi sau.

  • Thư viện chung:
    • Thêm ForwardingSimpleBasePlayer cho phép chuyển tiếp đến một trình phát khác bằng các điều chỉnh nhỏ trong khi vẫn đảm bảo tính nhất quán và xử lý trình nghe đầy đủ (#1183).
    • Thay thế SimpleBasePlayer.State.playlist bằng phương thức getPlaylist().
    • Thêm chế độ ghi đè cho SimpleBasePlayer.State.Builder.setPlaylist() để chỉ định trực tiếp TimelineTracksMetadata hiện tại thay vì tạo cấu trúc danh sách phát.
    • Tăng minSdk lên 21 (Android Lollipop). Điều này phù hợp với tất cả các thư viện AndroidX khác.
    • Thêm cấu phần phần mềm androidx.media3:media3-common-ktx cung cấp chức năng dành riêng cho Kotlin được xây dựng dựa trên thư viện Common
    • Thêm hàm mở rộng tạm ngưng Player.listen để tạo một coroutine nhằm nghe Player.Events vào thư viện media3-common-ktx.
    • Xoá chú thích @DoNotInline khỏi các lớp bên trong nằm ngoài dòng theo cách thủ công để tránh lỗi xác minh lớp thời gian chạy. Các phiên bản gần đây của R8 hiện tự động thực hiện các lệnh gọi ngoài dòng như vậy để tránh các lỗi thời gian chạy (vì vậy, bạn không cần phải thực hiện lệnh gọi ngoài dòng theo cách thủ công nữa). Tất cả người dùng Gradle của thư viện phải đang sử dụng một phiên bản Trình bổ trợ Android cho Gradle sử dụng một phiên bản R8 thực hiện việc này, do compileSdk = 35. Người dùng thư viện có hệ thống xây dựng không phải Gradle sẽ cần đảm bảo rằng bước rút gọn/làm rối tương đương với R8 thực hiện quy trình tự động tương tự ngoài dòng để tránh lỗi xác minh lớp thời gian chạy. Thay đổi này đã được thực hiện trong các thư viện AndroidX khác.
  • ExoPlayer:
    • Giờ đây, bạn có thể gọi MediaCodecRenderer.onProcessedStreamChange() cho mọi mục nội dung nghe nhìn. Trước đây, phương thức này không được gọi cho lần đầu tiên. Sử dụng MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() để bật tính năng này.
    • Thêm PreloadMediaSource.PreloadControl.onPreloadError để cho phép các phương thức triển khai PreloadMediaSource.PreloadControl thực hiện hành động khi xảy ra lỗi.
    • Thêm BasePreloadManager.Listener để truyền sự kiện tải trước đến các ứng dụng.
    • Cho phép thay đổi thời gian chờ của ứng dụng SNTP và thử lại các địa chỉ thay thế khi hết thời gian chờ (#1540).
    • Xoá MediaCodecAdapter.Configuration.flags vì trường này luôn bằng 0.
    • Cho phép người dùng chọn loa tích hợp để phát trên Wear OS API 35 trở lên (trong đó thiết bị quảng cáo tính năng hỗ trợ cho việc này).
    • Hoãn lệnh gọi chặn đến Context.getSystemService(Context.AUDIO_SERVICE) cho đến khi bật tính năng xử lý tiêu điểm âm thanh. Điều này đảm bảo không thực hiện lệnh gọi chặn nếu bạn không bật tính năng xử lý tiêu điểm âm thanh (#1616).
    • Cho phép phát bất kể thời lượng được lưu vào bộ đệm khi không tải được (#1571).
    • Thêm AnalyticsListener.onRendererReadyChanged() để báo hiệu khi trình kết xuất riêng lẻ cho phép phát.
    • Khắc phục lỗi MediaCodec.CryptoException đôi khi được báo cáo là "lỗi thời gian chạy không mong muốn" khi MediaCodec được vận hành ở chế độ không đồng bộ (hành vi mặc định trên API 31 trở lên).
    • Truyền bufferedDurationUs thay vì bufferedPositionUs bằng PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Ngoài ra, hãy thay đổi DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS thành DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS, sau đó, ứng dụng cần truyền một giá trị đại diện cho một khoảng thời gian cụ thể từ vị trí bắt đầu mặc định mà nguồn nội dung nghe nhìn tương ứng phải được tải trước bằng IntDef này, thay vì một vị trí.
    • Thêm phương thức triển khai ForwardingRenderer chuyển tiếp tất cả lệnh gọi phương thức đến một trình kết xuất khác (1703).
    • Thêm tính năng tải trước danh sách phát cho mục tiếp theo trong danh sách phát. Ứng dụng có thể bật tính năng tải trước bằng cách gọi ExoPlayer.setPreloadConfiguration(PreloadConfiguration) cho phù hợp. Theo mặc định, tính năng tải trước sẽ bị tắt. Khi người dùng chọn sử dụng và để không ảnh hưởng đến quá trình phát, DefaultLoadControl sẽ hạn chế việc tải trước để bắt đầu và chỉ tiếp tục khi trình phát không tải để phát. Các ứng dụng có thể thay đổi hành vi này bằng cách triển khai LoadControl.shouldContinuePreloading() cho phù hợp (chẳng hạn như khi ghi đè phương thức này trong DefaultLoadControl). Phương thức triển khai mặc định của LoadControl sẽ tắt tính năng tải trước trong trường hợp ứng dụng đang sử dụng phương thức triển khai tuỳ chỉnh của LoadControl.
    • Thêm phương thức MediaSourceEventListener.EventDispatcher.dispatchEvent() để cho phép gọi các sự kiện của trình nghe lớp con (1736).
    • Thêm DefaultPreloadManager.Builder để tạo các thực thể DefaultPreloadManagerExoPlayer bằng các cấu hình được chia sẻ nhất quán.
    • Xoá tham số Renderer[] khỏi LoadControl.onTracksSelected() vì việc triển khai DefaultLoadControl có thể truy xuất các loại luồng từ ExoTrackSelection[].
    • Không dùng DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) nữa và đánh dấu phương thức là cuối cùng để ngăn việc ghi đè. Thay vào đó, bạn nên sử dụng DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) mới.
    • Báo cáo sự kiện MediaSourceEventListener từ các nguồn phụ trong MergingMediaSource. Điều này sẽ dẫn đến việc các sự kiện bắt đầu tải/lỗi/bị huỷ/hoàn tất được báo cáo cho phụ đề tải không qua cửa hàng (những phụ đề được thêm bằng MediaItem.LocalConfiguration.subtitleConfigurations). Các sự kiện này có thể xuất hiện dưới dạng sự kiện tải trùng lặp được phát ra từ AnalyticsListener.
    • Ngăn lỗi phụ đề và siêu dữ liệu khiến quá trình phát bị dừng hoàn toàn. Thay vào đó, bản nhạc có vấn đề sẽ bị tắt và quá trình phát các bản nhạc còn lại sẽ tiếp tục (#1722).
      • Trong quá trình xử lý phụ đề mới (trong quá trình trích xuất), dữ liệu phân tích cú pháp liên kết (ví dụ: dữ liệu phụ đề không hợp lệ) và lỗi tải (ví dụ: HTTP 404) sẽ được phát qua lệnh gọi lại onLoadError.
      • Trong cách xử lý phụ đề cũ (trong quá trình kết xuất), chỉ các lỗi tải liên quan mới được phát qua lệnh gọi lại onLoadError, còn các lỗi phân tích cú pháp sẽ bị bỏ qua (đây là hành vi có sẵn).
    • Khắc phục lỗi trong đó các mục hoặc khoảng thời gian trong danh sách phát trong luồng DASH nhiều khoảng thời gian có thời lượng không khớp với nội dung thực tế có thể khiến khung hình bị treo ở cuối mục (#1698).
    • Thêm phương thức setter vào SntpClient để đặt thời gian đã trôi qua tối đa kể từ lần cập nhật gần nhất, sau đó ứng dụng sẽ được khởi tạo lại (#1794).
  • Bộ chuyển đổi:
    • Thêm SurfaceAssetLoader để hỗ trợ đưa dữ liệu video vào hàng đợi cho Transformer thông qua Surface.
    • ImageAssetLoader báo cáo dữ liệu đầu vào không được hỗ trợ thông qua AssetLoader.onError thay vì gửi IllegalStateException.
    • Bắt buộc phải đặt thời lượng hình ảnh bằng MediaItem.Builder.setImageDurationMs để xuất hình ảnh.
    • Thêm tính năng hỗ trợ xuất cho các khoảng trống trong trình tự của các EditedMediaItems âm thanh.
  • Chọn bản nội dung:
    • DefaultTrackSelector: Ưu tiên âm thanh dựa trên đối tượng hơn âm thanh dựa trên kênh khi các yếu tố khác bằng nhau.
  • Công cụ trích xuất:
    • Cho phép Mp4ExtractorFragmentedMp4Extractor xác định các mẫu H264 không được các mẫu tiếp theo dùng làm tham chiếu.
    • Thêm tuỳ chọn để bật tính năng tua dựa trên chỉ mục trong AmrExtractor.
    • Xem các tệp MP3 có kích thước lớn hơn 128 kB giữa các khung hợp lệ là bị cắt ngắn (thay vì không hợp lệ). Điều này có nghĩa là các tệp có dữ liệu không phải MP3 ở cuối, không có siêu dữ liệu nào khác cho biết độ dài của byte MP3, hiện sẽ dừng phát ở cuối dữ liệu MP3 thay vì không phát được với ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Khắc phục lỗi xử lý mẫu trước khi phát cho các vị trí bắt đầu nội dung nghe nhìn không phải khung hình chính khi xử lý danh sách chỉnh sửa trong tệp MP4 (#1659).
    • Cải thiện tính năng tính tốc độ khung hình bằng cách sử dụng thời lượng nội dung nghe nhìn từ hộp mdhd trong Mp4ExtractorFragmentedMp4Extractor (#1531).
    • Khắc phục việc điều chỉnh tỷ lệ không chính xác của media_time trong danh sách chỉnh sửa MP4. Mặc dù segment_duration đã được điều chỉnh theo tỷ lệ chính xác bằng tốc độ khung hình của phim, nhưng media_time hiện được điều chỉnh theo tỷ lệ chính xác bằng tốc độ khung hình của bản nhạc, như được chỉ định theo tiêu chuẩn định dạng MP4 (#1792).
    • Xử lý các khung không theo thứ tự trong phép tính endIndices cho MP4 bằng danh sách chỉnh sửa (#1797).
    • Khắc phục lỗi phân tích cú pháp thời lượng nội dung nghe nhìn trong hộp mdhd của tệp MP4 để xử lý các giá trị -1 (#1819).
    • Thêm tính năng hỗ trợ để xác định hộp h263 trong tệp MP4 cho video H.263 (#1821).
    • Thêm tính năng hỗ trợ định dạng tệp phương tiện cơ sở ISO AC-4 cấp 4 (#1265).
  • DataSource:
    • Cập nhật HttpEngineDataSource để cho phép sử dụng bắt đầu từ tiện ích phiên bản S 7 thay vì API cấp 34 (#1262).
    • DataSourceContractTest: Xác nhận rằng DataSource.getUri() trả về URI đã phân giải (như đã ghi nhận). Nếu khác với URI được yêu cầu, các chương trình kiểm thử có thể cho biết điều này bằng cách sử dụng phương thức DataSourceContractTest.TestResource.Builder.setResolvedUri() mới.
    • DataSourceContractTest: Xác nhận rằng DataSource.getUri()getResponseHeaders() trả về giá trị "mở" sau khi lệnh gọi đến open() không thành công (do tài nguyên "không tìm thấy") và trước lệnh gọi close() tiếp theo.
      • Việc ghi đè DataSourceContractTest.getNotFoundResources() cho phép các lớp con kiểm thử cung cấp nhiều tài nguyên "không tìm thấy" và cũng cung cấp mọi tiêu đề dự kiến. Điều này cho phép phân biệt giữa HTTP 404 (có tiêu đề) và "không tìm thấy máy chủ" (không có tiêu đề).
  • Âm thanh:
    • Tự động định cấu hình siêu dữ liệu về độ to CTA-2075 trên bộ mã hoá và giải mã nếu siêu dữ liệu này có trong nội dung nghe nhìn.
    • Đảm bảo âm lượng giảm dần một cách mượt mà khi tua.
    • Khắc phục âm thanh bật lên có thể xảy ra trong quá trình tìm kiếm.
    • Khắc phục lỗi tích luỹ do cắt bớt cho thuật toán kéo dài thời gian/chuyển đổi cao độ của Sonic.
    • Khắc phục lỗi trong SpeedChangingAudioProcessor khiến các khung đầu ra bị bỏ qua.
  • Video:
    • MediaCodecVideoRenderer tránh giải mã các mẫu không được kết xuất hoặc không được các mẫu khác dùng làm tham chiếu.
    • Trên API 35 trở lên, MediaCodecAdapter hiện có thể nhận được null Surface trong configure và gọi đến một phương thức mới detachOutputSurface để xoá Surface đã đặt trước đó nếu bộ mã hoá và giải mã hỗ trợ việc này (MediaCodecInfo.detachedSurfaceSupported).
    • Sử dụng các giá trị tỷ lệ khung hình pixel do MediaCodecAdapter cung cấp nếu có khi xử lý onOutputFormatChanged (#1371).
    • Thêm giải pháp cho vấn đề thiết bị trên Galaxy Tab S7 FE khiến luồng H264 bảo mật 60 khung hình/giây bị đánh dấu là không được hỗ trợ (#1619).
    • Thêm giải pháp cho các bộ mã hoá và giải mã bị treo sau mẫu cuối cùng mà không trả về tín hiệu kết thúc luồng.
  • Văn bản:
    • Thêm VoiceSpan tuỳ chỉnh và điền vào phạm vi giọng nói WebVTT (#1632).
    • Đảm bảo WebVTT trong HLS có dấu thời gian phụ đề rất lớn (tràn ngập long 64 bit khi được biểu thị dưới dạng micro giây và nhân với cơ sở thời gian MPEG 90,000) được hiển thị (#1763).
    • Hỗ trợ phụ đề CEA-608 trong nội dung Dolby Vision (#1820).
    • Khắc phục tình trạng phát bị treo trên các luồng nhiều giai đoạn DASH khi bật phụ đề CEA-608 (#1863).
  • Siêu dữ liệu:
    • Chỉ định loại C.TRACK_TYPE_METADATA cho các bản nhạc chứa nội dung icy hoặc vnd.dvb.ait.
  • Hình ảnh:
    • Thêm ExternallyLoadedImageDecoder để đơn giản hoá việc tích hợp với các thư viện tải hình ảnh bên ngoài như Glide hoặc Coil.
  • DataSource:
    • Thêm FileDescriptorDataSource, một DataSource mới có thể dùng để đọc từ FileDescriptor (#3757).
  • Hiệu ứng:
    • Thêm giải pháp DefaultVideoFrameProcessor cho việc điều chỉnh theo tỷ lệ SurfaceTexture nhỏ. SurfaceTexture có thể bao gồm một tỷ lệ nhỏ cắt bỏ đường viền 1 texel xung quanh cạnh của vùng đệm đã cắt. Hiện tại, vấn đề này được xử lý để kết quả gần với dự kiến hơn.
    • Tăng tốc DefaultVideoFrameProcessor.queueInputBitmap(). Do đó, việc xuất hình ảnh sang video bằng Transformer sẽ nhanh hơn.
  • Tiện ích IMA:
    • Khắc phục lỗi xoá danh sách phát có thể gây ra ArrayIndexOutOfBoundsException trong ImaServerSideAdInsertionMediaSource.
    • Khắc phục lỗi các luồng DAI được chèn phía máy chủ mà không có quảng cáo trước khi phát có thể dẫn đến ArrayIndexOutOfBoundsException khi phát qua quảng cáo trong video gần đây nhất (#1741).
  • Phiên:
    • Thêm MediaButtonReceiver.shouldStartForegroundService(Intent) để cho phép các ứng dụng ngăn chặn lệnh phát đến để tiếp tục phát bằng cách ghi đè phương thức này. Theo mặc định, dịch vụ này luôn được khởi động và không thể ngăn chặn chế độ phát nếu hệ thống không gặp sự cố với dịch vụ bằng ForegroundServiceDidNotStartInTimeException (#1528).
    • Khắc phục lỗi khiến các lệnh tuỳ chỉnh được gửi từ MediaBrowser được gửi đến MediaSessionCompat.Callback thay vì biến thể MediaBrowserServiceCompat của phương thức khi kết nối với một dịch vụ cũ. Điều này đã ngăn MediaBrowser nhận giá trị trả về thực tế do dịch vụ cũ gửi lại (#1474).
    • Xử lý IllegalArgumentException do các thiết bị của một số nhà sản xuất nhất định gửi khi thiết lập broadcast receiver cho ý định của nút nội dung nghe nhìn (#1730).
    • Thêm nút lệnh cho các mục nội dung nghe nhìn. Thao tác này sẽ thêm API Media3 cho Custom browse actions với thư viện cũ có MediaBrowserCompat. Xin lưu ý rằng với các nút lệnh Media3, bạn có thể sử dụng các mục nội dung đa phương tiện cho cả MediaBrowserMediaController. Xem nội dung Thao tác duyệt qua tuỳ chỉnh của AAOS.
    • Khắc phục lỗi đôi khi tay điều khiển Media3 không thể cho phép ứng dụng phiên bắt đầu một dịch vụ trên nền trước sau khi yêu cầu play().
    • Hạn chế CommandButton.Builder.setIconUri chỉ chấp nhận Uri nội dung.
    • Truyền gợi ý kết nối của trình duyệt Media3 đến MediaBrowserCompat ban đầu khi kết nối với MediaBrowserCompat cũ. Dịch vụ có thể nhận được gợi ý kết nối được truyền vào dưới dạng gợi ý gốc bằng lệnh gọi đầu tiên đến onGetRoot().
    • Khắc phục lỗi MediaBrowser kết nối với dịch vụ trình duyệt cũ, không nhận được lỗi do dịch vụ gửi sau khi trình duyệt đăng ký parentid.
    • Cải thiện hành vi tương tác để trình duyệt Media3 được kết nối với MediaBrowserService cũ không yêu cầu các thành phần con của parentId hai lần khi đăng ký một thành phần mẹ.
  • Giao diện người dùng:
    • Chọn sử dụng giải pháp video kéo giãn/cắt bớt trong PlayerView-in-Compose-AndroidView do các vấn đề với hiệu ứng chuyển đổi dùng chung dựa trên XML. Các ứng dụng sử dụng PlayerView bên trong AndroidView cần gọi PlayerView.setEnableComposeSurfaceSyncWorkaround để chọn sử dụng (#1237, #1594).
    • Thêm setFullscreenButtonState vào PlayerView để cho phép cập nhật biểu tượng của nút toàn màn hình theo yêu cầu, tức là ngoài phạm vi và không phản ứng với lượt tương tác nhấp (#1590, #184).
    • Khắc phục lỗi lựa chọn "Không có" trong lựa chọn văn bản không hoạt động nếu có lựa chọn ưu tiên lựa chọn bản nhạc văn bản do ứng dụng xác định.
  • Tiện ích DASH:
    • Thêm tính năng hỗ trợ cho các dấu chấm bắt đầu ở giữa một phân đoạn (#1440).
  • Tiện ích phát trực tuyến mượt mà:
    • Khắc phục lỗi Bad magic number for Bundle khi phát luồng SmoothStreaming có bản nhạc văn bản (#1779).
  • Tiện ích RTSP:
    • Khắc phục lỗi xoá thông tin người dùng đối với các URL chứa ký tự @ đã mã hoá (#1138).
    • Khắc phục sự cố khi phân tích cú pháp các gói RTP có phần mở rộng tiêu đề (#1225).
  • Tiện ích bộ giải mã (FFmpeg, VP9, AV1, v.v.):
    • Thêm mô-đun giải mã IAMF để hỗ trợ phát các tệp MP4 chứa các bản nhạc IAMF bằng cách sử dụng thư viện gốc libiamf để tổng hợp âm thanh.
      • Tính năng phát được bật bằng bố cục âm thanh nổi cũng như 5.1 với tính năng tạo không gian cùng với tính năng theo dõi chuyển động của đầu (không bắt buộc), nhưng hiện không hỗ trợ tính năng phát âm thanh hai tai.
    • Thêm tính năng hỗ trợ trang 16 KB cho các tiện ích bộ giải mã trên Android 15 (#1685).
  • Tiện ích truyền:
    • Ngừng dọn dẹp dòng thời gian sau khi CastSession ngắt kết nối, cho phép ứng dụng gửi tiếp tục phát nội dung cục bộ sau khi ngắt kết nối.
    • Điền DeviceInfo của CastPlayer khi cung cấp Context. Thao tác này cho phép liên kết MediaSession với RoutingSession, điều này là cần thiết để tích hợp Trình chuyển đổi đầu ra (#1056).
  • Tiện ích kiểm thử:
    • DataSourceContractTest hiện bao gồm các kiểm thử để xác minh:
      • Luồng đầu vào read position được cập nhật.
      • Áp dụng đúng bộ đệm đầu ra offset.
  • Ứng dụng minh hoạ
    • Giải quyết sự cố rò rỉ bộ nhớ trong ứng dụng dạng ngắn minh hoạ (#1839).
  • Xoá các biểu tượng không dùng nữa:
    • Xoá Player.hasPrevious, Player.hasPreviousWindow() không dùng nữa. Thay vào đó, hãy sử dụng Player.hasPreviousMediaItem().
    • Xoá phương thức Player.previous() không dùng nữa. Sử dụng Player.seekToPreviousMediaItem().
    • Xoá phương thức DrmSessionEventListener.onDrmSessionAcquired không dùng nữa.
    • Xoá các hàm khởi tạo DefaultEncoderFactory không dùng nữa. Sử dụng DefaultEncoderFactory.Builder.

Phiên bản 1.5.0-rc02

Ngày 19 tháng 11 năm 2024

Sử dụng phiên bản ổn định 1.5.0.

Phiên bản 1.5.0-rc01

Ngày 13 tháng 11 năm 2024

Sử dụng phiên bản ổn định 1.5.0.

Phiên bản 1.5.0-beta01

Ngày 30 tháng 10 năm 2024

Sử dụng phiên bản ổn định 1.5.0.

Phiên bản 1.5.0-alpha01

Ngày 10 tháng 9 năm 2024

Sử dụng phiên bản ổn định 1.5.0.

Phiên bản 1.4.0

Phiên bản 1.4.1

Ngày 27 tháng 8 năm 2024

Phát hành androidx.media3:media3-*:1.4.1. Phiên bản 1.4.1 bao gồm các thay đổi sau.

  • ExoPlayer:
    • Xử lý lệnh gọi lại tải trước không đồng bộ trong PreloadMediaSource (#1568).
    • Cho phép phát bất kể thời lượng được lưu vào bộ đệm khi không tải được (#1571).
  • Công cụ trích xuất:
    • MP3: Khắc phục lỗi Searched too many bytes bằng cách bỏ qua chính xác dữ liệu không phải MP3 ở cuối dựa trên trường độ dài trong khung Info (#1480).
  • Văn bản:
    • TTML: Khắc phục việc xử lý các giá trị tts:fontSize theo tỷ lệ phần trăm để đảm bảo rằng các giá trị này được kế thừa chính xác từ các nút mẹ có giá trị tts:fontSize theo tỷ lệ phần trăm.
    • Khắc phục IndexOutOfBoundsException trong LegacySubtitleUtil do xử lý không chính xác trường hợp thời gian bắt đầu đầu ra được yêu cầu lớn hơn hoặc bằng thời gian sự kiện cuối cùng trong Subtitle (#1516).
  • DRM (Quản lý bản quyền nội dung số):
    • Khắc phục lỗi android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE trên các thiết bị API 31 trở lên phát nội dung L1 Widevine. Lỗi này xảy ra do việc triển khai chưa hoàn chỉnh phương thức khung MediaDrm.requiresSecureDecoder (#1603).
  • Hiệu ứng:
    • Thêm phương thức release() vào GlObjectsProvider.
  • Phiên:
    • Chuyển đổi thao tác nhấn đúp vào KEYCODE_HEADSETHOOK thành thao tác "chuyển đến tiếp theo", như đã ghi nhận (#1493).
    • Xử lý KEYCODE_HEADSETHOOK dưới dạng lệnh "phát" trong MediaButtonReceiver khi quyết định có bỏ qua lệnh này để tránh ForegroundServiceDidNotStartInTimeException hay không (#1581).
  • Tiện ích RTSP:
    • Bỏ qua Nội dung mô tả nội dung nghe nhìn không hợp lệ trong quá trình phân tích cú pháp SDP (#1087).

Phiên bản 1.4.0

Ngày 25 tháng 7 năm 2024

Phát hành androidx.media3:media3-*:1.4.0. Phiên bản 1.4.0 bao gồm các thay đổi sau.

  • Thư viện chung:
    • Chuyển tiếp các lệnh gọi tìm kiếm không hoạt động giả định đến các phương thức BasePlayer.seekTo()SimpleBasePlayer.handleSeek() được bảo vệ thay vì bỏ qua các lệnh gọi đó. Nếu đang triển khai các phương thức này trong một trình phát tuỳ chỉnh, bạn có thể cần xử lý các lệnh gọi bổ sung này bằng mediaItemIndex == C.INDEX_UNSET.
    • Xoá phần phụ thuộc biên dịch trên tính năng đơn giản hoá Java 8 nâng cao (#1312).
    • Đảm bảo thời lượng được truyền đến MediaItem.Builder.setImageDurationMs() sẽ bị bỏ qua đối với MediaItem không phải hình ảnh (như đã ghi nhận).
    • Thêm Format.customData để lưu trữ thông tin tuỳ chỉnh do ứng dụng cung cấp về các thực thể Format.
  • ExoPlayer:
    • Thêm BasePreloadManager để điều phối quá trình tải trước cho nhiều nguồn dựa trên các mức độ ưu tiên do rankingData xác định. Bạn có thể tuỳ chỉnh bằng cách mở rộng lớp này. Thêm DefaultPreloadManager sử dụng PreloadMediaSource để tải trước các mẫu nội dung nghe nhìn của các nguồn vào bộ nhớ và sử dụng số nguyên rankingData cho biết chỉ mục của một mục trên giao diện người dùng.
    • Thêm PlayerId vào hầu hết các phương thức của LoadControl để cho phép triển khai LoadControl hỗ trợ nhiều người chơi.
    • Xóa Buffer.isDecodeOnly()C.BUFFER_FLAG_DECODE_ONLY. Bạn không cần đặt cờ này vì trình kết xuất và bộ giải mã sẽ quyết định bỏ qua vùng đệm dựa trên dấu thời gian. Việc triển khai Renderer tuỳ chỉnh phải kiểm tra xem thời gian đệm có ít nhất là BaseRenderer.getLastResetPositionUs() hay không để quyết định xem có hiển thị mẫu hay không. Các hoạt động triển khai SimpleDecoder tuỳ chỉnh có thể kiểm tra isAtLeastOutputStartTimeUs() nếu cần hoặc đánh dấu các vùng đệm khác bằng DecoderOutputBuffer.shouldBeSkipped để bỏ qua các vùng đệm đó.
    • Cho phép TargetPreloadStatusControl.getTargetPreloadStatus(T) trả về giá trị rỗng để cho biết không tải trước MediaSource bằng rankingData đã cho.
    • Thêm remove(MediaSource) vào BasePreloadManager.
    • Thêm reset() vào BasePreloadManager để giải phóng tất cả các nguồn đang giữ trong khi vẫn giữ lại thực thể trình quản lý tải trước.
    • Thêm ExoPlayer.setPriority() (và Builder.setPriority()) để xác định giá trị mức độ ưu tiên được sử dụng trong PriorityTaskManager và mức độ quan trọng của MediaCodec từ API 35.
    • Khắc phục vấn đề cập nhật thời gian lưu vào bộ đệm gần đây nhất, dẫn đến khoá bs (bộ đệm bị thiếu) không chính xác trong CMCD (#1124).
    • Thêm PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) để cho biết nguồn đã tải xong. Điều này cho phép các phương thức triển khai DefaultPreloadManagerPreloadMediaSource.PreloadControl tuỳ chỉnh tải trước nguồn tiếp theo hoặc thực hiện các thao tác khác.
    • Khắc phục lỗi khi tính năng bỏ qua khoảng lặng ở cuối các mục có thể kích hoạt ngoại lệ phát.
    • Thêm clear vào PreloadMediaSource để loại bỏ khoảng thời gian tải trước.
    • Thêm mã lỗi mới PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED được dùng khi các tài nguyên bộ mã hoá và giải mã được thu hồi cho các tác vụ có mức độ ưu tiên cao hơn.
    • Cho phép AdsMediaSource tải quảng cáo trước video trước khi quá trình chuẩn bị nội dung đa phương tiện ban đầu hoàn tất (#1358).
    • Khắc phục lỗi phát chuyển sang STATE_ENDED khi chuẩn bị lại sự kiện phát trực tiếp DASH nhiều giai đoạn sau khi giai đoạn ban đầu đã bị xoá khỏi tệp kê khai.
    • Đổi tên onTimelineRefreshed() thành onSourcePrepared()onPrepared() thành onTracksSelected() trong PreloadMediaSource.PreloadControl. Ngoài ra, hãy đổi tên IntDefs trong DefaultPreloadManager.Stage cho phù hợp.
    • Thêm tính năng hỗ trợ thử nghiệm cho tính năng lập lịch biểu động để điều chỉnh công việc phù hợp hơn với chu kỳ đánh thức CPU và trì hoãn việc đánh thức cho đến khi trình kết xuất có thể tiến hành. Bạn có thể bật tính năng này bằng cách sử dụng experimentalSetDynamicSchedulingEnabled() khi thiết lập thực thể ExoPlayer.
    • Thêm Renderer.getDurationToProgressUs(). Renderer có thể triển khai phương thức này để trả về cho ExoPlayer thời lượng phát phải tiến lên để trình kết xuất tiến triển. Nếu ExoPlayer được đặt bằng experimentalSetDynamicSchedulingEnabled(), thì ExoPlayer sẽ gọi phương thức này khi tính toán thời gian để lên lịch công việc.
    • Thêm MediaCodecAdapter#OnBufferAvailableListener để cảnh báo khi MediaCodecRenderer có thể sử dụng vùng đệm đầu vào và đầu ra. MediaCodecRenderer sẽ báo hiệu ExoPlayer khi nhận được các lệnh gọi lại này và nếu ExoPlayer được đặt bằng experimentalSetDynamicSchedulingEnabled(), thì ExoPlayer sẽ lên lịch vòng lặp công việc của nó vì trình kết xuất có thể tiến hành.
    • Sử dụng lớp dữ liệu cho các phương thức LoadControl thay vì các tham số riêng lẻ.
    • Thêm ExoPlayer.isReleased() để kiểm tra xem Exoplayer.release() có được gọi hay không.
    • Thêm ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() để định cấu hình vị trí tối đa mà seekToPrevious() tìm đến mục trước đó (#1425).
    • Khắc phục một số điểm không nhất quán về quyền phát âm thanh, ví dụ: không báo cáo việc mất quyền phát âm thanh hoàn toàn hoặc tạm thời trong khi trình phát bị tạm dừng (#1436).
    • Khắc phục IndexOutOfBoundsException tiềm ẩn do trình trích xuất báo cáo các kênh bổ sung sau bước chuẩn bị ban đầu (#1476).
    • Effects trong ExoPlayer.setVideoEffect() sẽ nhận được dấu thời gian đã xoá độ lệch trình kết xuất (#1098).
    • Khắc phục IllegalArgumentException tiềm ẩn khi xử lý lỗi trình phát xảy ra trong khi đọc trước vào một mục danh sách phát khác (#1483).
  • Bộ chuyển đổi:
    • Thêm audioConversionProcessvideoConversionProcess vào ExportResult để cho biết cách tạo bản nhạc tương ứng trong tệp đầu ra.
    • Nới lỏng các bước kiểm tra cấp độ H.264 tối ưu hoá cắt.
    • Thêm tính năng hỗ trợ việc thay đổi giữa nội dung đa phương tiện đầu vào SDR và HDR theo trình tự.
    • Thêm tính năng hỗ trợ cho hiệu ứng âm thanh ở cấp thành phần.
    • Thêm tính năng hỗ trợ chuyển mã hình ảnh Ultra HDR thành video HDR.
    • Khắc phục vấn đề DefaultAudioMixer không xuất ra đúng số lượng byte sau khi được đặt lại và sử dụng lại.
    • Khắc phục lỗi bộ giải mã trong đó số lượng kênh âm thanh bị giới hạn ở âm thanh nổi khi xử lý đầu vào PCM.
    • Khi chọn các bản nhạc trong ExoPlayerAssetLoader, hãy bỏ qua các quy tắc ràng buộc về số lượng kênh âm thanh vì các quy tắc này chỉ áp dụng cho việc phát.
    • Thay thế giao diện androidx.media3.transformer.Muxer bằng androidx.media3.muxer.Muxer và xoá androidx.media3.transformer.Muxer.
    • Khắc phục lỗi tải hình ảnh HEIC từ lược đồ URI nội dung. (#1373).
    • Điều chỉnh thời lượng của bản âm thanh trong AudioGraphInput để cải thiện tính năng đồng bộ hoá âm thanh và hình ảnh.
    • Xoá trường ExportResult.processedInputs. Nếu bạn sử dụng trường này cho thông tin chi tiết về bộ mã hoá và giải mã, hãy sử dụng DefaultDecoderFactory.listener. Trong trường hợp ngoại lệ về bộ mã hoá và giải mã, thông tin chi tiết về bộ mã hoá và giải mã sẽ có trong ExportException.codecInfo.
  • Công cụ trích xuất:
    • MPEG-TS: Chuyển tiếp thay đổi để đảm bảo khung hình cuối cùng được kết xuất bằng cách truyền đơn vị truy cập cuối cùng của luồng vào hàng đợi mẫu (#7909). Tích hợp các bản sửa lỗi để giải quyết các vấn đề phát sinh trong luồng HLS chỉ có khung hình I(#1150) và luồng HLS H.262 (#1126).
    • MP3: Ưu tiên kích thước dữ liệu từ khung Info so với kích thước do luồng cơ bản báo cáo (ví dụ: kích thước tệp hoặc tiêu đề Content-Length HTTP). Điều này giúp loại trừ dữ liệu về đoạn giới thiệu không phát được (ví dụ: ảnh bìa đĩa nhạc) khỏi các phép tính tìm kiếm tốc độ bit không đổi, giúp tìm kiếm chính xác hơn (#1376).
    • MP3: Sử dụng số khung và dữ liệu khác trong khung Info (nếu có) để tính tốc độ bit trung bình cho tính năng tìm kiếm tốc độ bit không đổi, thay vì ngoại suy từ tốc độ bit của khung sau khung Info, có thể là tốc độ bit nhỏ một cách giả tạo, ví dụ: khung PCUT (#1376).
    • Khắc phục lỗi trích xuất định dạng âm thanh PCM trong vùng chứa AVI.
  • Âm thanh:
    • Sửa các thuộc tính mã hoá DTS:X Profile 2 để phát qua (#1299).
    • Đối với chế độ phát tải xuống, hãy đặt lại trường theo dõi để hoàn tất luồng trong DefaultAudioSink trước khi gọi AudioTrack.stop() để AudioTrack.StreamEventCallback#onPresentationEnded xác định chính xác thời điểm tất cả dữ liệu đang chờ xử lý đã được phát.
    • Khắc phục lỗi trong SilenceSkippingAudioProcessor, trong đó quá trình chuyển đổi giữa các định dạng âm thanh khác nhau (ví dụ: âm thanh nổi sang âm thanh đơn kênh) có thể khiến trình xử lý gửi một ngoại lệ (#1352).
    • Triển khai MediaCodecAudioRenderer.getDurationToProgressUs() để ExoPlayer sẽ tự động lên lịch lặp công việc chính của mình cho thời điểm MediaCodecAudioRenderer có thể tiến hành.
  • Video:
    • Khắc phục vấn đề Listener.onRenderedFirstFrame() đến quá sớm khi chuyển đổi nền tảng trong khi phát.
    • Sửa logic bộ giải mã dự phòng cho Dolby Vision để sử dụng bộ giải mã AV1 tương thích nếu cần (#1389).
    • Khắc phục ngoại lệ bộ mã hoá và giải mã có thể xảy ra do bật trình kết xuất video trong khi phát.
  • Văn bản:
    • Khắc phục vấn đề trong đó phụ đề bắt đầu trước vị trí tua bị bỏ qua. Vấn đề này chỉ xuất hiện trong Media3 1.4.0-alpha01.
    • Thay đổi hành vi phân tích cú pháp phụ đề mặc định để hành vi này diễn ra trong quá trình trích xuất thay vì trong quá trình kết xuất (xem sơ đồ cấu trúc của ExoPlayer để biết sự khác biệt giữa trích xuất và kết xuất).
      • Bạn có thể ghi đè thay đổi này bằng cách gọi cả MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)TextRenderer.experimentalSetLegacyDecodingEnabled(true). Hãy xem tài liệu về tuỳ chỉnh để biết cách kết nối các thành phần này vào một thực thể ExoPlayer. Các phương thức này (và tất cả tính năng hỗ trợ giải mã phụ đề cũ) sẽ bị xoá trong một bản phát hành sau này.
      • Các ứng dụng có cách triển khai SubtitleDecoder tuỳ chỉnh cần cập nhật để triển khai SubtitleParser (và SubtitleParser.Factory thay vì SubtitleDecoderFactory).
    • PGS: Khắc phục lỗi giải mã thời lượng chạy để phân giải 0 dưới dạng chỉ mục màu, thay vì giá trị màu cố định (#1367).
    • CEA-708: Bỏ qua giá trị rowLock. Thông số kỹ thuật CEA-708-E S-2023 nêu rõ rằng cả rowLockcolumnLock đều được giả định là đúng, bất kể giá trị nào có trong luồng (không triển khai tính năng hỗ trợ columnLock, vì vậy, giả định hiệu quả là luôn sai).
      • Nội dung này ban đầu có trong ghi chú phát hành 1.3.0-alpha01, nhưng thay đổi này đã vô tình bị huỷ trước khi phát hành 1.3.0-rc01. Lỗi này hiện đã được khắc phục, vì vậy, thay đổi đã xuất hiện trở lại.
    • CEA-708: Tránh các dòng mới trùng lặp được thêm vào do cách xử lý đơn giản của ExoPlayer đối với lệnh "set pen location" (đặt vị trí bút cảm ứng) (#1315).
    • Sửa IllegalArgumentException từ LegacySubtitleUtil khi mẫu phụ đề WebVTT không chứa tín hiệu, ví dụ: trong luồng DASH (#1516).
  • Siêu dữ liệu:
    • Khắc phục việc liên kết MP4 với thẻ sắp xếp ID3. Trước đây, các thẻ MP4 "sắp xếp theo album" (soal), "sắp xếp theo nghệ sĩ" (soar) và "sắp xếp theo nghệ sĩ của album" (soaa) đã được liên kết không chính xác với các thẻ ID3 TSO2, TSOATSOP (#1302).
    • Khắc phục lỗi đọc thẻ gnre (thể loại) và tmpo (tốc độ) số của tệp MP4 (/iTunes) khi giá trị dài hơn một byte.
    • Truyền khung TCON ID3 đến MediaMetadata.genre (#1305).
  • Hình ảnh:
    • Thêm tính năng hỗ trợ cho lưới hình thu nhỏ DASH không phải hình vuông (#1300).
    • Thêm tính năng hỗ trợ cho AVIF cho API 34 trở lên.
    • Cho phép null làm tham số cho ExoPlayer.setImageOutput() để xoá ImageOutput đã đặt trước đó.
  • DataSource:
    • Triển khai tính năng hỗ trợ cho URI tài nguyên thô android.resource://package/id trong đó package khác với gói của ứng dụng hiện tại. Trước đây, cách này không được ghi nhận là hoạt động, nhưng đây là cách hiệu quả hơn để truy cập vào tài nguyên trong một gói khác so với theo tên.
    • Kiểm tra nhanh url không rỗng trong hàm khởi tạo DataSpec. Thông số này đã được chú thích là không rỗng.
    • Cho phép ByteArrayDataSource phân giải URI thành một mảng byte trong quá trình open(), thay vì được mã hoá cứng khi tạo (#1405).
  • DRM (Quản lý bản quyền nội dung số):
    • Cho phép đặt LoadErrorHandlingPolicy trên DefaultDrmSessionManagerProvider (#1271).
  • Hiệu ứng:
    • Hỗ trợ nhiều thay đổi về tốc độ trong cùng một EditedMediaItem hoặc Composition trong SpeedChangeEffect.
    • Hỗ trợ đầu ra HLG và PQ từ đầu vào bitmap HDR cực cao.
    • Thêm tính năng hỗ trợ cho EGL_GL_COLORSPACE_BT2020_HLG_EXT, giúp cải thiện đầu ra bề mặt HLG trong ExoPlayer.setVideoEffect và Debug SurfaceView của Transformer.
    • Cập nhật cách triển khai ma trận Lớp phủ để nhất quán với tài liệu bằng cách lật các giá trị x và y được áp dụng trong setOverlayFrameAnchor(). Nếu sử dụng OverlaySettings.Builder.setOverlayFrameAnchor(), hãy lật các giá trị x và y bằng cách nhân các giá trị đó với -1.
    • Khắc phục lỗi TimestampWrapper gặp sự cố khi được sử dụng với ExoPlayer#setVideoEffects (#821).
    • Thay đổi không gian làm việc màu SDR mặc định từ màu tuyến tính sang video SDR BT 709 điện. Ngoài ra, hãy cung cấp tuỳ chọn thứ ba để giữ lại không gian màu ban đầu.
    • Cho phép xác định thứ tự z không xác định của EditedMediaItemSequences (#1055).
    • Duy trì phạm vi độ chói nhất quán trên nhiều phần nội dung HDR (sử dụng phạm vi HLG).
    • Thêm tính năng hỗ trợ lớp phủ Ultra HDR (bitmap) trên nội dung HDR.
    • Cho phép sử dụng hiệu ứng SeparableConvolution trước API 26.
    • Xoá OverlaySettings.useHdr không dùng đến vì dải động của lớp phủ và khung phải khớp nhau.
    • Thêm tính năng hỗ trợ HDR cho TextOverlay. Bạn có thể điều chỉnh độ sáng của lớp phủ văn bản bằng OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Tiện ích IMA:
    • Chuyển API cần thiết để ứng dụng phát luồng quảng cáo DAI sang phiên bản ổn định.
    • Thêm replaceAdTagParameters(Map <String, String>) vào ImaServerSideAdInsertionMediaSource.AdLoader để cho phép thay thế các tham số thẻ quảng cáo trong thời gian chạy.
    • Khắc phục lỗi VideoAdPlayer.VideoAdPlayerCallback.onError() không được gọi khi xảy ra lỗi trình phát trong khi phát quảng cáo (#1334).
    • Chuyển SDK IMA lên phiên bản 3.33.0 để khắc phục NullPointerException khi sử dụng URI thẻ quảng cáo data:// (#700).
  • Phiên:
    • Thay đổi giá trị mặc định của CommandButton.enabled thành true và đảm bảo giá trị này có thể vẫn là false đối với các tay điều khiển ngay cả khi có lệnh liên kết.
    • Thêm hằng số biểu tượng cho CommandButton mà bạn nên sử dụng thay vì tài nguyên biểu tượng tuỳ chỉnh.
    • Thêm MediaSessionService.isPlaybackOngoing() để cho phép ứng dụng truy vấn xem có cần dừng dịch vụ trong onTaskRemoved() hay không (#1219).
    • Thêm MediaSessionService.pauseAllPlayersAndStopSelf() để thuận tiện cho việc tạm dừng phát của tất cả các phiên và gọi stopSelf() để chấm dứt vòng đời của MediaSessionService.
    • Ghi đè MediaSessionService.onTaskRemoved(Intent) để cung cấp phương thức triển khai mặc định an toàn giúp dịch vụ chạy ở nền trước nếu đang phát hoặc dừng dịch vụ nếu không.
    • Ẩn thanh tua lại trong thông báo nội dung nghe nhìn cho sự kiện phát trực tiếp bằng cách không đặt thời lượng vào siêu dữ liệu phiên nền tảng (#1256).
    • Điều chỉnh lượt chuyển đổi MediaMetadata thành MediaDescriptionCompat để sử dụng cùng một thứ tự và logic ưu tiên khi chọn các thuộc tính siêu dữ liệu như trong media1.
    • Thêm MediaSession.sendError() cho phép gửi lỗi không nghiêm trọng đến trình điều khiển Media3. Khi sử dụng trình điều khiển thông báo (xem MediaSession.getMediaNotificationControllerInfo()), lỗi tuỳ chỉnh được dùng để cập nhật PlaybackState của phiên nền tảng thành trạng thái lỗi với thông tin lỗi đã cho (#543).
    • Thêm MediaSession.Callback.onPlayerInteractionFinished() để thông báo cho các phiên khi một loạt lượt tương tác của người chơi từ một tay điều khiển cụ thể kết thúc.
    • Thêm SessionError và sử dụng trong SessionResultLibraryResult thay vì mã lỗi để cung cấp thêm thông tin về lỗi và cách khắc phục lỗi nếu có thể.
    • Phát hành mã cho ứng dụng kiểm thử trình điều khiển media3 có thể dùng để kiểm thử hoạt động tương tác với các ứng dụng phát hành phiên phát nội dung nghe nhìn.
    • Truyền các phần bổ sung được truyền đến MediaSession[Builder].setSessionExtras() của media3 đến PlaybackStateCompat.getExtras() của trình điều khiển media1.
    • Ánh xạ các lỗi nghiêm trọng và không nghiêm trọng đến và từ phiên nền tảng. PlaybackException được liên kết với trạng thái lỗi nghiêm trọng của PlaybackStateCompat. SessionError được gửi đến trình điều khiển thông báo đa phương tiện bằng MediaSession.sendError(ControllerInfo, SessionError) được liên kết với lỗi không nghiêm trọng trong PlaybackStateCompat, nghĩa là mã lỗi và thông báo được đặt nhưng trạng thái của phiên nền tảng vẫn khác với STATE_ERROR.
    • Cho phép đặt hoạt động phiên theo mỗi bộ điều khiển để ghi đè hoạt động phiên chung. Bạn có thể xác định hoạt động trong phiên cho trình điều khiển tại thời điểm kết nối bằng cách tạo ConnectionResult bằng AcceptedResultBuilder.setSessionActivivty(PendingIntent). Sau khi kết nối, bạn có thể cập nhật hoạt động trong phiên bằng MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Cải thiện việc sao chép lỗi của các lệnh gọi đến MediaLibrarySession.Callback. Giờ đây, bạn có thể định cấu hình tính năng sao chép lỗi bằng cách sử dụng MediaLibrarySession.Builder.setLibraryErrorReplicationMode() để chọn loại lỗi hoặc chọn không sao chép lỗi (tính năng này được bật theo mặc định).
  • Giao diện người dùng:
    • Thêm tính năng hỗ trợ hiển thị hình ảnh vào PlayerView khi kết nối với ExoPlayer (#1144).
    • Thêm tuỳ chỉnh cho nhiều biểu tượng trong PlayerControlView thông qua các thuộc tính xml để cho phép nhiều đối tượng có thể vẽ trên mỗi thực thể PlayerView, thay vì ghi đè toàn cục (#1200).
    • Khắc phục lỗi nền tảng khiến video bị kéo giãn/cắt bớt khi sử dụng SurfaceView bên trong AndroidView Compose trên API 34 (#1237).
  • Nội dung đã tải xuống:
    • Đảm bảo rằng DownloadHelper không rò rỉ các thực thể Renderer chưa phát hành, điều này cuối cùng có thể dẫn đến sự cố ứng dụng với IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Tiện ích Cronet:
    • Sửa SocketTimeoutException trong CronetDataSource. Trong một số phiên bản Cronet, yêu cầu do lệnh gọi lại cung cấp không phải lúc nào cũng giống nhau. Điều này dẫn đến lệnh gọi lại không hoàn tất và yêu cầu hết thời gian chờ (https://issuetracker.google.com/328442628).
  • Tiện ích HLS:
    • Khắc phục lỗi trong đó các mẫu EMSG đang chờ xử lý đang chờ một điểm ngắt đã được uỷ quyền trong HlsSampleStreamWrapper với độ dời không chính xác gây ra IndexOutOfBoundsException hoặc IllegalArgumentException (#1002).
    • Khắc phục lỗi danh sách phát không phải danh sách phát chính liên tục tải lại cho các luồng LL-HLS (#1240).
    • Khắc phục lỗi khi bật CMCD cho HLS với các phân đoạn khởi chạy dẫn đến Source ErrorIllegalArgumentException.
    • Khắc phục lỗi danh sách phát không phải danh sách phát chính không được làm mới trong quá trình phát trực tiếp (#1240).
    • Khắc phục lỗi khi bật CMCD cho luồng phát trực tiếp HLS gây ra ArrayIndexOutOfBoundsException (#1395).
  • Tiện ích DASH:
    • Khắc phục lỗi khi chuẩn bị lại một sự kiện phát trực tiếp nhiều giai đoạn có thể gửi một IndexOutOfBoundsException (#1329).
    • Thêm tính năng hỗ trợ cho URL giấy phép dashif:Laurl (#1345).
  • Tiện ích truyền:
    • Khắc phục lỗi chuyển đổi tên album của MediaQueueItem thành nghệ sĩ trong mục nội dung nghe nhìn Media3 (#1255).
  • Tiện ích kiểm thử:
    • Triển khai onInit()onRelease() trong FakeRenderer.
    • Thay đổi các phương thức TestPlayerRunHelper.runUntil()/playUntil() để không thành công khi xảy ra lỗi không nghiêm trọng (ví dụ: các lỗi được báo cáo cho AnalyticsListener.onVideoCodecError()). Sử dụng chuỗi phương thức TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() mới để tắt hành vi này.
  • Ứng dụng minh hoạ:
    • Sử dụng DefaultPreloadManager trong ứng dụng minh hoạ dạng ngắn.
    • Cho phép đặt chế độ lặp lại bằng các đối số Intent từ dòng lệnh (#1266).
    • Sử dụng HttpEngineDataSource làm HttpDataSource khi thiết bị hỗ trợ.
  • Xoá các biểu tượng không dùng nữa:
    • Xoá CronetDataSourceFactory. Thay vào đó, hãy sử dụng CronetDataSource.Factory.
    • Xoá một số hàm khởi tạo DataSpec. Thay vào đó, hãy sử dụng DataSpec.Builder.
    • Xoá phương thức setContentTypePredicate(Predicate) khỏi DefaultHttpDataSource, OkHttpDataSourceCronetDataSource. Thay vào đó, hãy sử dụng phương thức tương đương trên mỗi XXXDataSource.Factory.
    • Xoá các hàm khởi tạo OkHttpDataSourceOkHttpDataSourceFactory. Thay vào đó, hãy sử dụng OkHttpDataSource.Factory.
    • Xoá PlayerMessage.setHandler(Handler). Thay vào đó, hãy sử dụng setLooper(Looper).
    • Xoá trường Timeline.Window.isLive. Thay vào đó, hãy sử dụng phương thức isLive().
    • Xoá các hàm khởi tạo DefaultHttpDataSource. Sử dụng DefaultHttpDataSource.Factory.
    • Xoá DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Sử dụng DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Xoá MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Thay vào đó, hãy sử dụng MediaCodecInfo.canReuseCodec(Format, Format).
    • Xoá phương thức DrmSessionManager.DUMMYgetDummyDrmSessionManager(). Thay vào đó, hãy sử dụng DrmSessionManager.DRM_UNSUPPORTED.
    • Xoá AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Thay vào đó, hãy sử dụng các phương thức nạp chồng lấy DecoderReuseEvaluation.
    • Xoá RendererSupport.FormatSupport IntDef và các hằng số FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE. Thay vào đó, hãy sử dụng IntDef và hằng số tương đương trong androidx.media3.common.C (ví dụ: C.FORMAT_HANDLED).
    • Xoá giao diện Bundleable. Điều này bao gồm việc xoá tất cả các trường hằng số Bundleable.Creator<Foo> CREATOR. Thay vào đó, phương thức gọi nên sử dụng các phương thức Bundle toBundle()static Foo fromBundle(Bundle) trên từng loại.

Phiên bản 1.4.0-rc01

Ngày 10 tháng 7 năm 2024

Sử dụng phiên bản ổn định 1.4.0.

Phiên bản 1.4.0-beta01

Ngày 26 tháng 6 năm 2024

Sử dụng phiên bản ổn định 1.4.0.

Phiên bản 1.4.0-alpha02

Ngày 7 tháng 6 năm 2024

Sử dụng phiên bản ổn định 1.4.0.

Phiên bản 1.4.0-alpha01

Ngày 17 tháng 4 năm 2024

Sử dụng phiên bản ổn định 1.4.0.

Phiên bản 1.3.0

Phiên bản 1.3.1

Ngày 11 tháng 4 năm 2024

Phát hành androidx.media3:media3-*:1.3.1. Phiên bản 1.3.1 bao gồm các thay đổi sau.

  • Thư viện chung:
    • Thêm Format.labels để cho phép các nhãn thay thế khác hoặc đã được bản địa hoá.
  • ExoPlayer:
    • Khắc phục vấn đề PreloadMediaPeriod không thể giữ lại các luồng khi tải trước lại.
    • Áp dụng TrackSelectionResult tương ứng chính xác cho khoảng thời gian phát trong quá trình chọn lại bản nhạc.
    • Chỉ bắt đầu trình kết xuất được bật sớm sau khi chuyển sang giai đoạn phát khi chuyển đổi giữa các mục nội dung nghe nhìn (#1017).
    • Thêm loại dữ liệu trả về bị thiếu vào quy tắc -keepclasseswithmembers của proguard cho DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Bộ chuyển đổi:
    • Thêm giải pháp cho ngoại lệ được gửi do MediaMuxer không hỗ trợ dấu thời gian trình bày âm trước API 30.
  • Chọn bản nội dung:
    • DefaultTrackSelector: Ưu tiên các kênh video có tốc độ khung hình "hợp lý" (>=10 khung hình/giây) so với các kênh có tốc độ khung hình thấp hơn hoặc chưa được đặt. Điều này đảm bảo rằng trình phát sẽ chọn kênh video "thực" trong tệp MP4 được trích xuất từ ảnh động có thể chứa hai kênh HEVC, trong đó một kênh có độ phân giải cao hơn nhưng số lượng khung hình rất nhỏ (#1051).
  • Công cụ trích xuất:
    • Khắc phục lỗi không bỏ qua khoảng đệm khi đọc các đoạn có kích thước lẻ từ tệp WAV (#1117).
    • MP3: Điền Format.averageBitrate từ các khung siêu dữ liệu như XINGVBRI.
    • MPEG-TS: Huỷ bỏ thay đổi nhằm đảm bảo khung hình cuối cùng được kết xuất bằng cách truyền đơn vị truy cập cuối cùng của luồng vào hàng đợi mẫu (#7909). Điều này là do thay đổi này gây ra các vấn đề mới với luồng HLS chỉ có khung hình I (#1150) và luồng HLS H.262 (#1126).
  • Âm thanh:
    • Cho phép khôi phục trình kết xuất bằng cách tắt tính năng tải xuống nếu kênh âm thanh không khởi chạy được ở chế độ tải xuống.
  • Video:
    • Thêm giải pháp cho vấn đề thiết bị trên Galaxy Tab S7 FE, Chromecast với Google TV và Lenovo M10 FHD Plus khiến luồng H265 60 khung hình/giây bị đánh dấu là không được hỗ trợ
    • Thêm giải pháp đảm bảo khung đầu tiên luôn được kết xuất trong khi tạo đường hầm ngay cả khi thiết bị không tự động thực hiện việc này theo yêu cầu của API (#1169). (#966).
    • Khắc phục vấn đề xử lý thông tin màu HDR khiến bộ mã hoá và giải mã hoạt động không đúng cách và ngăn việc chuyển đổi định dạng thích ứng cho các bản video SDR (#1158).
  • Văn bản:
    • WebVTT: Ngăn các tín hiệu liên tiếp trực tiếp tạo ra các thực thể CuesWithTiming bổ sung giả mạo từ WebvttParser.parse (#1177).
  • DRM (Quản lý bản quyền nội dung số):
    • Giải quyết vấn đề NoSuchMethodError có thể được khung MediaDrm gửi thay vì ResourceBusyException hoặc NotProvisionedException trên một số thiết bị Android 14 (#1145).
  • Hiệu ứng:
    • Cải thiện khả năng ánh xạ tông màu PQ sang SDR bằng cách chuyển đổi không gian màu.
  • Phiên:
    • Khắc phục lỗi vị trí hiện tại quay lại khi tay điều khiển thay thế mục hiện tại (#951).
    • Khắc phục lỗi MediaMetadata chỉ có extras khác rỗng không được truyền giữa trình điều khiển nội dung nghe nhìn và phiên (#1176).
  • Giao diện người dùng:
    • Dự phòng để thêm tên ngôn ngữ của bản âm thanh nếu Locale không thể xác định tên hiển thị (#988).
  • Tiện ích DASH:
    • Điền tất cả phần tử Label từ tệp kê khai vào Format.labels (#1054).
  • Tiện ích RTSP:
    • Bỏ qua các giá trị thông tin phiên trống (thẻ i) trong quá trình phân tích cú pháp SDP (#1087).
  • Tiện ích bộ giải mã (FFmpeg, VP9, AV1, MIDI, v.v.):
    • Tắt tiện ích MIDI làm phần phụ thuộc cục bộ theo mặc định vì tiện ích này yêu cầu phải định cấu hình thêm kho lưu trữ Maven. Những người dùng cần mô-đun này từ một phần phụ thuộc cục bộ có thể bật lại mô-đun đó.

Phiên bản 1.3.0

Ngày 6 tháng 3 năm 2024

Phát hành androidx.media3:media3-*:1.3.0. Phiên bản 1.3.0 bao gồm các thay đổi sau.

  • Thư viện chung:
    • Triển khai tính năng hỗ trợ cho URI tài nguyên thô android.resource://package/[type/]name, trong đó package khác với gói của ứng dụng hiện tại. Điều này luôn được ghi nhận là hoạt động, nhưng cho đến nay vẫn chưa được triển khai đúng cách.
    • Chuẩn hoá các loại MIME do mã ứng dụng đặt hoặc đọc từ nội dung nghe nhìn thành toàn bộ chữ thường.
    • Xác định quảng cáo bằng MediaItem đầy đủ thay vì một Uri trong AdPlaybackState.
    • Tăng minSdk lên 19 (Android KitKat). Điều này phù hợp với tất cả thư viện AndroidX khác và là điều kiện bắt buộc để chúng ta nâng cấp lên các phiên bản mới nhất của phần phụ thuộc AndroidX.
    • Điền cả artworkUriartworkData vào MediaMetadata.Builder.populate(MediaMetadata) khi ít nhất một trong số đó khác rỗng (#964).
  • ExoPlayer:
    • Thêm PreloadMediaSourcePreloadMediaPeriod cho phép các ứng dụng tải trước nguồn nội dung đa phương tiện ở một vị trí bắt đầu cụ thể trước khi phát. PreloadMediaSource sẽ chuẩn bị nguồn nội dung đa phương tiện để nhận Timeline, chuẩn bị và lưu vào bộ nhớ đệm khoảng thời gian tại vị trí bắt đầu đã cho, chọn các bản nhạc và tải dữ liệu đa phương tiện cho khoảng thời gian đó. Các ứng dụng kiểm soát tiến trình tải trước bằng cách triển khai PreloadMediaSource.PreloadControl và đặt nguồn đã tải trước vào trình phát để phát.
    • Thêm ExoPlayer.setImageOutput cho phép ứng dụng đặt ImageRenderer.ImageOutput.
    • DefaultRenderersFactory hiện cung cấp ImageRenderer cho trình phát theo mặc định với ImageOutputImageDecoder.Factory.DEFAULT rỗng.
    • Phát sự kiện Player.Listener.onPositionDiscontinuity khi bỏ qua khoảng lặng (#765).
    • Thêm tính năng hỗ trợ thử nghiệm để phân tích cú pháp phụ đề trong quá trình trích xuất. Bạn có thể bật tính năng này bằng cách sử dụng MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Hỗ trợ các nguồn nội dung nghe nhìn thích ứng bằng PreloadMediaSource.
    • Triển khai HttpEngineDataSource, một HttpDataSource bằng API HttpEngine.
    • Ngăn việc tạo lớp con CompositeSequenceableLoader. Thành phần này trước đây đã được mở rộng nhưng chưa bao giờ được phân lớp con trong thư viện. Bạn có thể tuỳ chỉnh bằng cách gói một thực thể bằng mẫu trình trang trí và triển khai CompositeSequenceableLoaderFactory tuỳ chỉnh.
    • Khắc phục vấn đề khi lặp lại cùng một thời gian sẽ khiến siêu dữ liệu của mục này bị xoá (#1007).
    • Đổi tên các phương thức experimentalSetSubtitleParserFactory trên BundledChunkExtractor.FactoryDefaultHlsExtractorFactory thành setSubtitleParserFactory và không cho phép truyền null. Sử dụng các phương thức experimentalParseSubtitlesDuringExtraction(boolean) mới để kiểm soát hành vi phân tích cú pháp.
    • Thêm tính năng hỗ trợ tuỳ chỉnh SubtitleParser.Factory dùng trong quá trình trích xuất. Bạn có thể thực hiện việc này bằng MediaSource.Factory.setSubtitleParserFactory().
    • Thêm tiền tố nguồn vào tất cả các trường Format.id được tạo từ MergingMediaSource. Điều này giúp xác định nguồn nào đã tạo ra Format (#883).
    • Sửa biểu thức chính quy dùng để xác thực tên khoá Dữ liệu ứng dụng nội dung nghe nhìn phổ biến (CMCD) tuỳ chỉnh bằng cách sửa đổi biểu thức đó để chỉ kiểm tra dấu gạch nối (#1028).
    • Ngừng mã hoá kép các tham số truy vấn CMCD (#1075).
  • Bộ chuyển đổi:
    • Thêm tính năng hỗ trợ làm phẳng video chuyển động chậm H.265/HEVC SEF.
    • Tăng tốc độ chuyển mã, đặc biệt là đối với các nội dung chỉnh sửa "xoá video".
    • Thêm API để đảm bảo tệp đầu ra bắt đầu trên một khung video. Điều này có thể giúp kết quả của các thao tác cắt tương thích hơn với các hoạt động triển khai trình phát không hiển thị khung video đầu tiên cho đến khi có dấu thời gian trình bày (#829).
    • Thêm tính năng hỗ trợ để tối ưu hoá các thao tác cắt MP4 của một thành phần.
    • Thêm tính năng hỗ trợ để đảm bảo khung video có dấu thời gian đầu tiên trong tệp đầu ra. Khắc phục các tệp đầu ra bắt đầu bằng khung màu đen trên trình phát dựa trên iOS (#829).
  • Chọn bản nội dung:
    • Thêm DefaultTrackSelector.selectImageTrack để bật tính năng chọn kênh hình ảnh.
    • Thêm TrackSelectionParameters.isPrioritizeImageOverVideoEnabled để xác định xem có nên chọn một kênh hình ảnh hay không nếu có cả kênh hình ảnh và kênh video. Giá trị mặc định là false, nghĩa là ưu tiên chọn một kênh video.
  • Công cụ trích xuất:
    • Thêm tính năng phân tích cú pháp AV1C bổ sung vào trình trích xuất MP4 để truy xuất các giá trị ColorInfo.colorSpace, ColorInfo.colorTransferColorInfo.colorRange (#692).
    • MP3: Sử dụng tốc độ bit không đổi (CBR) để tìm các tệp có tiêu đề Info (tương đương với CBR của tiêu đề Xing). Trước đây, chúng ta đã sử dụng bảng tìm kiếm từ tiêu đề Info, nhưng điều này dẫn đến việc tìm kiếm kém chính xác hơn so với khi chúng ta bỏ qua bảng tìm kiếm và giả định tệp là CBR.
    • MPEG2-TS: Thêm tính năng hỗ trợ DTS, DTS-LBR và DTS:X Profile2 (#275).
    • Trích xuất các loại âm thanh từ nội dung mô tả TS và liên kết các loại đó với cờ vai trò, cho phép người dùng lựa chọn kênh âm thanh một cách thông minh hơn (#973).
  • Âm thanh:
    • Cải thiện thuật toán bỏ qua khoảng lặng bằng cách tăng âm lượng một cách mượt mà; giữ lại khoảng lặng tối thiểu và thời lượng khoảng lặng tự nhiên hơn (#7423).
    • Báo cáo khoảng lặng bị bỏ qua một cách xác định hơn (#1035).
  • Video:
    • Thay đổi hàm khởi tạo MediaCodecVideoRenderer lấy đối số VideoFrameProcessor.Factory và thay thế bằng hàm khởi tạo lấy đối số VideoSinkProvider. Các ứng dụng muốn chèn VideoFrameProcessor.Factory tuỳ chỉnh có thể tạo bản sao CompositingVideoSinkProvider sử dụng VideoFrameProcessor.Factory tuỳ chỉnh và truyền trình cung cấp bồn lưu trữ video đến MediaCodecVideoRenderer.
  • Văn bản:
    • Khắc phục lỗi chuyển đổi tuần tự của các tín hiệu bitmap để giải quyết lỗi Tried to marshall a Parcel that contained Binder objects khi sử dụng DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: Bỏ qua giá trị rowLock. Thông số kỹ thuật CEA-708-E S-2023 nêu rõ rằng cả rowLockcolumnLock đều được giả định là đúng, bất kể giá trị nào có trong luồng (không triển khai tính năng hỗ trợ columnLock, vì vậy, giả định hiệu quả là luôn sai).
  • Hình ảnh:
    • Thêm tính năng hỗ trợ cho hình thu nhỏ DASH. Hình ảnh lưới được cắt và các hình thu nhỏ riêng lẻ được cung cấp cho ImageOutput gần với thời gian trình bày.
  • DRM (Quản lý bản quyền nội dung số):
    • Theo mặc định, hãy phát ngay các mẫu "dẫn đầu rõ ràng" chưa mã hoá trong nội dung DRM, ngay cả khi các khoá cho các mẫu được mã hoá sau đó chưa sẵn sàng. Điều này có thể dẫn đến tình trạng bị treo giữa chừng khi phát nếu các khoá vẫn chưa sẵn sàng khi vị trí phát đạt đến các mẫu đã mã hoá (nhưng trước đó, quá trình phát sẽ không bắt đầu tại thời điểm này). Bạn có thể tắt hành vi này bằng MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey hoặc DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
  • Tiện ích IMA:
    • Khắc phục vấn đề không phát được quảng cáo DASH và HLS không có đuôi tệp thích hợp.
  • Phiên:
    • Tắt tính năng phát hiện thao tác nhấp đúp cho các ứng dụng TV (#962).
    • Khắc phục vấn đề MediaItem.RequestMetadata chỉ có các phần bổ sung khác rỗng không được truyền giữa trình điều khiển nội dung nghe nhìn và các phiên.
    • Thêm hàm khởi tạo vào MediaLibrarySession.Builder chỉ lấy Context thay vì MediaLibraryService.
  • Tiện ích HLS:
    • Giảm HlsMediaPeriod xuống chế độ hiển thị riêng tư theo gói. Không nên phụ thuộc trực tiếp vào loại này từ bên ngoài gói HLS.
    • Giải quyết việc tìm kiếm đến đầu phân đoạn hiệu quả hơn (#1031).
  • Tiện ích bộ giải mã (FFmpeg, VP9, AV1, MIDI, v.v.):
    • Bộ giải mã MIDI: Bỏ qua thông báo sự kiện SysEx (#710).
  • Tiện ích kiểm thử:
    • Không tạm dừng phát trong TestPlayerRunHelper.playUntilPosition. Quy trình kiểm thử giữ cho quá trình phát ở trạng thái phát, nhưng tạm ngưng tiến trình cho đến khi quy trình kiểm thử có thể thêm các câu nhận định và hành động khác.
  • Ứng dụng minh hoạ:
    • Thêm mô-đun minh hoạ dạng ngắn để minh hoạ cách sử dụng PreloadMediaSource với trường hợp sử dụng nội dung dạng ngắn.

Phiên bản 1.3.0-rc01

Ngày 22 tháng 2 năm 2024

Sử dụng phiên bản ổn định 1.3.0.

Phiên bản 1.3.0-beta01

Ngày 7 tháng 2 năm 2024

Sử dụng phiên bản ổn định 1.3.0.

Phiên bản 1.3.0-alpha01

Ngày 15 tháng 1 năm 2024

Sử dụng phiên bản ổn định 1.3.0.

Phiên bản 1.2.0

Phiên bản 1.2.1

Ngày 9 tháng 1 năm 2024

  • ExoPlayer:
    • Khắc phục vấn đề khi tìm kiếm thủ công bên ngoài phạm vi LiveConfiguration.min/maxOffset liên tục điều chỉnh độ dời trở lại min/maxOffset.
    • Khắc phục vấn đề bố cục kênh OPUS và VORBIS không chính xác đối với 3, 5, 6, 7 và 8 kênh (#8396).
    • Khắc phục vấn đề lựa chọn bản nhạc sau khi tua đến 0 trong sự kiện phát trực tiếp khiến sự kiện phát trực tiếp bắt đầu ở vị trí mặc định không chính xác (#9347).
    • Khắc phục vấn đề các thực thể mới của CmcdData.Factory nhận được giá trị âm cho bufferedDurationUs từ các nguồn khối, dẫn đến IllegalArgumentException (#888).
  • Bộ chuyển đổi:
    • Giải quyết vấn đề trình mã hoá sẽ gửi vào thời gian cấu hình do đặt tốc độ hoạt động cao.
  • Công cụ trích xuất:
    • Đánh dấu các kênh HEVC phụ (không phát được) trong ảnh động JPEG là ROLE_FLAG_ALTERNATE để ngăn các kênh này tự động được chọn phát do có độ phân giải cao hơn.
    • Khắc phục lỗi phát hiện khung hình chính không chính xác cho các luồng TS H264 (#864).
    • Khắc phục lỗi ước tính thời lượng của các luồng TS dài hơn 47721 giây (#855).
  • Âm thanh:
    • Khắc phục việc xử lý EOS cho SilenceSkippingAudioProcessor khi được gọi nhiều lần (#712).
  • Video:
    • Thêm giải pháp cho vấn đề thiết bị trên Galaxy Tab S7 FE, Chromecast có Google TV và Lenovo M10 FHD Plus khiến luồng AVC 60 khung hình/giây bị đánh dấu là không được hỗ trợ (#693).
  • Siêu dữ liệu:
    • Khắc phục lỗi MediaMetadata chỉ được điền từ các nhận xét Vorbis bằng các khoá viết hoa (#876).
    • Phát hiện OutOfMemoryError khi phân tích cú pháp các khung ID3 rất lớn, nghĩa là quá trình phát có thể tiếp tục mà không cần thông tin thẻ thay vì quá trình phát hoàn toàn không thành công.
  • DRM (Quản lý bản quyền nội dung số):
    • Mở rộng giải pháp cho URL giấy phép https://default.url ClearKey giả mạo lên API 33 trở lên (trước đây, giải pháp này chỉ áp dụng chính xác trên API 33) (#837).
    • Khắc phục ERROR_DRM_SESSION_NOT_OPENED khi chuyển từ nội dung đã mã hoá sang nội dung rõ ràng mà không có nền tảng nào được đính kèm vào trình phát. Lỗi này là do sử dụng không chính xác bộ giải mã bảo mật để phát nội dung rõ ràng.
  • Phiên:
    • Đặt các khoá và giá trị tuỳ chỉnh trong MediaMetadataCompat vào MediaMetadata.extrasMediaMetadata.extras vào MediaMetadataCompat (#756, #802).
    • Khắc phục lỗi truyền notifyChildrenChanged cho các tay điều khiển cũ (#644).
    • Khắc phục lỗi trong đó việc đặt thời gian âm cho bộ hẹn giờ setWhen bị tắt của thông báo gây ra sự cố trên một số thiết bị (#903).
    • Sửa IllegalStateException khi trình điều khiển thông báo nội dung đa phương tiện chưa hoàn tất việc kết nối khi yêu cầu cập nhật thông báo đầu tiên (#917).
  • Giao diện người dùng:
    • Khắc phục vấn đề nút tua đi và tua lại không hiển thị khi sử dụng với Material Design trong BottomSheetDialogFragment (#511).
    • Khắc phục vấn đề các số trong nút tua nhanh của PlayerControlView bị lệch hàng (#547).
  • Tiện ích DASH:
    • Phân tích cú pháp "f800" dưới dạng số lượng kênh là 5 cho Dolby trong tệp kê khai DASH (#688).
  • Tiện ích bộ giải mã (FFmpeg, VP9, AV1, MIDI, v.v.):
    • MIDI: Khắc phục vấn đề khi tua đi bỏ qua các sự kiện Thay đổi chương trình (#704).
    • Di chuyển sang FFmpeg 6.0 và cập nhật NDK được hỗ trợ lên r26b (#707, #867).
  • Tiện ích truyền:
    • Xoá sạch việc tạo Timeline để không làm ứng dụng gặp sự cố khi tải nội dung nghe nhìn không thành công trên thiết bị truyền (#708).

Phiên bản 1.2.0

Ngày 15 tháng 11 năm 2023

  • Thư viện chung:
    • Thêm tham số @Nullable Throwable vào các phương thức trong giao diện Log.Logger. Thông số message cho các phương thức này không còn chứa bất kỳ thông tin nào về Throwable được truyền đến các phương thức Log.{d,i,w,e}(), vì vậy, các phương thức triển khai sẽ cần thêm thông tin này theo cách thủ công nếu muốn (có thể sử dụng Logger.appendThrowableString(String, Throwable)).
    • Khắc phục vấn đề về khả năng tương thích với Kotlin, trong đó các tham số kiểu chung rỗng và các loại phần tử mảng rỗng không được phát hiện là rỗng. Ví dụ: tham số phương thức TrackSelectorResultSimpleDecoder (#6792).
    • Thay đổi giao diện người dùng và hành vi thông báo mặc định trong Util.shouldShowPlayButton để hiển thị nút "phát" trong khi quá trình phát bị tạm thời bị chặn (ví dụ: do mất tiêu điểm âm thanh tạm thời). Bạn có thể duy trì hành vi cũ bằng cách sử dụng PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) hoặc MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Nâng cấp androidx.annotation:annotation-experimental lên 1.3.1 để khắc phục lỗi https://issuetracker.google.com/251172715.
    • Di chuyển ExoPlayer.setAudioAttributes vào giao diện Player.
  • ExoPlayer:
    • Khắc phục các vấn đề về tính năng tua trong luồng AC4 do không xác định chính xác các mẫu chỉ giải mã (#11000).
    • Thêm tính năng chặn phát trên các thiết bị đầu ra âm thanh không phù hợp (ví dụ:喇loại tích hợp trên thiết bị Wear OS) khi tính năng này được bật thông qua ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Lý do chặn phát sẽ được cập nhật thành Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT nếu bạn cố gắng phát khi không có đầu ra âm thanh phù hợp hoặc nếu tất cả đầu ra phù hợp bị ngắt kết nối trong khi phát. Lý do chặn sẽ bị xoá khi bạn kết nối đầu ra phù hợp.
    • Thêm MediaSource.canUpdateMediaItemMediaSource.updateMediaItem để chấp nhận nội dung cập nhật MediaItem sau khi tạo thông qua Player.replaceMediaItem(s).
    • Cho phép cập nhật MediaItem cho tất cả các lớp MediaSource do thư viện cung cấp thông qua Player.replaceMediaItem(s) (#33, #9978).
    • Đổi tên MimeTypes.TEXT_EXOPLAYER_CUES thành MimeTypes.APPLICATION_MEDIA3_CUES.
    • Thêm PngExtractor để gửi và đọc toàn bộ tệp PNG vào TrackOutput dưới dạng một mẫu.
    • Cải thiện phương thức SequenceableLoader.continueLoading(long) trong giao diện SequenceableLoader thành SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo chứa các tham số bổ sung, bao gồm playbackSpeedlastRebufferRealtimeMs ngoài playbackPositionUs hiện có.
    • Cải thiện phương thức ChunkSource.getNextChunk(long, long, List, ChunkHolder) trong giao diện ChunkSource thành ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Thêm các trường bổ sung vào nhật ký Dữ liệu ứng dụng nội dung nghe nhìn phổ biến (CMCD): tình trạng thiếu bộ đệm (bs), thời hạn (dl), tốc độ phát (pr) và khởi động (su) (#8699).
    • Thêm độ sâu bit luma và chroma vào ColorInfo (#491).
    • Thêm các trường bổ sung vào nhật ký Dữ liệu ứng dụng nội dung nghe nhìn phổ biến (CMCD): yêu cầu đối tượng tiếp theo (nor) và yêu cầu phạm vi tiếp theo (nrr) (#8699).
    • Thêm chức năng truyền dữ liệu Dữ liệu ứng dụng nội dung nghe nhìn phổ biến (CMCD) bằng các tham số truy vấn (#553).
    • Sửa ConcurrentModificationException trong ExperimentalBandwidthMeter (#612).
    • Thêm tham số MediaPeriodId vào CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Hỗ trợ ClippingMediaSource (và các nguồn khác có độ dời thời gian của khoảng thời gian/khung thời gian) trong ConcatenatingMediaSource2 (#11226).
    • Thay đổi BaseRenderer.onStreamChanged() để cũng nhận được đối số MediaPeriodId.
  • Bộ chuyển đổi:
    • Phân tích cú pháp dữ liệu xoay EXIF cho dữ liệu đầu vào hình ảnh.
    • Xoá loại chú giải TransformationRequest.HdrMode và các hằng số liên kết với loại chú giải này. Thay vào đó, hãy sử dụng Composition.HdrMode và các hằng số liên quan.
    • Đơn giản hoá OverlaySettings để khắc phục các vấn đề về độ xoay.
    • Thay đổi tham số frameRatedurationUs của SampleConsumer.queueInputBitmap thành TimestampIterator.
  • Chọn bản nội dung:
    • Thêm DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness để cho phép hoặc không cho phép rõ ràng việc điều chỉnh không liền mạch. Hành vi mặc định vẫn giữ nguyên hành vi hiện tại là true.
  • Công cụ trích xuất:
    • MPEG-TS: Đảm bảo khung hình cuối cùng được kết xuất bằng cách truyền đơn vị truy cập cuối cùng của luồng vào hàng đợi mẫu (#7909).
    • Sửa lỗi chính tả khi xác định rotationDegrees. Thay đổi projectionPosePitch thành projectionPoseRoll (#461).
    • Xoá giả định rằng các thực thể Extractor có thể được kiểm tra trực tiếp bằng instanceof. Nếu muốn có quyền truy cập thời gian chạy vào thông tin chi tiết về việc triển khai Extractor, trước tiên, bạn phải gọi Extractor.getUnderlyingInstance.
    • Thêm BmpExtractor.
    • Thêm WebpExtractor.
    • Thêm HeifExtractor.
    • Thêm tính năng hỗ trợ QuickTime classic vào Mp4Extractor.
  • Âm thanh:
    • Thêm tính năng hỗ trợ PCM big-endian 24/32 bit trong MP4 và Matroska, đồng thời phân tích cú pháp mã hoá PCM cho lpcm trong MP4.
    • Thêm tính năng hỗ trợ trích xuất âm thanh Vorbis trong MP4.
    • Thêm AudioSink.getFormatOffloadSupport(Format) để truy xuất cấp độ hỗ trợ giảm tải mà bồn lưu trữ có thể cung cấp cho định dạng thông qua DefaultAudioOffloadSupportProvider. Phương thức này trả về AudioOffloadSupport mới chứa isFormatSupported, isGaplessSupportedisSpeedChangeSupported.
    • Thêm AudioSink.setOffloadMode() để định cấu hình cấu hình giảm tải trên bồn lưu trữ âm thanh. Giá trị mặc định là AudioSink.OFFLOAD_MODE_DISABLED.
    • Bạn có thể bật tính năng giảm tải thông qua setAudioOffloadPreference trong TrackSelectionParameters. Nếu bạn đặt tuỳ chọn ưu tiên là bật, thì thiết bị sẽ hỗ trợ tính năng chuyển sang bộ nhớ ngoài cho định dạng đó và lựa chọn kênh là một kênh âm thanh duy nhất, thì tính năng chuyển sang bộ nhớ ngoài cho âm thanh sẽ được bật.
    • Nếu bạn đặt audioOffloadModePreference thành AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, thì DefaultTrackSelector sẽ chỉ chọn một bản âm thanh và chỉ khi định dạng của bản âm thanh đó được hỗ trợ trong quá trình tải xuống. Nếu không có bản âm thanh nào được hỗ trợ trong quá trình giảm tải, thì sẽ không có bản âm thanh nào được chọn.
    • Tắt tính năng hỗ trợ phát không gián đoạn để giảm tải khi ở cấp độ API trước 33 do vấn đề về vị trí phát sau khi chuyển đổi bản nhạc.
    • Xoá tham số enableOffload khỏi chữ ký phương thức DefaultRenderersFactory.buildAudioSink.
    • Xoá phương thức DefaultAudioSink.Builder.setOffloadMode.
    • Xoá giá trị intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Thêm tính năng hỗ trợ siêu dữ liệu Opus không có khoảng trống trong khi phát nội dung tải xuống.
    • Cho phép khôi phục trình kết xuất bằng cách tắt tính năng giảm tải nếu không thành công ở lần ghi đầu tiên (#627).
    • Bật tính năng Lên lịch tải xuống theo mặc định để phát nội dung chỉ âm thanh đã tải xuống.
    • Xoá ExoPlayer.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Đổi tên onExperimentalSleepingForOffloadChanged thành onSleepingForOffloadChangedonExperimentalOffloadedPlayback thành onOffloadedPlayback.
    • Di chuyển các giao diện và định nghĩa TrackSelectionParameters liên quan đến chế độ giảm tải âm thanh sang một lớp AudioOffloadPreferences bên trong.
    • Thêm lệnh gọi lại onAudioTrackInitializedonAudioTrackReleased vào AnalyticsListener, AudioRendererEventListenerAudioSink.Listener.
    • Khắc phục vấn đề thiếu dữ liệu trong vùng đệm âm thanh DTS Express (#650).
    • Khắc phục lỗi kiểm tra chức năng của E-AC3-JOC sẽ gửi một IllegalArgumentException (#677).
  • Video:
    • Cho phép MediaCodecVideoRenderer sử dụng một VideoFrameProcessor.Factory tuỳ chỉnh.
    • Khắc phục lỗi không thể kết xuất khung hình đầu tiên nếu luồng âm thanh bắt đầu bằng dấu thời gian âm (#291).
  • Văn bản:
    • Xoá ExoplayerCuesDecoder. Các kênh văn bản có sampleMimeType = application/x-media3-cues hiện được TextRenderer xử lý trực tiếp mà không cần thực thể SubtitleDecoder.
  • Siêu dữ liệu:
    • MetadataDecoder.decode sẽ không còn được gọi cho các mẫu "chỉ giải mã" vì việc triển khai phải trả về giá trị rỗng.
  • Hiệu ứng:
    • Thêm VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) để đưa đầu vào bitmap vào hàng đợi theo dấu thời gian.
    • Thay đổi VideoFrameProcessor.registerInputStream() thành không chặn. Ứng dụng phải triển khai VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Thay đổi tham số frameRatedurationUs của VideoFrameProcessor.queueInputBitmap thành TimestampIterator.
  • Tiện ích IMA:
    • Khắc phục lỗi trong đó luồng phát trực tiếp DASH nhiều giai đoạn không phải là mục đầu tiên trong danh sách phát có thể gửi một ngoại lệ (#571).
    • Giải phóng StreamManager trước khi gọi AdsLoader.destroy()
    • Chuyển SDK IMA lên phiên bản 3.31.0.
  • Phiên:
    • Đặt hành vi của dịch vụ trên nền trước của thông báo thành FOREGROUND_SERVICE_IMMEDIATE trong DefaultMediaNotificationProvider (#167).
    • Chỉ sử dụng android.media.session.MediaSession.setMediaButtonBroadcastReceiver() trên API 31 để tránh các vấn đề với API không dùng nữa trên thiết bị Samsung (#167).
    • Sử dụng trình điều khiển thông báo đa phương tiện làm proxy để đặt các lệnh có sẵn và bố cục tuỳ chỉnh dùng để điền thông báo và phiên nền tảng.
    • Chuyển đổi các sự kiện nút nội dung nghe nhìn mà MediaSessionService.onStartCommand() nhận được trong Media3 thay vì định tuyến các sự kiện đó đến phiên nền tảng và quay lại Media3. Với điều này, trình điều khiển lệnh gọi luôn là trình điều khiển thông báo đa phương tiện và các ứng dụng có thể dễ dàng nhận ra các lệnh gọi đến từ thông báo theo cách tương tự trên tất cả các cấp độ API được hỗ trợ.
    • Khắc phục lỗi MediaController.getCurrentPosition() không tiến triển khi kết nối với MediaSessionCompat cũ.
    • Thêm MediaLibrarySession.getSubscribedControllers(mediaId) để thuận tiện.
    • Ghi đè MediaLibrarySession.Callback.onSubscribe() để xác nhận rằng có mã nhận dạng gốc mà trình điều khiển đăng ký. Nếu thành công, gói thuê bao sẽ được chấp nhận và notifyChildrenChanged() sẽ được gọi ngay lập tức để thông báo cho trình duyệt (#561).
    • Thêm mô-đun minh hoạ phiên cho Automotive OS và bật minh hoạ phiên cho Android Auto.
    • Không đặt hàng đợi của phiên khung khi không có COMMAND_GET_TIMELINE cho trình điều khiển thông báo nội dung nghe nhìn. Với Android Auto làm trình điều khiển ứng dụng đọc từ phiên khung, điều này sẽ khiến nút queue trong giao diện người dùng của Android Auto không hiển thị (#339).
    • Sử dụng DataSourceBitmapLoader theo mặc định thay vì SimpleBitmapLoader (#271, #327).
    • Thêm MediaSession.Callback.onMediaButtonEvent(Intent) cho phép ứng dụng ghi đè chế độ xử lý sự kiện nút nội dung đa phương tiện mặc định.
  • Giao diện người dùng:
    • Thêm cách triển khai Player.Listener cho các thiết bị Wear OS xử lý việc chặn phát do Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT bằng cách chạy hộp thoại hệ thống để cho phép người dùng kết nối đầu ra âm thanh phù hợp (ví dụ: tai nghe Bluetooth). Trình nghe sẽ tự động tiếp tục phát nếu một thiết bị phù hợp được kết nối trong khoảng thời gian chờ có thể định cấu hình (mặc định là 5 phút).
  • Nội dung đã tải xuống:
    • Khai báo loại dịch vụ trên nền trước "đồng bộ hoá dữ liệu" cho DownloadService để có khả năng tương thích với Android 14. Khi sử dụng dịch vụ này, ứng dụng cũng cần thêm dataSync dưới dạng foregroundServiceType trong tệp kê khai và thêm quyền FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Tiện ích HLS:
    • Làm mới danh sách phát sự kiện phát trực tiếp HLS bằng khoảng thời gian được tính từ thời gian bắt đầu tải gần đây nhất thay vì thời gian tải xong gần đây nhất (#663).
  • Tiện ích DASH:
    • Cho phép nhiều giá trị nhận dạng DASH giống nhau trong URL mẫu phân đoạn.
    • Thêm tính năng hỗ trợ thử nghiệm để phân tích cú pháp phụ đề trong quá trình trích xuất. Tính năng này hỗ trợ tốt hơn việc hợp nhất các phụ đề trùng lặp, bao gồm cả việc giải quyết hiện tượng nhấp nháy khi chuyển đổi giữa các phân đoạn phụ đề. Bạn có thể bật tính năng này bằng cách sử dụng DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Tiện ích RTSP:
    • Khắc phục tình huống tương tranh có thể dẫn đến IndexOutOfBoundsException khi quay lại TCP hoặc phát bị treo trong một số trường hợp.
    • Kiểm tra trạng thái trong quá trình thiết lập RTSP khi trả về trạng thái tải của RtspMediaPeriod (#577).
    • Bỏ qua các phương thức yêu cầu Rtsp tuỳ chỉnh trong tiêu đề công khai của phản hồi Tuỳ chọn (#613).
    • Sử dụng giá trị thời gian chờ của Phản hồi thiết lập RTSP trong khoảng thời gian gửi yêu cầu Lựa chọn RTSP duy trì kết nối (#662).
  • Tiện ích bộ giải mã (FFmpeg, VP9, AV1, MIDI, v.v.):
    • Phát hành mô-đun bộ giải mã MIDI, mô-đun này hỗ trợ phát các tệp MIDI chuẩn bằng cách sử dụng thư viện Jsyn để tổng hợp âm thanh.
    • Thêm DecoderOutputBuffer.shouldBeSkipped để trực tiếp đánh dấu các vùng đệm đầu ra không cần hiển thị. Bạn nên sử dụng phương thức này thay vì C.BUFFER_FLAG_DECODE_ONLY sẽ không được dùng nữa.
    • Thêm Decoder.setOutputStartTimeUsSimpleDecoder.isAtLeastOutputStartTimeUs để cho phép bộ giải mã bỏ các mẫu chỉ giải mã trước thời gian bắt đầu. Bạn nên sử dụng phương thức này thay vì Buffer.isDecodeOnly sẽ không được dùng nữa.
    • Khắc phục lỗi phát hành cấu phần phần mềm bộ giải mã MIDI lên kho lưu trữ Maven. Cấu phần phần mềm được đổi tên thành media3-exoplayer-midi (#734).
  • Tiện ích Leanback:
    • Khắc phục lỗi khi tắt một nền tảng có thể gây ra ArithmeticException trong mã Leanback (#617).
  • Tiện ích kiểm thử:
    • Làm cho TestExoPlayerBuilderFakeClock tương thích với các kiểm thử giao diện người dùng Espresso và kiểm thử giao diện người dùng Compose. Điều này khắc phục lỗi phát không xác định trong quá trình tương tác với chế độ xem Espresso hoặc Compose.
  • Xoá các biểu tượng không dùng nữa:
    • Xoá TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Thay vào đó, hãy sử dụng Composition.Builder.setHdrMode(int) và truyền Composition đến Transformer.start(Composition, String).
    • Xoá phương thức DownloadNotificationHelper.buildProgressNotification không dùng nữa, thay vào đó, hãy sử dụng một phương thức không dùng nữa có tham số notMetRequirements.

Phiên bản 1.2.0-rc01

Ngày 1 tháng 11 năm 2023

Sử dụng phiên bản ổn định 1.2.0.

Phiên bản 1.2.0-beta01

Ngày 19 tháng 10 năm 2023

Sử dụng phiên bản ổn định 1.2.0.

Phiên bản 1.2.0-alpha02

Ngày 29 tháng 9 năm 2023

Sử dụng phiên bản ổn định 1.2.0.

Phiên bản 1.2.0-alpha01

Ngày 17 tháng 8 năm 2023

Sử dụng phiên bản ổn định 1.2.0.

Phiên bản 1.1.0

Phiên bản 1.1.1

Ngày 16 tháng 8 năm 2023

  • Thư viện chung:
    • Xoá phần phụ thuộc multidex đã thêm do nhầm lẫn khỏi tất cả mô-đun (#499).
  • ExoPlayer:
    • Khắc phục vấn đề trong PlaybackStatsListener, trong đó PlaybackStats giả mạo được tạo sau khi danh sách phát bị xoá.
    • Thêm các trường bổ sung vào tính năng ghi nhật ký Dữ liệu ứng dụng nội dung nghe nhìn phổ biến (CMCD): định dạng truyền trực tuyến (sf), loại luồng (st), phiên bản (v), tốc độ bit hàng đầu (tb), thời lượng đối tượng (d), tốc độ truyền đo được (mtp) và loại đối tượng (ot) (#8699).
  • Âm thanh:
    • Khắc phục lỗi Player.getState() không bao giờ chuyển đổi sang STATE_ENDED khi phát các tệp rất ngắn (#538).
  • Chuyển âm thanh sang thiết bị khác:
    • Đặt Tiêu đề mã Ogg và Trang tiêu đề nhận xét vào đầu luồng bit để phát Opus được tải xuống theo RFC 7845.
  • Video:
    • H.265/HEVC: Khắc phục lỗi phân tích cú pháp thông tin về ảnh tham chiếu ngắn hạn và dài hạn SPS.
  • Văn bản:
    • CEA-608: Thay đổi logic cắt bớt lời nhắc để chỉ xem xét văn bản hiển thị. Trước đây, khoảng thụt lề và độ dời thẻ đã được đưa vào khi giới hạn độ dài của tín hiệu ở mức 32 ký tự (đúng theo thông số kỹ thuật) (#11019).
  • Tiện ích IMA:
    • Chuyển SDK IMA lên phiên bản 3.30.3.
  • Phiên:
    • Thêm bố cục tuỳ chỉnh vào trạng thái của trình điều khiển và cung cấp phương thức getter để truy cập vào bố cục đó. Khi bố cục tuỳ chỉnh thay đổi, MediaController.Listener.onCustomLayoutChanged sẽ được gọi. Các ứng dụng muốn gửi nhiều bố cục tuỳ chỉnh đến nhiều bộ điều khiển Media3 có thể thực hiện việc này trong MediaSession.Callback.onConnect bằng cách sử dụng AcceptedResultBuilder để đảm bảo bộ điều khiển có bố cục tuỳ chỉnh khi kết nối hoàn tất.
    • Khắc phục các trường hợp MediaLibraryServiceLegacyStub gửi lỗi đến một Result không hỗ trợ lỗi này, tạo ra một UnsupportedOperationException (#78).
    • Sửa cách PlayerWrapper tạo VolumeProviderCompat bằng cách xác định volumeControlType thông qua cả các lệnh cũ (COMMAND_ADJUST_DEVICE_VOLUMECOMMAND_SET_DEVICE_VOLUME) và các lệnh mới (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGSCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Phiên bản 1.1.0

Ngày 5 tháng 7 năm 2023

  • Thư viện chung:
    • Thêm lý do chặn cho tuyến âm thanh không phù hợp và phát khi sẵn sàng thay đổi lý do chặn quá lâu. (#15).
    • Thêm lệnh vào Player:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Thêm các phương thức nạp chồng vào Player để cho phép người dùng chỉ định cờ âm lượng:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Thêm Builder cho DeviceInfo và ngừng sử dụng hàm khởi tạo hiện có.
    • Thêm DeviceInfo.routingControllerId để chỉ định mã nhận dạng tay điều khiển định tuyến cho các lần phát từ xa.
    • Thêm Player.replaceMediaItem(s) làm lối tắt để thêm và xoá các mục ở cùng một vị trí (#8046).
  • ExoPlayer:
    • Chỉ cho phép ExoPlayer kiểm soát các phương thức âm lượng của thiết bị nếu bạn chọn sử dụng một cách rõ ràng. Sử dụng ExoPlayer.Builder.setDeviceVolumeControlEnabled để có quyền truy cập vào:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int)setDeviceVolume(int, int)
      • increaseDeviceVolume(int)increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int)decreaseDeviceVolume(int, int)
    • Thêm FilteringMediaSource cho phép lọc các loại kênh hiện có từ MediaSource.
    • Thêm tính năng hỗ trợ để đưa Dữ liệu ứng dụng nội dung nghe nhìn phổ biến (CMCD) vào các yêu cầu gửi đi của các định dạng truyền phát thích ứng DASH, HLS và SmoothStreaming. Các trường sau đây, br, bl, cid, rtpsid, đã được tích hợp (#8699). Cấu trúc API và phương thức API:
      • Tính năng ghi nhật ký CMCD bị tắt theo mặc định, hãy sử dụng MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) để bật tính năng này.
      • Theo mặc định, tất cả các khoá đều được bật, ghi đè CmcdConfiguration.RequestConfig.isKeyAllowed(String key) để lọc ra những khoá nào được ghi lại.
      • Ghi đè CmcdConfiguration.RequestConfig.getCustomData() để bật tính năng ghi nhật ký phím tuỳ chỉnh.
    • Thêm thao tác bổ sung vào tệp kê khai của bản minh hoạ chính để dễ dàng khởi động ứng dụng minh hoạ bằng tệp *.exolist.json tuỳ chỉnh (#439).
    • Thêm ExoPlayer.setVideoEffects() để sử dụng Effect trong khi phát video.
    • Cập nhật SampleQueue để lưu trữ sourceId dưới dạng long thay vì int. Thao tác này sẽ thay đổi chữ ký của các phương thức công khai SampleQueue.sourceIdSampleQueue.peekSourceId.
    • Thêm các tham số vào phương thức LoadControl shouldStartPlaybackonTracksSelected cho phép liên kết các phương thức này với MediaPeriod có liên quan.
    • Thay đổi chữ ký của ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) bằng cách thêm một tham số dòng thời gian chứa các khoảng thời gian có UID được dùng làm khoá trong bản đồ. Điều này là cần thiết để tránh các vấn đề về tính đồng thời với sự kiện phát trực tiếp nhiều giai đoạn.
    • Ngừng sử dụng EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Bạn có thể gọi biến thể của các phương thức không có mediaTimeOffsetUs. Xin lưu ý rằng ngay cả đối với các biến thể không dùng nữa, độ dời sẽ không được thêm vào startTimeUsendTimeUs của các đối tượng MediaLoadData do trình điều phối gửi.
    • Đổi tên ExoTrackSelection.blacklist thành excludeTrackisBlacklisted thành isTrackExcluded.
    • Khắc phục hành vi không nhất quán giữa ExoPlayer.setMediaItem(s)addMediaItem(s) khi được gọi trên một danh sách phát trống.
  • Bộ chuyển đổi:
    • Xoá Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Thay vào đó, hãy sử dụng ExoPlayerAssetLoader.Factory(MediaSource.Factory)Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Xoá Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Khắc phục lỗi biến đổi có thể bị treo (dẫn đến hết thời gian chờ của trình kết hợp) nếu kết thúc luồng video được báo hiệu tại thời điểm khung đầu vào đang chờ xử lý.
    • Truy vấn bộ mã hoá và giải mã qua MediaCodecList thay vì sử dụng các tiện ích findDecoder/EncoderForFormat để mở rộng khả năng hỗ trợ.
    • Xoá cấu hình khung B trong DefaultEncoderFactory vì cấu hình này không hoạt động trên một số thiết bị.
  • Chọn bản nội dung:
    • Thêm DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange bị tắt theo mặc định. Khi được bật, DefaultTrackSelector sẽ kích hoạt lựa chọn kênh mới khi các tính năng của trình kết xuất thay đổi.
  • Công cụ trích xuất:
    • Ogg: Khắc phục lỗi khi tua trong các tệp có thời lượng dài (#391).
    • FMP4: Khắc phục vấn đề TimestampAdjuster khởi chạy độ lệch dấu thời gian không chính xác với thời gian lấy mẫu siêu dữ liệu từ nguyên tử emsg (#356).
  • Âm thanh:
    • Khắc phục lỗi một số lần phát không thành công khi bật tính năng tạo đường hầm và AudioProcessors đang hoạt động, ví dụ: để cắt không có khoảng trống (#10847).
    • Đóng gói các khung Opus trong gói Ogg trong các lượt phát trực tiếp (giảm tải).
    • Dự đoán vị trí hiện tại trong khi ngủ bằng tính năng lên lịch giảm tải.
    • Thêm Renderer.release()AudioSink.release() để giải phóng tài nguyên vào cuối vòng đời của người chơi.
    • Theo dõi các thay đổi về chức năng âm thanh trong DefaultAudioSink. Thêm tham số bắt buộc context trong hàm khởi tạo của DefaultAudioSink. DefaultAudioSink sẽ đăng ký làm trình nghe cho AudioCapabilitiesReceiver và cập nhật thuộc tính audioCapabilities khi được thông báo về thay đổi về chức năng.
    • Truyền tải các thay đổi về chức năng âm thanh thông qua một sự kiện mới onAudioCapabilitiesChanged trong giao diện AudioSink.Listener và một giao diện mới RendererCapabilities.Listener kích hoạt các sự kiện onRendererCapabilitiesChanged.
    • Thêm ChannelMixingAudioProcessor để áp dụng tính năng điều chỉnh theo tỷ lệ/kết hợp cho các kênh âm thanh.
    • Thêm giá trị int mới DISCARD_REASON_AUDIO_BYPASS_POSSIBLE vào DecoderDiscardReasons để loại bỏ bộ giải mã âm thanh khi có thể sử dụng chế độ bỏ qua sau khi các tính năng âm thanh thay đổi.
    • Thêm tính năng hỗ trợ phát trực tiếp cho DTS Express và DTS:X (#335).
  • Video:
    • Đặt MediaCodecVideoRenderer báo cáo VideoSize có chiều rộng và chiều cao là 0 khi trình kết xuất bị tắt. Player.Listener.onVideoSizeChanged được gọi tương ứng khi Player.getVideoSize() thay đổi. Với thay đổi này, kích thước video của ExoPlayer với MediaCodecVideoRenderer có chiều rộng và chiều cao là 0 khi Player.getCurrentTracks không hỗ trợ video hoặc kích thước của kênh video được hỗ trợ chưa được xác định.
  • DRM (Quản lý bản quyền nội dung số):
    • Giảm khả năng hiển thị của một số phương thức chỉ dành cho nội bộ trên DefaultDrmSession mà dự kiến sẽ không được gọi từ bên ngoài gói DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Trình kết hợp:
    • Thêm thư viện trình kết hợp mới có thể dùng để tạo tệp vùng chứa MP4.
  • Tiện ích IMA:
    • Bật luồng phát trực tiếp DASH nhiều giai đoạn cho DAI. Xin lưu ý rằng cách triển khai hiện tại chưa hỗ trợ tính năng tua trong sự kiện phát trực tiếp (#10912).
    • Khắc phục lỗi chèn nhóm quảng cáo mới vào các sự kiện phát trực tiếp do vị trí nội dung được tính toán trong các dòng thời gian liên tiếp thay đổi một chút.
  • Phiên:
    • Thêm phương thức trợ giúp MediaSession.getControllerForCurrentRequest để nhận thông tin về tay điều khiển hiện đang gọi phương thức Player.
    • Thêm androidx.media3.session.MediaButtonReceiver để cho phép ứng dụng triển khai tính năng tiếp tục phát bằng các sự kiện nút nội dung nghe nhìn do tai nghe Bluetooth gửi, ví dụ: (#167).
    • Thêm phương thức triển khai mặc định vào MediaSession.Callback.onAddMediaItems để cho phép chuyển MediaItems đã yêu cầu vào Player nếu các phương thức này có LocalConfiguration (ví dụ: URI) (#282).
    • Thêm các nút lệnh "tìm đến trước" và "tìm đến sau" trên chế độ xem thông báo nội dung nghe nhìn thu gọn theo mặc định cho Android 12 trở xuống (#410).
    • Thêm phương thức triển khai mặc định vào MediaSession.Callback.onAddMediaItems để cho phép chuyển MediaItems đã yêu cầu vào Player nếu các phương thức này có LocalConfiguration (ví dụ: URI) (#282).
    • Thêm các nút lệnh "tìm đến trước" và "tìm đến sau" trên chế độ xem thông báo nội dung nghe nhìn thu gọn theo mặc định cho Android 12 trở xuống (#410).
  • Giao diện người dùng:
    • Thêm các phương thức Util shouldShowPlayButtonhandlePlayPauseButtonAction để viết các thành phần giao diện người dùng tuỳ chỉnh bằng nút phát/tạm dừng.
  • Tiện ích RTSP:
    • Đối với MPEG4-LATM, hãy sử dụng giá trị profile-level-id mặc định nếu không có trong thông báo SDP Describe Response (#302).
    • Sử dụng Uri cơ sở để phân giải đường dẫn tương đối từ phiên RTSP nếu có trong tiêu đề phản hồi DESCRIBE (#11160).
  • Tiện ích DASH:
    • Xoá độ lệch thời gian nội dung nghe nhìn khỏi MediaLoadData.startTimeMsMediaLoadData.endTimeMs đối với các luồng DASH nhiều giai đoạn.
    • Khắc phục lỗi khi chuẩn bị lại nguồn nội dung đa phương tiện Dash trực tiếp nhiều giai đoạn tạo ra IndexOutOfBoundsException (#10838).
  • Tiện ích HLS:
    • Thêm HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) để đặt thời gian chờ cho luồng tải để chờ TimestampAdjuster khởi chạy. Nếu quá trình khởi chạy không hoàn tất trước khi hết thời gian chờ, thì PlaybackException sẽ được gửi để tránh tình trạng phát bị treo vô thời hạn. Theo mặc định, thời gian chờ được đặt thành 0 (#323).
  • Tiện ích kiểm thử:
    • Kiểm tra xem giao thức URI có phân biệt chữ hoa chữ thường trong DataSourceContractTest hay không.
  • Xoá các biểu tượng không dùng nữa:
    • Xoá các hàm khởi tạo DefaultAudioSink, sử dụng DefaultAudioSink.Builder.
    • Xoá HlsMasterPlaylist, thay vào đó hãy sử dụng HlsMultivariantPlaylist.
    • Xoá Player.stop(boolean). Thay vào đó, hãy sử dụng Player.stop()Player.clearMediaItems() (nếu resettrue).
    • Xoá hai hàm khởi tạo SimpleCache không còn được dùng nữa, sử dụng một hàm khởi tạo không bị ngừng hoạt động lấy DatabaseProvider để có hiệu suất tốt hơn.
    • Xoá hàm khởi tạo DefaultBandwidthMeter, sử dụng DefaultBandwidthMeter.Builder.
    • Xoá các hàm khởi tạo DefaultDrmSessionManager, sử dụng DefaultDrmSessionManager.Builder.
    • Xoá hai hàm khởi tạo HttpDataSource.InvalidResponseCodeException không dùng nữa, sử dụng một hàm khởi tạo không dùng nữa chấp nhận các trường bổ sung(cause, responseBody) để tăng cường tính năng ghi nhật ký lỗi.
    • Xoá DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDashDownloadHelper.forSmoothStreaming, thay vào đó, hãy sử dụng DownloadHelper.forMediaItem.
    • Xoá hàm khởi tạo DownloadService không dùng nữa, sử dụng một hàm khởi tạo không bị ngừng sử dụng có tuỳ chọn cung cấp tham số channelDescriptionResourceId.
    • Xoá các hằng số Chuỗi không dùng nữa cho Bộ ký tự (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAMEUTF16LE_NAME), thay vào đó, hãy sử dụng Bộ ký tự Kotlin từ gói kotlin.text, java.nio.charset.StandardCharsets hoặc com.google.common.base.Charsets.
    • Xoá hàm khởi tạo WorkManagerScheduler không dùng nữa, sử dụng một hàm khởi tạo không dùng nữa có tuỳ chọn cung cấp tham số Context.
    • Xoá các phương thức không dùng nữa createVideoSampleFormat, createAudioSampleFormat, createContainerFormatcreateSampleFormat dùng để tạo bản sao lớp Format. Thay vào đó, hãy sử dụng Format.Builder để tạo các thực thể của Format.
    • Xoá các phương thức không dùng nữa copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitratecopyWithVideoSize, thay vào đó, hãy sử dụng Format.buildUpon() và các phương thức setter.
    • Xoá ExoPlayer.retry() không dùng nữa, hãy sử dụng prepare().
    • Xoá hàm khởi tạo DefaultTrackSelector không có đối số đã ngừng hoạt động, thay vào đó hãy sử dụng DefaultTrackSelector(Context).
    • Xoá hàm khởi tạo OfflineLicenseHelper không dùng nữa, thay vào đó hãy sử dụng OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Xoá hàm khởi tạo DownloadManager không dùng nữa, thay vào đó, hãy sử dụng hàm khởi tạo nhận Executor.
    • Xoá các hàm khởi tạo Cue không dùng nữa, thay vào đó hãy sử dụng Cue.Builder.
    • Xoá hàm khởi tạo OfflineLicenseHelper không dùng nữa, thay vào đó hãy sử dụng OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Xoá 4 phương thức AnalyticsListener không dùng nữa:
      • onDecoderEnabled, hãy sử dụng onAudioEnabled và/hoặc onVideoEnabled.
      • onDecoderInitialized, hãy sử dụng onAudioDecoderInitialized và/hoặc onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, hãy sử dụng onAudioInputFormatChanged và/hoặc onVideoInputFormatChanged.
      • onDecoderDisabled, hãy sử dụng onAudioDisabled và/hoặc onVideoDisabled.
    • Xoá Player.Listener.onSeekProcessedAnalyticsListener.onSeekProcessed không dùng nữa, thay vào đó, hãy sử dụng onPositionDiscontinuity với DISCONTINUITY_REASON_SEEK.
    • Xoá ExoPlayer.setHandleWakeLock(boolean), thay vào đó hãy sử dụng setWakeMode(int).
    • Xoá DefaultLoadControl.Builder.createDefaultLoadControl() không dùng nữa, hãy sử dụng build().
    • Xoá MediaItem.PlaybackProperties không dùng nữa, hãy sử dụng MediaItem.LocalConfiguration. Trường không dùng nữa MediaItem.playbackProperties hiện thuộc loại MediaItem.LocalConfiguration.

Phiên bản 1.1.0-rc01

Ngày 21 tháng 6 năm 2023

Sử dụng phiên bản ổn định 1.1.0.

Phiên bản 1.1.0-beta01

Ngày 7 tháng 6 năm 2023

Sử dụng phiên bản ổn định 1.1.0.

Phiên bản 1.1.0-alpha01

Ngày 10 tháng 5 năm 2023

Sử dụng phiên bản ổn định 1.1.0.

Phiên bản 1.0.0

Phiên bản 1.0.2

Ngày 18 tháng 5 năm 2023

Phát hành androidx.media3:media3-*:1.0.2. Phiên bản 1.0.2 bao gồm các thay đổi sau.

Bản phát hành này tương ứng với phiên bản ExoPlayer 2.18.7.

Bản phát hành này có các thay đổi sau kể từ bản phát hành 1.0.1:

  • Thư viện Core:
    • Thêm Buffer.isLastSample() để biểu thị liệu Buffer có chứa cờ C.BUFFER_FLAG_LAST_SAMPLE hay không.
    • Khắc phục vấn đề khung hình cuối cùng có thể không được kết xuất nếu mẫu cuối cùng có khung hình bị xoá khỏi hàng đợi mà không đọc mẫu "kết thúc luồng". (#11079).
  • Công cụ trích xuất:
    • Khắc phục lỗi phân tích cú pháp SPS H.265 trong tệp MPEG-TS bằng cách sử dụng lại logic phân tích cú pháp mà trình trích xuất RTSP và MP4 đã sử dụng (#303).
  • Văn bản:
    • SSA: Thêm tính năng hỗ trợ cho các tệp UTF-16 nếu các tệp đó bắt đầu bằng dấu thứ tự byte (#319).
  • Phiên:
    • Khắc phục vấn đề MediaController không cập nhật các lệnh có sẵn khi kết nối với MediaSessionCompat cũ cập nhật các thao tác.
    • Khắc phục lỗi ngăn MediaLibraryService trả về giá trị rỗng cho lệnh gọi từ giao diện người dùng hệ thống đến Callback.onGetLibraryRoot bằng params.isRecent == true trên API 30 (#355).
    • Khắc phục sự cố rò rỉ bộ nhớ của MediaSessionService hoặc MediaLibraryService (#346).
    • Khắc phục lỗi trong đó việc cập nhật vị trí và Timeline kết hợp trong MediaSession có thể khiến MediaController gửi IllegalStateException.

Phiên bản 1.0.1

Ngày 18 tháng 4 năm 2023

Phát hành androidx.media3:media3-*:1.0.1. Phiên bản 1.0.1 bao gồm các thay đổi sau.

Bản phát hành này tương ứng với phiên bản ExoPlayer 2.18.6.

  • Thư viện Core:
    • Đặt lại chế độ ghi đè sự kiện phát trực tiếp mục tiêu khi tìm đến vị trí mặc định (#11051).
    • Khắc phục lỗi các luồng mẫu trống trong nội dung nghe nhìn có thể khiến quá trình phát bị treo.
  • Phiên:
    • Khắc phục lỗi trong đó nhiều mục hàng đợi giống hệt nhau do một MediaSessionCompat cũ phát hành dẫn đến một ngoại lệ trong MediaController (#290).
    • Thêm tính năng chuyển tiếp bị thiếu của MediaSession.broadcastCustomCommand vào MediaControllerCompat.Callback.onSessionEvent cũ (#293).
    • Khắc phục lỗi khi gọi MediaSession.setPlayer không cập nhật các lệnh có sẵn.
    • Khắc phục vấn đề các thực thể TrackSelectionOverride được gửi từ MediaController bị bỏ qua nếu các thực thể này tham chiếu đến một nhóm có Format.metadata (#296).
    • Khắc phục vấn đề cần có Player.COMMAND_GET_CURRENT_MEDIA_ITEM để truy cập siêu dữ liệu thông qua MediaSessionCompat cũ.
    • Khắc phục vấn đề các thực thể MediaSession trên luồng nền gây ra sự cố khi được sử dụng trong MediaSessionService (#318).
    • Khắc phục vấn đề mà trình thu nhận nút nội dung nghe nhìn được thư viện khai báo mà ứng dụng không có ý định này (#314).
  • DASH (Truyền phát thích ứng động qua HTTP):
    • Khắc phục việc xử lý dòng thời gian phân đoạn trống (#11014).
  • RTSP (Giao thức truyền tin thời gian thực):
    • Hãy thử lại bằng TCP nếu không thiết lập được RTSP bằng UDP với Lỗi RTSP 461 UnsupportedTransport (Không hỗ trợ phương thức truyền tải) (#11069).

Phiên bản 1.0.0

Ngày 22 tháng 3 năm 2023

Phát hành androidx.media3:media3-*:1.0.0. Phiên bản 1.0.0 bao gồm các thay đổi sau.

Bản phát hành này tương ứng với phiên bản ExoPlayer 2.18.5.

Không có thay đổi nào kể từ phiên bản 1.0.0-rc02.

Phiên bản 1.0.0-rc02

Ngày 2 tháng 3 năm 2023

Phát hành androidx.media3:media3-*:1.0.0-rc02. Phiên bản 1.0.0-rc02 bao gồm các thay đổi sau.

Bản phát hành này tương ứng với phiên bản ExoPlayer 2.18.4.

  • Thư viện Core:
    • Khắc phục lỗi phát hiện loại mạng trên API 33 (#10970).
    • Khắc phục NullPointerException khi gọi ExoPlayer.isTunnelingEnabled (#10977).
  • Nội dung đã tải xuống:
    • Đặt chênh lệch tối đa về thời gian bắt đầu của hai phân đoạn cần hợp nhất có thể định cấu hình trong SegmentDownloader và các lớp con (#248).
  • Âm thanh:
    • Khắc phục lỗi phát MP3 không có khoảng trống trên thiết bị Samsung (#8594).
    • Khắc phục lỗi tốc độ phát được đặt ngay sau khi tắt âm thanh có thể bị ghi đè bởi một thay đổi tốc độ trước đó (#10882).
  • Video:
    • Liên kết định dạng HEVC HDR10 với HEVCProfileMain10HDR10 thay vì HEVCProfileMain10.
    • Thêm giải pháp cho vấn đề thiết bị trên Chromecast có Google TV và Lenovo M10 FHD Plus khiến luồng AVC 60 khung hình/giây bị đánh dấu là không được hỗ trợ (#10898).
    • Khắc phục các vấn đề về hiệu suất phát hành khung hình khi phát nội dung nghe nhìn có tốc độ khung hình cao hơn nhiều so với tốc độ làm mới màn hình.
  • Truyền:
    • Khắc phục STATE_IDLE tạm thời khi chuyển đổi giữa các mục nội dung nghe nhìn (#245).
  • RTSP (Giao thức truyền tin thời gian thực):
    • Phát hiện IllegalArgumentException được gửi trong quá trình phân tích cú pháp thông báo phản hồi mô tả RTSP không hợp lệ (#10971).
  • Phiên:
    • Khắc phục lỗi nút phát/tạm dừng thông báo không cập nhật trạng thái trình phát (#192).
  • Tiện ích IMA:
    • Khắc phục lỗi khiến các luồng DAI không có quảng cáo không bắt đầu được vì không nhận được sự kiện LOADED đầu tiên (và trong trường hợp không có quảng cáo thì đó là sự kiện duy nhất).

Phiên bản 1.0.0-rc01

Ngày 16 tháng 2 năm 2023

Phát hành androidx.media3:media3-*:1.0.0-rc01. Phiên bản 1.0.0-rc01 bao gồm các thay đổi sau.

Bản phát hành này tương ứng với phiên bản ExoPlayer 2.18.3.

  • Thư viện Core:
    • Chỉnh sửa logic sắp xếp bộ giải mã của trình kết xuất để duy trì các lựa chọn ưu tiên của MediaCodecSelector, ngay cả khi bộ giải mã báo cáo có thể không phát được nội dung nghe nhìn một cách hiệu quả. Ví dụ: với bộ chọn mặc định, bộ giải mã phần cứng chỉ hỗ trợ chức năng sẽ được ưu tiên hơn bộ giải mã phần mềm hỗ trợ đầy đủ định dạng (#10604).
    • Thêm ExoPlayer.Builder.setPlaybackLooper để đặt một luồng phát lại có sẵn cho một thực thể ExoPlayer mới.
    • Cho phép xoá các trình trợ giúp trình quản lý tải xuống (#10776).
    • Thêm tham số vào BasePlayer.seekTo để cũng cho biết lệnh được dùng để tìm kiếm.
    • Sử dụng giao diện khi tải các đối tượng có thể vẽ trên API 21 trở lên (#220).
    • Thêm ConcatenatingMediaSource2 để cho phép kết hợp nhiều mục nội dung nghe nhìn vào một cửa sổ (#247).
  • Công cụ trích xuất:
    • Gửi ParserException thay vì NullPointerException nếu bảng mẫu (stbl) thiếu phần mô tả mẫu bắt buộc (stsd) khi phân tích cú pháp các nguyên tử trak.
    • Bỏ qua chính xác các mẫu khi tìm kiếm trực tiếp ở khung đồng bộ hoá trong fMP4 (#10941).
  • Âm thanh:
    • Sử dụng tốc độ bit định dạng âm thanh nén để tính dung lượng bộ nhớ đệm tối thiểu cho AudioTrack trong các lượt phát trực tiếp (truyền qua).
  • Văn bản:
    • Sửa TextRenderer chuyển chỉ mục (âm) không hợp lệ đến Subtitle.getEventTime nếu tệp phụ đề không chứa chú thích.
    • SubRip: Thêm hỗ trợ cho các tệp UTF-16 nếu các tệp đó bắt đầu bằng dấu thứ tự byte.
  • Siêu dữ liệu:
    • Phân tích cú pháp nhiều giá trị được phân tách bằng giá trị rỗng trên các khung ID3, như được ID3 phiên bản 2.4 cho phép.
    • Thêm MediaMetadata.mediaType để biểu thị loại nội dung hoặc loại thư mục được siêu dữ liệu mô tả.
    • Thêm MediaMetadata.isBrowsable để thay thế cho MediaMetadata.folderType. Loại thư mục sẽ không được dùng trong bản phát hành tiếp theo.
  • DASH (Truyền phát thích ứng động qua HTTP):
    • Thêm phân tích cú pháp đầy đủ cho các bộ điều chỉnh hình ảnh, bao gồm cả số lượng thẻ thông tin (#3752).
  • Giao diện người dùng:
    • Sửa PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) không dùng nữa để đảm bảo các thay đổi về chế độ hiển thị được truyền đến trình nghe đã đăng ký (#229).
    • Sửa thứ tự của các nút điều khiển trình phát ở giữa trong PlayerView khi dùng bố cục từ phải sang trái (RTL) (#227).
  • Phiên:
    • Thêm SimpleBasePlayer trừu tượng để giúp triển khai giao diện Player cho các trình phát tuỳ chỉnh.
    • Thêm phương thức hỗ trợ để chuyển đổi mã phiên của nền tảng thành Media3 SessionToken (#171).
    • Sử dụng onMediaMetadataChanged để kích hoạt bản cập nhật của phiên nội dung nghe nhìn trên nền tảng (#219).
    • Thêm phiên nội dung nghe nhìn làm đối số của getMediaButtons() trong DefaultMediaNotificationProvider và sử dụng danh sách không thể thay đổi để đảm bảo rõ ràng (#216).
    • Thêm trình nghe gọi lại onSetMediaItems để cung cấp phương thức sửa đổi/đặt danh sách MediaItem, bắt đầu chỉ mục và vị trí theo phiên trước khi đặt vào Trình phát (#156).
    • Tránh dùng tính năng phát hiện thao tác nhấn đúp cho các sự kiện của nút nội dung nghe nhìn không phải Bluetooth (#233).
    • Giúp QueueTimeline hoạt động mạnh mẽ hơn trong trường hợp trạng thái phiên cũ không rõ ràng (#241).
  • Siêu dữ liệu:
    • Phân tích cú pháp nhiều giá trị được phân tách bằng giá trị rỗng trên các khung ID3, như được ID3 phiên bản 2.4 cho phép.
    • Thêm MediaMetadata.mediaType để biểu thị loại nội dung hoặc loại thư mục được siêu dữ liệu mô tả.
    • Thêm MediaMetadata.isBrowsable để thay thế cho MediaMetadata.folderType. Loại thư mục sẽ không được dùng trong bản phát hành tiếp theo.
  • Tiện ích truyền:
    • Chuyển phiên bản Cast SDK lên phiên bản 21.2.0.
  • Tiện ích IMA:
    • Xoá trình nghe của trình phát thuộc ImaServerSideAdInsertionMediaSource trên luồng ứng dụng để tránh các vấn đề về luồng.
    • Thêm một thuộc tính focusSkipButtonWhenAvailable vào ImaServerSideAdInsertionMediaSource.AdsLoader.Builder để yêu cầu tập trung vào nút bỏ qua trên các thiết bị TV và đặt thuộc tính này là true theo mặc định.
    • Thêm một phương thức focusSkipButton() vào ImaServerSideAdInsertionMediaSource.AdsLoader để yêu cầu tập trung vào nút bỏ qua theo lập trình.
    • Chuyển SDK IMA lên phiên bản 3.29.0.
  • Ứng dụng minh hoạ:
    • Yêu cầu quyền gửi thông báo cho thông báo tải xuống trong thời gian chạy (#10884).

Phiên bản 1.0.0-beta03

Ngày 22 tháng 11 năm 2022

Phát hành androidx.media3:media3-*:1.0.0-beta03. Phiên bản 1.0.0-beta03 bao gồm các thay đổi sau.

Bản phát hành này tương ứng với phiên bản ExoPlayer 2.18.2.

  • Thư viện Core:
    • Thêm ExoPlayer.isTunnelingEnabled để kiểm tra xem tính năng tạo đường hầm có đang bật cho các bản nhạc hiện được chọn hay không (#2518).
    • Thêm WrappingMediaSource để đơn giản hoá việc gói một MediaSource duy nhất (#7279).
    • Loại bỏ vùng đệm phụ trước khi hành động phát bị treo do không đủ bộ nhớ.
    • Đóng khối Tracing "doSomeWork" khi bật chế độ giảm tải.
    • Dùng các lệnh tìm kiếm nhanh trong PlaybackStatsListener (#180) để khắc phục vấn đề khi theo dõi phiên.
    • Gửi lệnh gọi lại onMediaItemTransition bị thiếu khi gọi seekToNext hoặc seekToPrevious trong danh sách phát một mục duy nhất (#10667).
    • Thêm Player.getSurfaceSize trả về kích thước của nền tảng hiển thị video.
    • Sửa lỗi xoá trình nghe trong quá trình phát hành trình phát có thể gây ra IllegalStateException (#10758).
  • Tạo:
    • Thực thi compileSdkVersion tối thiểu để tránh lỗi biên dịch (#10684).
    • Tránh phát hành khối khi được đưa vào một bản dựng gradle khác.
  • Chọn bản nhạc:
    • Ưu tiên các bản nhạc khác thay vì Dolby Vision nếu màn hình không hỗ trợ Dolby Vision. (#8944).
  • Nội dung đã tải xuống:
    • Khắc phục vòng lặp vô hạn tiềm ẩn trong ProgressiveDownloader do việc tải xuống và phát đồng thời với cùng một PriorityTaskManager (#10570).
    • Thông báo tải xuống sẽ xuất hiện ngay lập tức (#183).
    • Giới hạn việc xoá các tệp tải xuống song song ở mức 1 để tránh tạo quá nhiều luồng (thread) (#10458).
  • Video:
    • Dùng thử bộ giải mã thay thế cho Dolby Vision nếu màn hình không hỗ trợ Dolby Vision. (#9794).
  • Âm thanh:
    • Dùng SingleThreadExecutor để phát hành thực thể AudioTrack nhằm tránh lỗi OutOfMemory khi phát hành nhiều trình phát cùng một lúc (#10057).
    • Thêm AudioOffloadListener.onExperimentalOffloadedPlayback cho trạng thái giảm tải AudioTrack. (#134).
    • Đặt AudioTrackBufferSizeProvider làm giao diện công khai.
    • Thêm ExoPlayer.setPreferredAudioDevice để thiết lập thiết bị đầu ra âm thanh ưu tiên (#135).
    • Đổi tên androidx.media3.exoplayer.audio.AudioProcessor thành androidx.media3.common.audio.AudioProcessor.
    • Liên kết âm thanh 8 kênh và 12 kênh với mặt nạ kênh 7.1 và 7.1.4 tương ứng trên mọi phiên bản Android (#10701).
  • Siêu dữ liệu:
    • Bạn hiện có thể định cấu hình MetadataRenderer để kết xuất siêu dữ liệu ngay khi có. Tạo một thực thể với MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) để chỉ định xem trình kết xuất sẽ xuất siêu dữ liệu sớm hay đồng bộ với vị trí trình phát.
  • DRM (Quản lý bản quyền nội dung số):
    • Tìm cách sửa lỗi trong quá trình triển khai Android 13 ClearKey có trả về một URL giấy phép không trống nhưng không hợp lệ.
    • Sửa lỗi setMediaDrmSession failed: session not opened khi chuyển đổi giữa các giao thức DRM trong một danh sách phát (ví dụ: Widevine sang ClearKey).
  • Văn bản:
    • CEA-608: Đảm bảo các lệnh chuyển đổi dịch vụ trên trường 2 được xử lý chính xác (#10666).
  • DASH (Truyền phát thích ứng động qua HTTP):
    • Phân tích cú pháp EventStream.presentationTimeOffset từ các tệp kê khai (#10460).
  • Giao diện người dùng:
    • Sử dụng cơ chế ghi đè hiện tại của trình phát làm giá trị đặt trước trong TrackSelectionDialogBuilder (#10429).
  • Phiên:
    • Đảm bảo các lệnh luôn được thực thi theo đúng thứ tự ngay cả khi một số lệnh yêu cầu độ phân giải không đồng bộ (#85).
    • Thêm DefaultMediaNotificationProvider.Builder để tạo các thực thể DefaultMediaNotificationProvider. Trình tạo có thể định cấu hình mã thông báo, mã kênh thông báo và tên kênh thông báo mà nhà cung cấp sử dụng. Ngoài ra, hãy thêm phương thức DefaultMediaNotificationProvider.setSmallIcon(int) để thiết lập biểu tượng thông báo nhỏ. (#104).
    • Đảm bảo các lệnh được gửi trước MediaController.release() không bị xoá (#99).
    • SimpleBitmapLoader có thể tải bitmap từ các URI file:// (#108).
    • Sửa câu nhận định ngăn MediaController tìm kiếm quảng cáo trong một khoảng thời gian (#122).
    • Khi quá trình phát kết thúc, MediaSessionService sẽ dừng trên nền trước và một thông báo sẽ hiển thị để bắt đầu phát lại mục nội dung nghe nhìn đã phát gần đây nhất (#112).
    • Không bắt đầu dịch vụ trên nền trước với ý định tạm dừng đang chờ xử lý (#167).
    • Ẩn "huy hiệu" theo cách thủ công được liên kết với thông báo do DefaultNotificationProvider tạo trên API 26 và API 27 (huy hiệu sẽ tự động ẩn trên API 28 trở lên) (#131).
    • Sửa lỗi kết nối liên kết thứ hai từ MediaSession cũ với Media3 MediaController gây ra IllegalStateExceptions (#49).
  • RTSP (Giao thức truyền tin thời gian thực):
    • Thêm hoạt động xử lý gói phân tách H263 (#119).
    • Thêm tính năng hỗ trợ cho MP4A-LATM (#162).
  • IMA:
    • Thêm thời gian chờ để tải thông tin quảng cáo nhằm xử lý các trường hợp SDK IMA bị treo khi tải quảng cáo (#10510).
    • Ngăn việc bỏ qua quảng cáo trong video khi chuyển đến cuối nội dung (#10685).
    • Tính toán chính xác thời lượng của các buổi phát trực tiếp có quảng cáo được chèn phía máy chủ, ví dụ: DAI (Chèn quảng cáo động) IMA (#10764).
  • Tiện ích FFmpeg:
    • Thêm các cờ mới bắt buộc để liên kết thư viện FFmpeg với NDK 23.1.7779620 trở lên (#9933).
  • Tiện ích AV1:
    • Cập nhật phiên bản CMake để tránh tình trạng không tương thích với các bản phát hành Android Studio mới nhất (#9933).
  • Tiện ích truyền (cast):
    • Triển khai getDeviceInfo() để có thể xác định CastPlayer khi kiểm soát hoạt động phát bằng MediaController (#142).
  • Bộ chuyển đổi:
    • Thêm bộ đếm giờ phòng vệ kết hợp để phát hiện thời điểm tạo mẫu đầu ra quá chậm.
  • Xoá các biểu tượng không dùng nữa:
    • Xoá Transformer.Builder.setOutputMimeType(String). Tính năng này đã bị xoá. Loại MIME sẽ luôn là MP4 khi sử dụng trình kết hợp mặc định.

Phiên bản 1.0.0-beta02

Ngày 21 tháng 7 năm 2022

Phát hành androidx.media3:media3-*:1.0.0-beta02. Phiên bản 1.0.0-beta02 bao gồm các thay đổi sau.

Bản phát hành này tương ứng với phiên bản ExoPlayer 2.18.1.

  • Thư viện Core:
    • Đảm bảo việc thay đổi ShuffleOrder với ExoPlayer.setShuffleOrder sẽ dẫn đến lệnh gọi đến Player.Listener#onTimelineChanged bằng reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • Đối với nội dung nghe nhìn liên tục, chỉ đưa các bản nhạc đã chọn vào vị trí vùng đệm (#10361).
    • Cho phép trình ghi nhật ký tuỳ chỉnh cho mọi đầu ra nhật ký ExoPlayer (#9752).
    • Khắc phục lỗi triển khai setDataSourceFactory trong DefaultMediaSourceFactory không hoạt động trong một số trường hợp (#116).
  • Công cụ trích xuất:
    • Khắc phục lỗi phân tích cú pháp các bộ ảnh tham chiếu ngắn hạn H265 (#10316).
    • Khắc phục lỗi phân tích cú pháp tốc độ bit từ các hộp esds (#10381).
  • DASH (Truyền phát thích ứng động qua HTTP):
    • Phân tích cú pháp URL giấy phép ClearKey từ các tệp kê khai (#10246).
  • Giao diện người dùng:
    • Đảm bảo TalkBack thông báo tuỳ chọn tốc độ hiện đang hoạt động trong trình đơn bộ điều khiển chế độ phát (#10298).
  • RTSP (Giao thức truyền tin thời gian thực):
    • Thêm xử lý gói phân tách VP8 (#110).
  • Tiện ích Leanback:
    • Theo dõi các thay đổi đối với playWhenReady trong LeanbackAdapter (10420).
  • Truyền:
    • Sử dụng MediaItem đã được truyền vào phương thức danh sách phát dưới dạng Window.mediaItem trong CastTimeline (#25, #8212).
    • Hỗ trợ Player.getMetadata()Listener.onMediaMetadataChanged() với CastPlayer (#25).

Phiên bản 1.0.0-beta01

Ngày 16 tháng 6 năm 2022

Phát hành androidx.media3:media3-*:1.0.0-beta01. Phiên bản 1.0.0-beta01 bao gồm các thay đổi sau.

Phiên bản này tương ứng với phiên bản ExoPlayer 2.18.0.

  • Thư viện Core:
    • Bật tính năng hỗ trợ cho việc chẩn đoán nền tảng Android thông qua MediaMetricsManager. ExoPlayer sẽ chuyển tiếp các sự kiện phát và dữ liệu về hiệu suất đến nền tảng, qua đó cung cấp hiệu suất của hệ thống và thông tin gỡ lỗi trên thiết bị. Google cũng có thể thu thập dữ liệu này nếu người dùng thiết bị đã bật chia sẻ dữ liệu sử dụng và chẩn đoán. Ứng dụng có thể chọn không tham gia chẩn đoán nền tảng cho ExoPlayer bằng ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Sửa lỗi các bản nhạc được đặt lại quá thường xuyên khi sử dụng MergingMediaSource, chẳng hạn như khi tải các phụ đề bên cạnh và thay đổi phụ đề đã chọn khi phát lại (#10248).
    • Dừng phát hiện loại mạng 5G-NSA trên API 29 và 30. Các lượt phát này sẽ giả định mạng 4G.
    • Không cho phép truyền null vào MediaSource.Factory.setDrmSessionManagerProviderMediaSource.Factory.setLoadErrorHandlingPolicy. Nếu được yêu cầu, hệ thống có thể truyền các bản sao của DefaultDrmSessionManagerProviderDefaultLoadErrorHandlingPolicy một cách rõ ràng.
    • Thêm MediaItem.RequestMetadata để đại diện cho siêu dữ liệu cần thiết khi phát nội dung nghe nhìn mà không biết chính xác LocalConfiguration. Đồng thời xoá MediaMetadata.mediaUrl vì hiện có trong RequestMetadata.
    • Thêm Player.Command.COMMAND_SET_MEDIA_ITEM để cho phép người chơi thiết lập một mục duy nhất.
  • Chọn bản nhạc:
    • Làm phẳng lớp TrackSelectionOverrides thành TrackSelectionParameters, và quảng bá TrackSelectionOverride lên lớp cao cấp nhất.
    • Đổi tên TracksInfo thành TracksTracksInfo.TrackGroupInfo thành Tracks.Group. Player.getCurrentTracksInfoPlayer.Listener.onTracksInfoChanged cũng đã được đổi tên thành Player.getCurrentTracksPlayer.Listener.onTracksChanged. Cách này bao gồm cả việc "ngừng sử dụng" tên phương thức Player.Listener.onTracksChanged, nhưng sử dụng các loại tham số khác.
    • Thay đổi DefaultTrackSelector.buildUponParametersDefaultTrackSelector.Parameters.buildUpon để trả về DefaultTrackSelector.Parameters.Builder thay vì DefaultTrackSelector.ParametersBuilder không dùng nữa.
    • Thêm DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities được bật theo mặc định. Khi được bật, DefaultTrackSelector sẽ ưu tiên các bản âm thanh có số kênh không vượt quá khả năng đầu ra của thiết bị. Trên thiết bị cầm tay, DefaultTrackSelector sẽ ưu tiên định dạng âm thanh nổi/đơn âm thay vì định dạng âm thanh đa kênh, trừ trường hợp định dạng đa kênh có thể là Âm thanh không gian (Android 12L trở lên) hoặc là định dạng âm thanh vòm Dolby. Ngoài ra, trên các thiết bị hỗ trợ việc tạo không gian âm thanh, DefaultTrackSelector sẽ theo dõi những thay đổi trong Thuộc tính của âm thanh không gian và kích hoạt lựa chọn mới cho các bản nhạc. Các thiết bị có Chế độ giao diện người dùng television sẽ bị loại trừ khỏi những hạn chế này và định dạng có số kênh cao nhất sẽ được ưu tiên. Để bật tính năng này, bản sao DefaultTrackSelector phải được tạo bằng Context.
  • Video:
    • Đổi tên DummySurface thành PlaceholderSurface.
    • Thêm tuỳ chọn hỗ trợ AV1 vào MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Âm thanh:
    • Sử dụng bộ giải mã âm thanh LG AC3 quảng cáo loại MIME không chuẩn.
    • Thay đổi loại trả về của AudioAttributes.getAudioAttributesV21() từ android.media.AudioAttributes thành lớp trình bao bọc AudioAttributesV21 mới để ngăn việc xác minh ART chậm trên API < 21.
    • Truy vấn nền tảng (API 29 trở lên) hoặc giả sử số kênh mã hoá âm thanh để truyền âm thanh khi số kênh âm thanh của định dạng không được thiết lập, việc này xảy ra với quá trình chuẩn bị phân đoạn HLS (10204).
    • Định cấu hình AudioTrack bằng mặt nạ kênh AudioFormat.CHANNEL_OUT_7POINT1POINT4 nếu bộ giải mã xuất ra âm thanh PCM 12 kênh (#10322).
  • DRM (Quản lý bản quyền nội dung số):
    • Đảm bảo phiên DRM luôn được cập nhật chính xác khi tìm kiếm ngay sau khi thay đổi định dạng (10274).
  • Văn bản:
    • Thay đổi Player.getCurrentCues() để trả về CueGroup thay vì List<Cue>.
    • SSA: Hỗ trợ chế độ cài đặt kiểu OutlineColour khi BorderStyle == 3 (tức là OutlineColour đặt nền của tín hiệu) (#8435).
    • CEA-708: Phân tích cú pháp dữ liệu thành nhiều khối dịch vụ và bỏ qua các khối không liên quan đến số dịch vụ hiện được chọn.
    • Xoá RawCcExtractor chỉ được dùng để xử lý định dạng phụ đề nội bộ của Google.
  • Công cụ trích xuất:
    • Thêm hỗ trợ cho AVI (#2092).
    • Matroska: Phân tích cú pháp DiscardPadding cho các bản nhạc Opus.
    • MP4: Tốc độ bit phân tích cú pháp từ các hộp esds.
    • Ogg: Cho phép mã Opus và tiêu đề nhận xét trùng lặp (#10038).
  • Giao diện người dùng:
    • Khắc phục việc phân phối sự kiện tới OnClickListener được đặt vào PlayerView trong trường hợp useController=false (#9605). Ngoài ra, hãy khắc phục việc phân phối sự kiện đến OnLongClickListener cho tất cả các cấu hình chế độ xem.
    • Sửa lỗi xử lý không chính xác một chuỗi các sự kiện chạm thoát ra khỏi giới hạn của PlayerView trước ACTION_UP dưới dạng một lượt nhấp (#9861).
    • Khắc phục vấn đề về khả năng tiếp cận PlayerView, trong đó thao tác nhấn có thể chuyển đổi chế độ phát thay vì ẩn các nút điều khiển (#8627).
    • Viết lại TrackSelectionViewTrackSelectionDialogBuilder để hoạt động được với giao diện Player thay vì ExoPlayer. Điều này cho phép chế độ xem được sử dụng cùng với các hoạt động triển khai Player khác, đồng thời loại bỏ phần phụ thuộc khỏi mô-đun giao diện người dùng sang mô-đun ExoPlayer. Đây là một thay đổi có thể gây lỗi.
    • Không hiển thị các đoạn văn bản bắt buộc trong bộ chọn bản nhạc PlayerView và giữ một đoạn văn bản bắt buộc phù hợp được chọn nếu bạn chọn "Không có" (#9432).
  • DASH (Truyền phát thích ứng động qua HTTP):
    • Phân tích cú pháp số kênh từ các phần tử DTS AudioChannelConfiguration. Thao tác này sẽ bật lại tính năng truyền âm thanh cho các luồng DTS (#10159).
    • Không cho phép truyền null đến DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. Bạn có thể chuyển các thực thể của DefaultCompositeSequenceableLoaderFactory một cách rõ ràng nếu cần.
  • HLS (Phát trực tuyến dựa trên HTTP):
    • Dự phòng cho việc chuẩn bị theo từng đoạn nếu thuộc tính CODECS (bộ mã hoá và giải mã) của danh sách phát không chứa bộ mã hoá và giải mã âm thanh (#10065).
    • Không cho phép truyền null đến HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactoryHlsMediaSource.Factory.setPlaylistTrackerFactory. Hệ thống có thể chuyển các bản sao của DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory hoặc tệp tham chiếu đến DefaultHlsPlaylistTracker.FACTORY một cách rõ ràng nếu cần thiết.
  • Phát trực tuyến mượt mà:
    • Không cho phép truyền null đến SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. Bạn có thể chuyển các thực thể của DefaultCompositeSequenceableLoaderFactory một cách rõ ràng nếu cần.
  • RTSP (Giao thức truyền tin thời gian thực):
    • Thêm trình đọc RTP cho H263 (#63).
    • Thêm trình đọc RTP cho MPEG4 (#35).
    • Thêm trình đọc RTP cho HEVC (#36).
    • Thêm trình đọc RTP cho AMR. Hiện tại, Google chỉ hỗ trợ luồng AMR đơn kênh, không xen kẽ. Không hỗ trợ tải trọng AMR RTP tổng hợp. (#46)
    • Thêm trình đọc RTP cho VP8 (#47).
    • Thêm trình đọc RTP cho WAV (#56).
    • Sửa tiêu đề uỷ quyền cơ bản RTSP. (#9544).
    • Dừng kiểm tra các trường SDP bắt buộc vì ExoPlayer không cần các trường này (#10049).
    • Gửi ngoại lệ đã đánh dấu khi phân tích cú pháp thời gian RTSP (#10165).
    • Thêm trình đọc RTP cho VP9 (#47).
    • Thêm trình đọc RTP cho OPUS (#53).
  • Nguồn dữ liệu:
    • Đổi tên DummyDataSource thành PlaceholderDataSource.
    • Giải quyết việc xử lý gián đoạn OkHttp.
  • Phiên:
    • Thay thế MediaSession.MediaItemFiller bằng MediaSession.Callback.onAddMediaItems để cho phép xử lý các yêu cầu không đồng bộ.
    • Hỗ trợ các phương thức setMediaItems(s) khi MediaController kết nối với một phiên nội dung nghe nhìn cũ.
    • Xóa MediaController.setMediaUriMediaSession.Callback.onSetMediaUri. Bạn có thể sử dụng cùng một chức năng bằng cách sử dụng MediaController.setMediaItemMediaSession.Callback.onAddMediaItems.
    • Chuyển tiếp cuộc gọi MediaController cũ để phát nội dung nghe nhìn đến MediaSession.Callback.onAddMediaItems thay vì onSetMediaUri.
    • Thêm MediaNotification.ProviderDefaultMediaNotificationProvider để tuỳ chỉnh thông báo.
    • Thêm BitmapLoaderSimpleBitmapLoader để tải hình ảnh nghệ thuật xuống.
    • Thêm MediaSession.setCustomLayout() để cung cấp khả năng tương thích ngược với phiên cũ.
    • Thêm MediaSession.setSessionExtras() để cung cấp tính năng tương đương với phiên cũ.
    • Đổi tên MediaSession.MediaSessionCallback thành MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback thành MediaLibrarySession.CallbackMediaSession.Builder.setSessionCallback thành setCallback.
    • Khắc phục NPE trong MediaControllerImplLegacy (#59).
    • Cập nhật thông tin vị trí của phiên trên tiến trình thay đổi(#51).
    • Khắc phục NPE trong MediaControllerImplBase sau khi phát hành bộ điều khiển (#74).
  • Phát quảng cáo / IMA:
    • Giảm tốc độ thăm dò quảng cáo từ 100 mili giây xuống còn 200 mili giây để phù hợp với đề xuất của Hội đồng đánh giá phương tiện (MRC).
  • Tiện ích FFmpeg:
    • Cập nhật phiên bản CMake lên 3.21.0+ để tránh lỗi CMake khiến quá trình đồng bộ hoá gradle của AndroidStudio không thành công (#9933).
  • Xoá các biểu tượng không dùng nữa:
    • Xoá Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Sử dụng Player.Listener.onTracksChanged(Tracks) thay thế.
    • Xoá Player.getCurrentTrackGroupsPlayer.getCurrentTrackSelections. Thay vào đó, hãy sử dụng Player.getCurrentTracks. Bạn cũng có thể tiếp tục sử dụng ExoPlayer.getCurrentTrackGroupsExoPlayer.getCurrentTrackSelections, mặc dù các phương thức này không còn được dùng nữa.
    • Xóa hằng số DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTDEFAULT_TRACK_SELECTOR_PARAMETERS. Ưu tiên sử dụng getDefaultTrackSelectorParameters(Context) khi có thể, nếu không hãy dùng DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Xóa hàm dựng DefaultTrackSelector(ExoTrackSelection.Factory). Thay vào đó, hãy sử dụng DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Xoá Transformer.Builder.setContext. Context phải được truyền vào hàm dựng Transformer.Builder.

Phiên bản 1.0.0-alpha03

Ngày 14 tháng 3 năm 2022

Phát hành androidx.media3:media3-*:1.0.0-alpha03. Phiên bản 1.0.0-alpha03 bao gồm các thay đổi sau.

Phiên bản này tương ứng với phiên bản ExoPlayer 2.17.1.

  • Âm thanh:
    • Sửa lỗi kiểm tra chất lượng âm thanh của Dolby Atmos (E-AC3-JOC) trong HLS.
  • Công cụ trích xuất:
    • FMP4: Khắc phục vấn đề trong đó siêu dữ liệu mẫu emsg có thể được xuất theo thứ tự không chính xác đối với các luồng chứa cả nguyên tử emsg v0 và v1 (#9996).
  • Văn bản:
    • Sửa lỗi tương tác của SingleSampleMediaSource.Factory.setTrackIdMediaItem.SubtitleConfiguration.Builder.setId để ưu tiên trường SubtitleConfiguration và quay lại giá trị Factory nếu trường này không được thiết lập (#10016).
  • Phát quảng cáo:
    • Khắc phục sự cố âm thanh chạy ngầm giữa các khoảng thời gian quảng cáo trong luồng SSAI trực tiếp.

Phiên bản 1.0.0-alpha02

Ngày 2 tháng 3 năm 2022

Phát hành androidx.media3:media3-*:1.0.0-alpha02. Phiên bản 1.0.0-alpha02 bao gồm các thay đổi sau.

Phiên bản này tương ứng với phiên bản ExoPlayer 2.17.0.

  • Thư viện Core:
    • Thêm phương thức được bảo vệ DefaultRenderersFactory.getCodecAdapterFactory() để các lớp con của DefaultRenderersFactory ghi đè buildVideoRenderers() hoặc buildAudioRenderers() có thể truy cập vào nhà máy trình chuyển đổi mã hoá/giải mã (codec adapter factory) rồi truyền vào các thực thể MediaCodecRenderer được tạo.
    • Lần lượt phát hành các trường tiêu đề ICY name, genre cho MediaMetadata.stationMediaMetadata.genre để truy cập vào ứng dụng qua Player.Listener.onMediaMetadataChanged() (#9677).
    • Xoá các khoá rỗng khỏi DefaultHttpDataSource#getResponseHeaders.
    • Ngủ rồi thử lại khi không tạo được phiên bản MediaCodec. Cách này hoạt động đối với lỗi xảy ra trên một số thiết bị khi chuyển đổi nền tảng từ một bộ mã hoá và giải mã bảo mật sang một bộ mã hoá và giải mã khác (#8696).
    • Thêm MediaCodecAdapter.getMetrics() để cho phép người dùng lấy dữ liệu về chỉ số qua MediaCodec. (#9766).
    • Khắc phục độ phân giải phần phụ thuộc Maven (#8353).
    • Tắt tính năng tự động điều chỉnh tốc độ đối với lượt phát trực tiếp không có tính năng độ trễ thấp hay yêu cầu người dùng đặt tốc độ (#9329).
    • Đổi tên DecoderCounters#inputBufferCount thành queuedInputBufferCount.
    • Đặt SimpleExoPlayer.renderers ở chế độ riêng tư. Bạn có thể truy cập trình kết xuất thông qua ExoPlayer.getRenderer.
    • Cập nhật một số giá trị AnalyticsListener.EventFlags không đổi để khớp với các giá trị trong Player.EventFlags.
    • Phân tách AnalyticsCollector thành một giao diện và phương thức triển khai mặc định để cho phép R8 loại bỏ nếu ứng dụng không cần.
  • Chọn bản nội dung:
    • Hỗ trợ gắn cờ vai trò video ưu tiên trong việc lựa chọn nội dung đa phương tiện (#9402).
    • Cập nhật logic lựa chọn nội dung video để cân nhắc các loại MIME và cờ vai trò ưu tiên khi chọn nhiều video để điều chỉnh cho phù hợp (#9519).
    • Cập nhật logic lựa chọn bản video và âm thanh để chỉ chọn những định dạng cho các lựa chọn thích ứng có cùng bộ giải mã và hỗ trợ phần cứng (#9565).
    • Cập nhật logic lựa chọn nội dung video để ưu tiên các bộ mã hoá và giải mã hiệu quả hơn nếu nhiều bộ mã hoá và giải mã được bộ giải mã chính, tăng tốc nhờ phần cứng hỗ trợ (#4835).
    • Ưu tiên các tuỳ chọn nội dung âm thanh (ví dụ: bản âm thanh "mặc định" hoặc một bản nhạc khớp với ngôn ngữ bản địa của hệ thống) thay vì giới hạn lựa chọn bản nhạc kỹ thuật (ví dụ: loại MIME ưu tiên hoặc số lượng kênh tối đa).
    • Khắc phục lỗi chọn nội dung đa phương tiện mà việc ghi đè một nhóm bản nội dung không tắt các nhóm bản nội dung khác cùng loại (#9675).
    • Khắc phục lỗi chọn nội dung đa phương tiện mà việc kết hợp ghi đè nội dung rỗng và không rỗng được áp dụng không đúng cách (#9649).
    • Cấm sao chép TrackGroup trong TrackGroupArray. Luôn có thể phân biệt TrackGroup bằng cách đặt một id trong hàm khởi tạo TrackGroup. Việc này giúp khắc phục sự cố ngừng hoạt động khi tiếp tục phát sau khi chạy ngầm ứng dụng với cơ chế ghi đè bản nội dung đang được phát (#9718).
    • Sửa đổi logic trong AdaptiveTrackSelection để cho phép tăng chất lượng trong trường hợp không đủ băng thông mạng, ngay cả khi hoạt động phát đã rất gần thời điểm phát trực tiếp (live edge) (#9784).
  • Video:
    • Sửa logic bộ giải mã dự phòng cho Dolby Vision để sử dụng bộ giải mã H264/H265 tương thích nếu cần.
  • Âm thanh:
    • Sửa logic bộ giải mã dự phòng cho Dolby Atmos (E-AC3-JOC) để sử dụng bộ giải mã E-AC3 tương thích nếu cần.
    • Thay đổi các API AudioCapabilities để yêu cầu truyền AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES thay vì null.
    • Cho phép tuỳ chỉnh cách tính dung lượng bộ nhớ đệm AudioTrack bằng cách chèn AudioTrackBufferSizeProvider vào DefaultAudioSink. (#8891).
    • Thử tạo lại AudioTrack nếu dung lượng bộ nhớ đệm được yêu cầu lớn hơn 1 MB. (#9712).
  • Công cụ trích xuất:
    • WAV: Thêm tuỳ chọn hỗ trợ khi phát trực tiếp định dạng tệp RF64 (#9543).
    • Khắc phục vấn đề phân tích cú pháp không chính xác đối với các đơn vị H.265 SPS NAL (#9719).
    • Phân tích cú pháp bình luận Vorbis (bao gồm cả METADATA_BLOCK_PICTURE) trong các tệp Ogg Opus và Ogg Vorbis.
  • Văn bản:
    • Thêm trường MediaItem.SubtitleConfiguration.id mà sẽ được truyền vào trường Format.id có bản phụ đề tạo từ cấu hình (#9673).
    • Thêm tuỳ chọn hỗ trợ cơ bản cho phụ đề WebVTT trong vùng chứa Matroska (#9886).
    • Ngăn Cea708Decoder đọc nhiều hơn kích thước đã khai báo của một khối dịch vụ.
  • DRM (Quản lý bản quyền nội dung số):
    • Xoá playbackLooper khỏi DrmSessionManager.(pre)acquireSession. Khi một ứng dụng sử dụng DrmSessionManager trong một MediaSource tuỳ chỉnh, playbackLooper cần được truyền vào DrmSessionManager.setPlayer.
  • Phát quảng cáo / IMA:
    • Thêm tuỳ chọn hỗ trợ cho công nghệ Chèn quảng cáo động (DAI) IMA (#8213).
    • Thêm phương thức vào AdPlaybackState để cho phép đặt lại nhóm quảng cáo sao cho có thể phát lại (#9615).
    • Áp dụng tốc độ phát 1,0 trong khi phát quảng cáo (#9018).
    • Khắc phục lỗi một nhóm quảng cáo không tải được dẫn đến việc phát lại ngay lập tức (#9929).
  • Giao diện người dùng:
    • Chỉnh sửa màu của các số trongStyledPlayerView cho nút tua lại và tua nhanh khi sử dụng một số giao diện nhất định (#9765).
    • Dịch đúng các chuỗi tốc độ phát (#9811).
  • DASH (Truyền phát thích ứng động qua HTTP):
    • Thêm các thuộc tính thiết yếu và bổ sung được phân tích cú pháp vào Representation (#9579).
    • Hỗ trợ vai trò theo dõi forced-subtitle (#9727).
    • Ngừng diễn giải vai trò theo dõi của mainC.SELECTION_FLAG_DEFAULT.
    • Chỉnh sửa logic loại trừ URL cơ sở cho các tệp kê khai không khai báo vùng chứa tên DVB (#9856).
    • Hỗ trợ các URL MPD.Location tương đối (#9939).
  • HLS (Phát trực tuyến dựa trên HTTP):
    • Tự động điền chính xác Format.label khi chỉ phát âm thanh dựa trên giao thức HLS (#9608).
    • Mặc định sử dụng thông tin đa biến trong danh sách phát cho việc phát nội dung đa phương tiện (chunkless preparation) để cải thiện thời gian khởi động. Nếu việc truyền và nhận dữ liệu có chứa các bản phụ đề kết hợp (không được khai báo trong danh sách phát chính), thì bạn phải thêm các bản phụ đề đó vào danh sách phát chính để có thể phát, hoặc tắt chế độ chuẩn bị phát trực tiếp nội dung trong danh sách phát đa phương tiện (chunkless preparation) bằng HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Hỗ trợ tua tới chính xác khung hình chính trong HLS (#2882).
  • RTSP (Giao thức truyền tin thời gian thực):
    • Cung cấp một API máy khách để ghi đè SocketFactory dùng cho mọi kết nối máy chủ (#9606).
    • Ưu tiên phương thức xác thực DIGEST hơn BASIC nếu có cả hai (#9800).
    • Xử lý khi không có thời gian của nội dung đa phương tiện phát qua giao thức RTSP (#9775).
    • Bỏ qua các giá trị tiêu đề RTP-Info không hợp lệ (#9619).
  • Bộ chuyển đổi:
    • Tăng phiên bản API tối thiểu bắt buộc lên 21.
    • TransformationException hiện được dùng để mô tả lỗi xảy ra trong quá trình chuyển đổi.
    • Thêm TransformationRequest để chỉ định các tuỳ chọn chuyển đổi.
    • Cho phép đăng ký nhiều trình nghe (event listener).
    • Sửa lỗi Bộ chuyển đổi bị kẹt khi đọc một phần đầu ra bộ mã hoá và giải mã.
    • Sửa lỗi NPE tiềm ẩn trong Transformer.getProgress khi phát hành các khai báo ngoại lệ cho chương trình kết hợp nội dung đa phương tiện.
    • Thêm ứng dụng minh hoạ áp dụng chuyển đổi.
  • Phần mở rộng MediaSession:
    • Theo mặc định, MediaSessionConnector hiện sẽ xoá danh sách phát đã dừng. Các ứng dụng muốn giữ lại danh sách phát có thể gọi setClearMediaItemsOnStop(false) trên trình kết nối.
  • Tiện ích truyền (cast):
    • Khắc phục lỗi ngăn CastPlayer gọi đúng onIsPlayingChanged (#9792).
    • Hỗ trợ siêu dữ liệu âm thanh bao gồm hình minh hoạ với DefaultMediaItemConverter (#9663).
  • Tiện ích FFmpeg:
    • Cho build_ffmpeg.sh phụ thuộc vào tập công cụ quản lý tệp nhị phân LLVM thay vì GNU (#9933).
  • Khả năng tương thích với Android 12:
    • Nâng cấp tiện ích Truyền để phụ thuộc vào com.google.android.gms:play-services-cast-framework:20.1.0. Các phiên bản trước đó của play-services-cast-framework không tương thích với các ứng dụng dành cho Android 12 và sẽ gặp sự cố với IllegalArgumentException khi tạo PendingIntent (#9528).
  • Xoá các biểu tượng không dùng nữa:
    • Xoá Player.EventListener. Sử dụng Player.Listener.
    • Xoá MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactoryMediaSourceFactory#setDrmUserAgent. Sử dụng MediaSourceFactory#setDrmSessionManagerProvider.
    • Xoá MediaSourceFactory#setStreamKeys. Sử dụng MediaItem.Builder#setStreamKeys.
    • Xoá MediaSourceFactory#createMediaSource(Uri). Sử dụng MediaSourceFactory#createMediaSource(MediaItem).
    • Xóa setTag khỏi DashMediaSource, HlsMediaSourceSsMediaSource. Sử dụng MediaItem.Builder#setTag.
    • Xoá DashMediaSource#setLivePresentationDelayMs(long, boolean). Sử dụng MediaItem.Builder#setLiveConfigurationMediaItem.LiveConfiguration.Builder#setTargetOffsetMs để ghi đè tệp kê khai hoặc DashMediaSource#setFallbackTargetLiveOffsetMs để cung cấp giá trị dự phòng.
    • Xoá (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Bắt buộc phải thực thi luồng này.
    • Xóa ActionFileActionFileUpgradeUtil. Dùng ExoPlayer 2.16.1 hoặc các phiên bản trước đó để sử dụng ActionFileUpgradeUtil nhằm hợp nhất các tệp thao tác cũ vào DefaultDownloadIndex.
    • Xoá ProgressiveMediaSource#setExtractorsFactory. Sử dụng hàm constructor ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Xóa ProgressiveMediaSource.Factory#setTagProgressiveMediaSource.Factory#setCustomCacheKey. Sử dụng MediaItem.Builder#setTagMediaItem.Builder#setCustomCacheKey.
    • Xoá các hàm constructor DefaultRenderersFactory(Context, @ExtensionRendererMode int)DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Sử dụng hàm constructor DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererModeDefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Xóa tất cả hàm constructor CronetDataSource công khai. Sử dụng CronetDataSource.Factory.
  • Chỉ thay đổi IntDefs sau thành @Target(TYPE_USE). Thay đổi này có thể làm gián đoạn quá trình biên dịch các trường hợp sử dụng trong Kotlin. Bạn có thể khắc phục lỗi này bằng cách di chuyển phần chú giải để chú thích loại (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 (trong gói com.google.android.exoplayer2.ext.flac )
    • @FlacExtractor.Flags (trong gói 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

Phiên bản 1.0.0-alpha01

Ngày 27 tháng 10 năm 2021

Phát hành androidx.media3:media3-*:1.0.0-alpha01. Phiên bản 1.0.0-alpha01 bao gồm các thay đổi sau.

Tính năng mới

Media3 là nơi lưu trữ mới các thư viện hỗ trợ nội dung đa phương tiện, bao gồm ExoPlayer. Phiên bản alpha đầu tiên bao gồm những phương thức triển khai sớm và đầy đủ chức năng của các thư viện để triển khai các trường hợp sử dụng nội dung đa phương tiện, bao gồm:

  • ExoPlayer là trình phát nội dung nghe nhìn cấp ứng dụng dành cho Android, có thể dễ dàng tuỳ chỉnh và mở rộng.
  • Chức năng tương tác trình phát nội dung đa phương tiện (media session) để hiển thị và kiểm soát phát lại. Mô-đun mới của chức năng này sử dụng giao diện Player giống như ExoPlayer.
  • Các thành phần giao diện người dùng để xây dựng giao diện người dùng phát lại nội dung đa phương tiện.
  • Các mô-đun gói chức năng trong các thư viện khác để sử dụng với ExoPlayer, ví dụ: chèn quảng cáo thông qua SDK IMA.

Để biết thêm thông tin, hãy xem dự án GitHub Media3.

Trước đây, ExoPlayer đã được lưu trữ trong một dự án GitHub ExoPlayer riêng biệt. Trong Media3, tên gói là androidx.media3.exoplayer. Chúng tôi dự định tiếp tục duy trì và phát hành dự án GitHub ExoPlayer trong một thời gian để các ứng dụng có thời gian chuyển sang Media3. Media3 có các lựa chọn thay thế cho tất cả các mô-đun ExoPlayer, ngoại trừ các tiện ích media2 và mediasession cũ. Các tiện ích này được thay thế bằng mô-đun media3-session mới. Điều này giúp tích hợp trực tiếp giữa trình phát và các media session mà không cần phải sử dụng lớp chuyển đổi/trình kết nối.