Media3 1.9.0 đã ra mắt! Bên cạnh các bản sửa lỗi và cải thiện hiệu suất thông thường, bản phát hành mới nhất còn có bốn mô-đun mới hoặc được viết lại phần lớn:
media3-inspector– Trích xuất siêu dữ liệu và khung hình bên ngoài quá trình phátmedia3-ui-compose-material3– Xây dựng giao diện người dùng đa phương tiện cơ bản bằng Material3 Compose chỉ trong vài bướcmedia3-cast– Tự động xử lý quá trình chuyển đổi giữa chế độ phát trên thiết bị truyền và chế độ phát trên thiết bị cục bộmedia3-decoder-av1– Phát AV1 nhất quán với bộ giải mã tiện ích được viết lại dựa trên thư viện dav1d
Chúng tôi cũng đã thêm các điểm cải tiến về việc lưu vào bộ nhớ đệm và quản lý bộ nhớ vào PreloadManager, đồng thời cung cấp một số đơn giản hoá mới cho ExoPlayer, Transformer và MediaSession.
Bản phát hành này cũng mang đến cho bạn quyền truy cập thử nghiệm đầu tiên vào CompositionPlayer để xem trước nội dung chỉnh sửa nội dung nghe nhìn.
Hãy đọc tiếp để tìm hiểu thêm và đừng quên xem toàn bộ ghi chú phát hành để biết thông tin tổng quan đầy đủ về những thay đổi trong bản phát hành này.
Trích xuất siêu dữ liệu và khung hình bên ngoài quá trình phát
Có nhiều trường hợp bạn muốn kiểm tra nội dung nghe nhìn mà không cần bắt đầu phát. Ví dụ: bạn có thể muốn phát hiện định dạng của tệp hoặc thời lượng của tệp, hoặc truy xuất hình thu nhỏ.
Mô-đun media3-inspector mới kết hợp tất cả các tiện ích để kiểm tra nội dung nghe nhìn mà không cần phát ở một nơi:
MetadataRetrieverđể đọc thời lượng, định dạng và siêu dữ liệu tĩnh từMediaItem.FrameExtractorđể lấy khung hình hoặc hình thu nhỏ từ một mục.MediaExtractorCompatđể thay thế trực tiếp cho lớp MediaExtractor của nền tảng Android, nhằm lấy thông tin chi tiết về các mẫu trong tệp.
MetadataRetriever và FrameExtractor tuân theo một mẫu AutoCloseable đơn giản. Hãy xem các trang hướng dẫn mới của chúng tôi để biết thêm thông tin.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}Xây dựng giao diện người dùng cơ bản cho nội dung nghe nhìn bằng Material3 Compose chỉ sau vài bước
Trong các bản phát hành trước, chúng tôi đã bắt đầu cung cấp mã trình kết nối giữa các phần tử trên giao diện người dùng Compose và thực thể Player của bạn. Trong Media3 1.9.0, chúng tôi đã thêm một mô-đun mới là media3-ui-compose-material3 với các nút và thành phần nội dung Material3 được tạo kiểu đầy đủ. Các thành phần này cho phép bạn xây dựng giao diện người dùng đa phương tiện chỉ trong vài bước, đồng thời cung cấp mọi tính linh hoạt để tuỳ chỉnh kiểu. Nếu muốn tự tạo kiểu giao diện người dùng, bạn có thể sử dụng các khối dựng đảm nhận tất cả logic cập nhật và kết nối, nhờ đó bạn chỉ cần tập trung vào việc thiết kế phần tử trên giao diện người dùng. Vui lòng xem các trang hướng dẫn mở rộng của chúng tôi về các mô-đun Giao diện người dùng Compose.
Chúng tôi cũng đang tiếp tục phát triển thêm nhiều thành phần Compose, chẳng hạn như thanh tua tạo sẵn, một giải pháp thay thế hoàn chỉnh cho PlayerView, cũng như tích hợp phụ đề và quảng cáo.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
Giao diện người dùng đơn giản của trình phát Compose với các thành phần có sẵn
Tự động xử lý quá trình chuyển đổi giữa chế độ phát trên thiết bị truyền và chế độ phát trên thiết bị cục bộ
CastPlayer trong mô-đun media3-cast đã được viết lại để tự động xử lý quá trình chuyển đổi giữa chế độ phát trên thiết bị (ví dụ: bằng ExoPlayer) và chế độ phát từ xa qua Cast.
Khi thiết lập MediaSession, bạn chỉ cần tạo một CastPlayer xung quanh ExoPlayer và thêm MediaRouteButton vào giao diện người dùng là xong!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
Tích hợp CastPlayer mới trong ứng dụng minh hoạ phiên Media3
Phát AV1 nhất quán với tiện ích được viết lại dựa trên dav1d
Bản phát hành 1.9.0 chứa một mô-đun tiện ích AV1 được viết lại hoàn toàn dựa trên thư viện dav1d phổ biến.
Giống như tất cả các mô-đun bộ giải mã tiện ích, xin lưu ý rằng bạn cần xây dựng từ nguồn để gói mã gốc có liên quan một cách chính xác. Việc đóng gói bộ giải mã mang lại tính nhất quán và hỗ trợ định dạng trên tất cả thiết bị, nhưng vì bộ giải mã chạy quá trình giải mã trong quy trình của bạn, nên bộ giải mã này phù hợp nhất với nội dung mà bạn có thể tin tưởng.
Tích hợp tính năng lưu vào bộ nhớ đệm và quản lý bộ nhớ vào PreloadManager
Chúng tôi cũng cải tiến PreloadManager. Tính năng này đã cho phép bạn tải trước nội dung nghe nhìn vào bộ nhớ bên ngoài quá trình phát, sau đó chuyển nội dung đó sang trình phát một cách liền mạch khi cần. Mặc dù có hiệu suất khá tốt, nhưng bạn vẫn phải cẩn thận để không vượt quá giới hạn bộ nhớ do vô tình tải trước quá nhiều. Vì vậy, trong Media3 1.9.0, chúng tôi đã thêm hai tính năng giúp việc này trở nên dễ dàng và ổn định hơn nhiều:
- Hỗ trợ lưu vào bộ nhớ đệm – Khi xác định phạm vi tải trước, giờ đây, bạn có thể chọn
PreloadStatus.specifiedRangeCached(0, 5000)làm trạng thái mục tiêu cho các mục được tải trước. Thao tác này sẽ thêm dải ô đã chỉ định vào bộ nhớ đệm trên ổ đĩa thay vì tải dữ liệu vào bộ nhớ. Nhờ đó, bạn có thể cung cấp nhiều mục hơn để tải trước vì những mục ở xa mục hiện tại không cần chiếm bộ nhớ nữa. Xin lưu ý rằng bạn cần phải đặtCachetrongDefaultPreloadManager.Builder. - Quản lý bộ nhớ tự động – Chúng tôi cũng đã cập nhật giao diện
LoadControlđể xử lý tốt hơn trường hợp tải trước, nhờ đó, bạn hiện có thể đặt giới hạn bộ nhớ trên rõ ràng cho tất cả các mục được tải trước trong bộ nhớ. Giá trị mặc định là 144 MB và bạn có thể định cấu hình giới hạn trongDefaultLoadControl.Builder.DefaultPreloadManagersẽ tự động ngừng tải trước khi đạt đến giới hạn và tự động giải phóng bộ nhớ của các mục có mức độ ưu tiên thấp hơn nếu cần.
Dựa vào các hành vi mặc định mới, đơn giản hoá trong ExoPlayer
Như thường lệ, chúng tôi cũng đã thêm nhiều điểm cải tiến gia tăng cho ExoPlayer. Sau đây là một vài ví dụ:
- Tắt tiếng và bật tiếng – Chúng tôi đã có phương thức
setVolume, nhưng hiện đã thêm các phương thức tiện lợimutevàunmuteđể dễ dàng khôi phục âm lượng trước đó mà không cần tự theo dõi. - Phát hiện trình phát bị kẹt – Trong một số ít trường hợp, trình phát có thể bị kẹt ở trạng thái lưu vào vùng đệm hoặc phát mà không có tiến trình nào, chẳng hạn như do vấn đề về bộ mã hoá và giải mã hoặc cấu hình sai. Người dùng sẽ cảm thấy khó chịu, nhưng bạn không bao giờ thấy những vấn đề này trong số liệu phân tích của mình! Để làm rõ hơn, trình phát hiện báo cáo
StuckPlayerExceptionkhi phát hiện trạng thái bị kẹt. - Khoá chế độ thức theo mặc định – Trước đây, tính năng quản lý khoá chế độ thức là tính năng chọn sử dụng, dẫn đến việc khó tìm thấy các trường hợp hiếm gặp mà tiến trình phát có thể bị trì hoãn nhiều khi chạy ở chế độ nền. Giờ đây, tính năng này là chọn không tham gia, vì vậy, bạn không cần phải lo lắng về tính năng này và cũng có thể xoá tất cả các thao tác xử lý khoá chế độ thức thủ công xung quanh quá trình phát.
- Chế độ cài đặt đơn giản cho logic của nút phụ đề – Việc thay đổi
TrackSelectionParametersđể nói "bật/tắt phụ đề" khó thực hiện một cách chính xác đến bất ngờ, vì vậy, chúng tôi đã thêm một tuỳ chọn boolean đơn giảnselectTextByDefaultcho trường hợp sử dụng này.
Đơn giản hoá lựa chọn ưu tiên về nút nội dung nghe nhìn trong MediaSession
Cho đến nay, để xác định lựa chọn ưu tiên về những nút sẽ xuất hiện trong ngăn thông báo nội dung nghe nhìn trên Android Auto hoặc WearOS, bạn cần xác định các lệnh và nút tuỳ chỉnh, ngay cả khi bạn chỉ muốn kích hoạt một phương thức trình phát tiêu chuẩn.
Media3 1.9.0 có chức năng mới giúp việc này trở nên đơn giản hơn nhiều – giờ đây, bạn có thể xác định lựa chọn ưu tiên về nút nội dung nghe nhìn bằng một lệnh trình phát chuẩn mà không cần xử lý lệnh tuỳ chỉnh.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
Lựa chọn ưu tiên về nút nội dung nghe nhìn có nút tua đi
CompositionPlayer để xem trước theo thời gian thực
Bản phát hành 1.9.0 ra mắt CompositionPlayer theo chú thích @ExperimentalApi mới. Chú thích này cho biết rằng API này có thể dùng để thử nghiệm nhưng vẫn đang trong quá trình phát triển.
CompositionPlayer là một thành phần mới trong API chỉnh sửa Media3, được thiết kế để xem trước nội dung chỉnh sửa nội dung nghe nhìn theo thời gian thực. Được xây dựng dựa trên giao diện Media3 Player quen thuộc, CompositionPlayer cho phép người dùng xem các thay đổi của họ trong thực tế trước khi thực hiện quy trình xuất. Hàm này sử dụng cùng một đối tượng Composition mà bạn sẽ truyền đến Transformer để xuất, giúp đơn giản hoá quy trình chỉnh sửa bằng cách hợp nhất mô hình dữ liệu cho bản xem trước và xuất.
Bạn nên bắt đầu sử dụng CompositionPlayer và chia sẻ ý kiến phản hồi, đồng thời theo dõi các bài đăng và thông tin cập nhật sắp tới trong tài liệu để biết thêm thông tin chi tiết.
InAppMuxer làm bộ ghép kênh mặc định trong Transformer
Transformer hiện sử dụng InAppMp4Muxer làm bộ ghép kênh mặc định để ghi tệp vùng chứa nội dung nghe nhìn. Trong nội bộ, InAppMp4Muxer phụ thuộc vào mô-đun Muxer của Media3, mang lại hành vi nhất quán trên tất cả các phiên bản API.
Xin lưu ý rằng mặc dù Transformer không còn sử dụng MediaMuxer của nền tảng Android theo mặc định, nhưng bạn vẫn có thể cung cấp FrameworkMuxer.Factory thông qua setMuxerFactory nếu trường hợp sử dụng của bạn yêu cầu.
API điều chỉnh tốc độ mới
Bản phát hành 1.9.0 đơn giản hoá các API điều chỉnh tốc độ để chỉnh sửa nội dung nghe nhìn. Chúng tôi đã ra mắt các phương thức mới ngay trên EditedMediaItem.Builder để kiểm soát tốc độ, giúp API trở nên trực quan hơn. Giờ đây, bạn có thể thay đổi tốc độ của một đoạn video bằng cách gọi setSpeed(SpeedProvider provider) trên EditedMediaItem.Builder:
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()Phương pháp mới này thay thế phương pháp sử dụng Effects#createExperimentalSpeedChangingEffects() trước đây. Chúng tôi đã ngừng sử dụng phương pháp cũ và sẽ xoá phương pháp này trong một bản phát hành sau này.
Giới thiệu các loại kênh cho EditedMediaItemSequence
Trong bản phát hành 1.9.0, EditedMediaItemSequence yêu cầu chỉ định các loại bản nhạc đầu ra mong muốn trong quá trình tạo trình tự. Thay đổi này đảm bảo việc xử lý bản nhạc rõ ràng và hiệu quả hơn trong toàn bộ Thành phần.
Bạn có thể thực hiện việc này thông qua một hàm khởi tạo EditedMediaItemSequence.Builder mới chấp nhận một tập hợp các loại bản nhạc (ví dụ: C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
Để đơn giản hoá việc tạo, chúng tôi đã thêm các phương thức tĩnh mới tiện lợi:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- <EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)>
Bạn nên chuyển sang hàm khởi tạo mới hoặc các phương thức tiện lợi để có định nghĩa trình tự rõ ràng và đáng tin cậy hơn.
Ví dụ về cách tạo trình tự chỉ có video:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()Vui lòng liên hệ qua Trình theo dõi sự cố của Media3 nếu bạn gặp lỗi hoặc nếu bạn có câu hỏi hoặc yêu cầu về tính năng. Chúng tôi rất mong nhận được ý kiến của bạn!
-
Tin tức về sản phẩmTrong kỷ nguyên trí tuệ nhân tạo, người dùng không còn chỉ thao tác trên các ứng dụng mà còn thể hiện những mục tiêu cấp cao và mong đợi các tác nhân AI như Gemini hoàn thành các quy trình làm việc nhiều bước, đôi khi trên nhiều ứng dụng trên thiết bị của họ.
Jingyu Shi • Thời gian đọc: 4 phút -
Tin tức về sản phẩmHôm nay, tại Hội nghị Nhà phát triển Android, chúng tôi xin thông báo về việc cung cấp rộng rãi nhiều công cụ và API được thiết kế để loại bỏ những trở ngại hằng ngày và giúp bạn linh hoạt hơn trong việc xây dựng các ứng dụng Android tuyệt vời.
Matthew McCullough • Thời gian đọc: 4 phút -
Tin tức về sản phẩmAndroid Studio Rabbit 2 hiện đã ổn định và sẵn sàng để bạn sử dụng trong môi trường thực tế. Bản phát hành này bao gồm các tính năng chính giúp cải thiện quá trình phát triển của bạn, chẳng hạn như Bring Your Own Agent (Sử dụng tác nhân của riêng bạn), các tính năng mới của Trình mô phỏng XR, bản cập nhật LeakCanary, công cụ quản lý kỹ năng mới của tác nhân, tính năng xem xét mã bằng AI và nhiều tính năng khác.
Matthew Warner • Đọc trong 3 phút
Nhận thông tin chi tiết mới nhất về hoạt động phát triển Android trong hộp thư đến của bạn hằng tuần.