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ý. Chức năng 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, 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 Trình phát, ví dụ:
| Thành phần | Mô tả và ghi chú về hành vi |
|---|---|
ExoPlayer |
Một API trình phát nội dung nghe nhìn và cách triển khai mặc định của giao diện Player. |
MediaController |
Tương tác với MediaSession để gửi các lệnh phát. Nếu
Player và MediaSession nằm trong một
Service riêng 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 thành phần giao diện người dùng
như PlayerView hoặc Player
Composable. 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, tương tác với
MediaLibrarySession để duyệt qua nội dung nghe nhìn có sẵn.
|
SimpleBasePlayer |
Một cách 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 trình phát tuỳ chỉnh mà bạn
muốn kết nối với 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, đồng thời cho phép tuỳ chỉnh hành vi nhất quán giống như SimpleBasePlayer. Sử dụng
lớp này để chặn hoặc sửa đổi các thao tác phát cụ thể.
|
RemoteCastPlayer |
Một cách triển khai Player để điều khiển chế độ phát trên ứng dụng nhận Cast từ xa.
|
CastPlayer |
Một cách triển khai Player để điều khiển cả chế độ phát Cast cục bộ và từ xa.
|
Mặc dù MediaSession không triển khai giao diện Player, nhưng giao diện này yêu cầu Player khi tạo một giao diện. Mục đích của giao diện này là cung cấp quyền truy cập vào Player từ các tiến 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 trình phát để đưa ra các lệnh phát. Bạn có thể quảng cáo chế độ phát và cấp quyền kiểm soát chế độ phát cho các nguồn bên ngoài bằng cách triển khai MediaSession. Các nguồn bên ngoài này triển khai MediaController, giúp kết nối với phiên phát nội dung nghe nhìn và đưa ra các yêu cầu lệnh phát.
Khi phát nội dung nghe nhìn trong nền, bạn cần lưu trữ phiên phát 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ụ trên 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. Điều này có thể đòi hỏi bạn phải sử 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 trình phát
Trạng thái của 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 các mục nội dung nghe nhìn
- Một chuỗi các thực thể
MediaItemđể phát. - Truy xuất bằng
getCurrentTimeline() - Các thực thể
Playercó thể cung cấp các phương thức thao tác danh sách phát như thêm hoặc xoá mộtMediaItemvà các phương thức tiện lợi nhưgetCurrentMediaItem().
- Một chuỗi 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 liệu người dùng có muốn phát nội dung nghe nhìn khi có thể hay vẫn tạm dừng- Lý do chặn chế độ phát:
Cho biết lý do chặn chế độ phát (nếu có), ngay cả khi
playWhenReadylàtrue isPlaying: Cho biết liệu trình phát có đang phát hay không. Giá trị này sẽ chỉ làtruenếu trạng thái phát làSTATE_READY,playWhenReadylàtruevà 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
MediaItemhiệ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
MediaItemhiệ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 chế độ phát.
Theo dõi các thay đổi
Sử dụng Player.Listener
để theo dõi các thay đổi trong Player. Xem tài liệu ExoPlayer về
Sự kiện 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 bao gồm bất kỳ lệnh gọi lại nào để theo dõi tiến trình phát bình 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
fun checkPlaybackPosition(delayMs: Long): Boolean = handler.postDelayed( { val currentPosition = player.currentPosition // Update UI based on currentPosition checkPlaybackPosition(delayMs) }, delayMs, )
Java
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à điều khiển chế độ phát:
- Các nút điều khiển chế độ phát cơ bản
như
play(),pause(),prepare()vàstop(). - Các thao tác 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ế độ phát ngẫu nhiên.
- Cập nhật lựa chọn ưu tiên về bản nhạc.
- Đặt tốc độ phát .
Cách triển khai Player tuỳ chỉnh
Để tạo 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 cách triển khai cơ sở 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 trạng thái trình phát hiện tại 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
Kotlin
class CustomPlayer(looper: Looper) : SimpleBasePlayer(looper) { override fun getState(): State { return State.Builder() .setAvailableCommands(Commands.EMPTY) // 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
private static final class CustomPlayer extends SimpleBasePlayer { public CustomPlayer(Looper looper) { super(looper); } @Override protected State getState() { return new State.Builder() .setAvailableCommands(Commands.EMPTY) // 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 việc tạo State bằng một tổ hợp giá trị trạng thái hợp lệ. Lớp này cũng sẽ xử lý trình nghe và thông báo cho trình nghe về các thay đổi trạng thái. Nếu cần kích hoạt quy trình 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 các lệnh mà trình phát 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 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 cá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
Player hiện có. Xem hướng dẫn trên trang Tuỳ chỉnh để
biết thêm thông tin.