Trình phát là thành phần của ứng dụng giúp phát các mục nội dung nghe nhìn.
Giao diện Player
của Media3 thiết lập một dàn ý cho chức năng thường do trình phát xử lý. Điều này bao gồm:
- Ảnh hưởng đến các nút điều khiển chế độ phát, chẳng hạn như phát, tạm dừng và tua
- Truy vấn các thuộc tính của nội dung nghe nhìn đang phát, chẳng hạn như vị trí phát
- Quản lý danh sách phát/hàng đợi các mục nội dung nghe nhìn
- Định cấu hình các thuộc tính phát, chẳng hạn như trộn bài, lặp lại, tốc độ và âm lượng
- Kết xuất video ra màn hình
Media3 cũng cung cấp một cách triển khai giao diện Player
, được gọi là ExoPlayer
.
Giao diện chung giữa các thành phần
Một số thành phần trong Media3 triển khai giao diện Player, ví dụ:
Thành phần | Nội dung mô tả và ghi chú về hành vi |
---|---|
ExoPlayer |
Một API trình phát nội dung nghe nhìn và chế độ triển khai mặc định của giao diện Player . |
MediaController |
Tương tác với MediaSession để gửi lệnh phát. Nếu Player và MediaSession của bạn nằm trong Service tách biệt với Activity hoặc Fragment nơi giao diện người dùng của trình phát tồn tại, bạn có thể chỉ định MediaController làm trình phát cho giao diện người dùng PlayerView . Các lệnh gọi phương thức phát và danh sách phát được gửi đến Player thông qua MediaSession .
|
MediaBrowser |
Ngoài chức năng do MediaController cung cấp, còn tương tác với MediaLibrarySession để duyệt xem nội dung nghe nhìn có sẵn.
|
SimpleBasePlayer |
Một phương thức triển khai Player giúp giảm số lượng phương thức cần triển khai xuống mức tối thiểu. Hữu ích khi sử dụng một trình phát tuỳ chỉnh mà bạn muốn kết nối với một MediaSession .
|
ForwardingSimpleBasePlayer |
Một lớp con SimpleBasePlayer được thiết kế để chuyển tiếp các thao tác phát đến một Player khác trong khi cho phép các tuỳ chỉnh hành vi nhất quán tương tự như SimpleBasePlayer . Sử dụng lớp này để ngăn chặn hoặc sửa đổi các thao tác phát cụ thể.
|
CastPlayer |
Một hoạt động triển khai Player giao tiếp với ứng dụng nhận Cast. Hành vi phụ thuộc vào phiên Cast cơ bản.
|
Mặc dù MediaSession
không triển khai giao diện Player
, nhưng bạn cần có Player
khi tạo một giao diện. Mục đích của nó là cung cấp quyền truy cập vào Player
từ các quy trình hoặc luồng khác.
Cấu trúc phát của Media3
Nếu có quyền truy cập vào Player
, bạn nên gọi trực tiếp các phương thức của Player
để đưa ra các lệnh phát. Bạn có thể quảng cáo nội dung phát và cấp quyền kiểm soát nội dung phát cho các nguồn bên ngoài bằng cách triển khai một MediaSession
. Các nguồn bên ngoài này triển khai một MediaController
, giúp kết nối với một phiên phát nội dung đa phương tiện và đưa ra các yêu cầu về lệnh phát.
Khi phát nội dung nghe nhìn ở chế độ nền, bạn cần lưu trữ phiên nội dung nghe nhìn và trình phát trong MediaSessionService
hoặc MediaLibraryService
chạy dưới dạng dịch vụ ở nền trước. Nếu làm như vậy, bạn có thể tách trình phát khỏi Hoạt động trong ứng dụng có chứa giao diện người dùng để điều khiển chế độ phát. Bạn có thể cần dùng một trình điều khiển nội dung nghe nhìn.

Player
đóng vai trò quan trọng trong cấu trúc của Media3.Trạng thái của trình phát
Trạng thái của một trình phát nội dung nghe nhìn triển khai giao diện Player
chủ yếu bao gồm 4 danh mục thông tin:
- Trạng thái phát
- Truy xuất bằng
getPlaybackState()
. - Giá trị trạng thái do giao diện xác định là
STATE_IDLE
,STATE_BUFFERING
,STATE_READY
vàSTATE_ENDED
.
- Truy xuất bằng
- Danh sách phát gồm các mục nội dung nghe nhìn
- Một chuỗi gồm các thực thể
MediaItem
để phát. - Truy xuất bằng
getCurrentTimeline()
- Các thực thể
Player
có thể cung cấp các phương thức thao tác với danh sách phát như thêm hoặc xoá mộtMediaItem
và các phương thức tiện lợi nhưgetCurrentMediaItem()
.
- Một chuỗi gồm các thực thể
- Các thuộc tính phát/tạm dừng, chẳng hạn như:
playWhenReady
: Cho biết người dùng muốn phát nội dung nghe nhìn khi có thể hoặc vẫn tạm dừng- Lý do chặn phát: Thông tin cho biết lý do chặn phát (nếu có), ngay cả khi
playWhenReady
làtrue
isPlaying
: Cho biết liệu trình phát hiện có đang phát hay không, chỉ cótrue
nếu trạng thái phát làSTATE_READY
,playWhenReady
làtrue
và chế độ phát không bị chặn
- Vị trí phát, bao gồm:
- Chỉ mục mục nội dung nghe nhìn hiện tại: Chỉ mục của
MediaItem
hiện tại trong danh sách phát. isPlayingAd
: Cho biết liệu quảng cáo được chèn có đang phát hay không.- Vị trí phát hiện tại: Vị trí phát hiện tại trong
MediaItem
hiện tại hoặc quảng cáo được chèn.
- Chỉ mục mục nội dung nghe nhìn hiện tại: Chỉ mục của
Ngoài ra, giao diện Player
cho phép truy cập vào các bản nhạc có sẵn, siêu dữ liệu nội dung nghe nhìn, tốc độ phát, âm lượng và các thuộc tính phụ trợ khác của quá trình phát.
Lắng nghe các thay đổi
Dùng Player.Listener
để theo dõi các thay đổi trong Player
. Hãy xem tài liệu về ExoPlayer trong phần Sự kiện của trình phát để biết thông tin chi tiết về cách tạo và sử dụng trình nghe.
Xin lưu ý rằng giao diện trình nghe không có bất kỳ lệnh gọi lại nào để theo dõi tiến trình phát thông thường. Để liên tục theo dõi tiến trình phát (chẳng hạn như để thiết lập giao diện người dùng thanh tiến trình), bạn nên truy vấn vị trí hiện tại theo các khoảng thời gian thích hợp.
Kotlin
val handler = Handler(Looper.getMainLooper()) fun checkPlaybackPosition(delayMs: Long): Boolean = handler.postDelayed( { val currentPosition = player.currentPosition // Update UI based on currentPosition checkPlaybackPosition(delayMs) }, delayMs)
Java
Handler handler = new Handler(Looper.getMainLooper()); boolean checkPlaybackPosition(long delayMs) { return handler.postDelayed(() -> { long currentPosition = player.getCurrentPosition(); // Update UI based on currentPosition checkPlaybackPosition(delayMs); }, delayMs); }
Điều khiển tính năng phát
Giao diện Player
cung cấp nhiều cách để thao tác với trạng thái và kiểm soát việc phát:
- Các nút điều khiển chế độ phát cơ bản như
play()
,pause()
,prepare()
vàstop()
. - Thao tác với danh sách phát như
addMediaItem()
hoặcremoveMediaItem()
. - Tìm kiếm để thay đổi mục hoặc vị trí hiện tại.
- Đặt chế độ lặp lại và chế độ trộn bài.
- Cập nhật lựa chọn ưu tiên về phụ đề và âm thanh.
- Đặt tốc độ phát.
Triển khai Player
tuỳ chỉnh
Để tạo một trình phát tuỳ chỉnh, bạn có thể mở rộng SimpleBasePlayer
có trong Media3. Lớp này cung cấp một phương thức triển khai cơ bản của giao diện Player
để giảm số lượng phương thức bạn cần triển khai xuống mức tối thiểu.
Bắt đầu bằng cách ghi đè phương thức getState()
. Phương thức này sẽ điền sẵn trạng thái hiện tại của trình phát khi được gọi, bao gồm:
- Tập hợp các lệnh có sẵn
- Các thuộc tính phát, chẳng hạn như liệu trình phát có nên bắt đầu phát khi trạng thái phát là
STATE_READY
, chỉ mục của mục nội dung nghe nhìn đang phát và vị trí phát trong mục hiện tại hay không
Kotlin
class CustomPlayer : SimpleBasePlayer(looper) { override fun getState(): State { return State.Builder() .setAvailableCommands(...) // Set which playback commands the player can handle // Configure additional playback properties .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST) .setCurrentMediaItemIndex(0) .setContentPositionMs(0) .build() } }
Java
public class CustomPlayer extends SimpleBasePlayer { public CustomPlayer(Looper looper) { super(looper); } @Override protected State getState() { return new State.Builder() .setAvailableCommands(...) // Set which playback commands the player can handle // Configure additional playback properties .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST) .setCurrentMediaItemIndex(0) .setContentPositionMs(0) .build(); } }
SimpleBasePlayer
sẽ thực thi rằng State
được tạo bằng một tổ hợp giá trị trạng thái hợp lệ. Nó cũng sẽ xử lý các trình nghe và thông báo cho trình nghe về các thay đổi trạng thái. Nếu bạn cần kích hoạt bản cập nhật trạng thái theo cách thủ công, hãy gọi invalidateState()
.
Ngoài phương thức getState()
, bạn chỉ cần triển khai các phương thức được dùng cho những lệnh mà trình phát của bạn khai báo là có sẵn. Tìm phương thức trình xử lý có thể ghi đè tương ứng với chức năng mà bạn muốn triển khai. Ví dụ: ghi đè phương thức handleSeek()
để hỗ trợ các thao tác như COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM
và COMMAND_SEEK_TO_NEXT_MEDIA_ITEM
.
Sửa đổi chế độ triển khai Player
Thay vì tạo một Player
hoàn toàn tuỳ chỉnh, bạn có thể sử dụng ForwardingSimpleBasePlayer
để sửa đổi trạng thái và hành vi của một Player
hiện có. Hãy xem hướng dẫn trên trang Tuỳ chỉnh để biết thêm thông tin chi tiết.