Phần này giải thích cách phân tách ứng dụng trình phát nội dung đa phương tiện thành một trình điều khiển nội dung đa phương tiện (đối với giao diện người dùng) và một phiên phát nội dung đa phương tiện (đối với trình phát thực tế). Tệp này mô tả 2 cấu trúc ứng dụng đa phương tiện: thiết kế ứng dụng/máy chủ phù hợp với các ứng dụng âm thanh và thiết kế một hoạt động cho trình phát video. Tài liệu này cũng cho biết cách làm cho các ứng dụng đa phương tiện phản hồi các chức năng điều khiển phần cứng và hợp tác với các ứng dụng khác dùng luồng đầu ra âm thanh.
Trình phát và giao diện người dùng
Một ứng dụng đa phương tiện phát âm thanh hoặc video thường có hai phần:
- Trình phát nhận nội dung nghe nhìn kỹ thuật số và kết xuất dưới dạng video và/hoặc âm thanh
- Giao diện người dùng có các nút điều khiển phương tiện di chuyển để chạy trình phát và cho thấy trạng thái của người chơi (không bắt buộc)
Trên Android, bạn có thể tạo trình phát của riêng mình từ đầu hoặc có thể chọn một trong các tuỳ chọn sau:
- Lớp MediaPlayer cung cấp chức năng cơ bản cho một trình phát khung hình cơ bản hỗ trợ các nguồn dữ liệu và định dạng âm thanh/video phổ biến nhất.
- ExoPlayer là thư viện nguồn mở được xây dựng dựa trên các thành phần khung phương tiện cấp thấp hơn như
MediaCodec
vàAudioTrack
. ExoPlayer hỗ trợ các tính năng hiệu suất cao như DASH không có trongMediaPlayer
. Bạn có thể tuỳ chỉnh mã ExoPlayer, giúp dễ dàng thêm các thành phần mới. Bạn chỉ có thể sử dụng ExoPlayer với Android phiên bản 4.1 trở lên.
Phiên phát nội dung đa phương tiện và trình điều khiển nội dung nghe nhìn
Mặc dù các API cho giao diện người dùng và trình phát có thể là tuỳ ý, nhưng bản chất của hoạt động tương tác giữa hai phần là giống nhau đối với tất cả các ứng dụng trình phát nội dung đa phương tiện. Khung Android xác định 2 lớp là phiên phát nội dung đa phương tiện và trình điều khiển nội dung đa phương tiện để áp dụng cấu trúc được xác định rõ ràng để tạo ứng dụng trình phát nội dung đa phương tiện.
Phiên nội dung đa phương tiện và trình điều khiển nội dung nghe nhìn giao tiếp với nhau bằng cách sử dụng các lệnh gọi lại được xác định trước tương ứng với các thao tác chuẩn của trình phát (phát, tạm dừng, dừng, v.v.), cũng như các lệnh gọi tuỳ chỉnh có thể mở rộng mà bạn dùng để xác định các hành vi đặc biệt dành riêng cho ứng dụng của mình.
Phiên phát nội dung đa phương tiện
Phiên phát nội dung đa phương tiện chịu trách nhiệm cho mọi hoạt động giao tiếp với trình phát. Thao tác này sẽ ẩn API của người chơi khỏi phần còn lại của ứng dụng. Trình phát chỉ được gọi từ phiên phát nội dung đa phương tiện điều khiển trình phát đó.
Phiên này duy trì trạng thái của người chơi (đã phát/tạm dừng) và thông tin về nội dung đang phát. Một phiên có thể nhận lệnh gọi lại từ một hoặc nhiều trình điều khiển nội dung nghe nhìn. Nhờ đó, người chơi có thể điều khiển giao diện người dùng của ứng dụng cũng như các thiết bị đồng hành chạy Wear OS và Android Auto. Logic phản hồi lệnh g��i lại phải nhất quán. Phản hồi cho lệnh gọi lại MediaSession
phải giống nhau bất kể ứng dụng nào khởi tạo lệnh gọi lại.
Trình điều khiển nội dung nghe nhìn
Trình điều khiển nội dung đa phương tiện tách biệt giao diện người dùng của bạn. Mã giao diện người dùng của bạn chỉ giao tiếp với trình điều khiển nội dung đa phương tiện chứ không giao tiếp với chính trình phát. Trình điều khiển nội dung đa phương tiện chuyển các hành động điều khiển truyền tải thành lệnh gọi lại sang phiên phát nội dung đa phương tiện. Phương thức này cũng nhận lệnh gọi lại từ phiên phát nội dung đa phương tiện bất cứ khi nào trạng thái phiên thay đổi. Việc này cung cấp cơ chế tự động cập nhật giao diện người dùng được liên kết. Mỗi trình điều khiển nội dung đa phương tiện chỉ có thể kết nối với một phiên phát nội dung đa phương tiện.
Khi sử dụng trình điều khiển nội dung đa phương tiện và phiên phát nội dung đa phương tiện, bạn có thể triển khai nhiều giao diện và/hoặc trình phát trong thời gian chạy. Bạn có thể thay đổi giao diện và/hoặc hiệu suất của ứng dụng một cách độc lập, tuỳ thuộc vào các chức năng của thiết bị mà ứng dụng đang chạy.
Ứng dụng video so với ứng dụng âm thanh
Khi phát video, mắt và tai của bạn đều hướng đến nhau. Khi phát âm thanh, bạn đang nghe nhưng cũng có thể làm việc với một ứng dụng khác cùng lúc. Mỗi trường hợp sử dụng lại có thiết kế riêng.
Ứng dụng video
Ứng dụng video cần có một cửa sổ để xem nội dung. Vì lý do này, ứng dụng video thường được triển khai dưới dạng một hoạt động trên Android. Màn hình mà video xuất hiện là một phần của hoạt động.
Ứng dụng âm thanh
Trình phát âm thanh không phải lúc nào cũng hiển thị giao diện người dùng. Sau khi bắt đầu phát âm thanh, trình phát có thể chạy dưới dạng một tác vụ trong nền. Người dùng có thể chuyển sang một ứng dụng khác và làm việc trong khi tiếp tục nghe.
Để triển khai thiết kế này trong Android, bạn có thể tạo ứng dụng âm thanh bằng cách sử dụng hai thành phần: một hoạt động cho giao diện người dùng và một dịch vụ cho người chơi. Nếu người dùng chuyển sang một ứng dụng khác, dịch vụ đó có thể chạy trong nền. Bằng cách phân tích 2 phần của một ứng dụng âm thanh thành các thành phần riêng biệt, mỗi thành phần có thể tự chạy một cách hiệu quả hơn. Giao diện người dùng thường chỉ tồn tại trong thời gian ngắn so với người chơi. Người chơi có thể chạy trong một thời gian dài mà không có giao diện người dùng.
Thư viện hỗ trợ cung cấp 2 lớp để triển khai phương pháp ứng dụng/máy chủ này: MediaBrowserService
và MediaBrowser
. Thành phần dịch vụ được triển khai dưới dạng một lớp con của MediaBrowserService
chứa phiên phát nội dung đa phương tiện và trình phát của phiên đó. Hoạt động với giao diện người dùng và trình điều khiển nội dung đa phương tiện phải bao gồm MediaBrowser
để giao tiếp với MediaBrowserService
.
Việc sử dụng MediaBrowserService
giúp các thiết bị đồng hành (như Android Auto và Wear) dễ dàng khám phá ứng dụng, kết nối với ứng dụng, duyệt xem nội dung và điều khiển chế độ phát mà không cần truy cập vào hoạt động trên giao diện người dùng của ứng dụng. Trên thực tế, có thể có nhiều ứng dụng được kết nối cùng lúc với cùng một MediaBrowserService
, mỗi ứng dụng có MediaController
riêng. Ứng dụng cung cấp MediaBrowserService
phải có thể xử lý đồng thời nhiều kết nối.
Ứng dụng đa phương tiện và cơ sở hạ tầng âm thanh Android
Một ứng dụng đa phương tiện được thiết kế hợp lý phải "kết hợp tốt" với các ứng dụng khác phát âm thanh. Điện thoại phải được chuẩn bị để chia sẻ điện thoại và hợp tác với các ứng dụng khác có sử dụng âm thanh trên thiết bị của bạn. Thao tác này cũng sẽ phản hồi các chức năng điều khiển phần cứng trên thiết bị.
Tất cả hành vi này được mô tả trong phần Điều khiển đầu ra âm thanh.
Thư viện Media-Compat
Thư viện media-compat chứa các lớp hữu ích để xây dựng ứng dụng phát âm thanh và video. Các lớp này tương thích với thiết bị chạy Android 2.3 (API cấp 9) trở lên. Chúng cũng kết hợp với các tính năng khác của Android để tạo ra một trải nghiệm Android quen thuộc, thoải mái.
Bạn nên triển khai các phiên phát nội dung nghe nhìn và trình điều khiển nội dung nghe nhìn bằng các lớp MediaSessionCompat
và MediaControllerCompat
, được xác định trong thư viện hỗ trợ media-compat. Chúng thay thế các phiên bản trước đó của các lớp MediaSession
và MediaController
đã ra mắt trong Android 5.0 (API cấp 21). Các lớp tương thích cung cấp chức năng tương tự nhưng giúp bạn phát triển ứng dụng dễ dàng hơn vì bạn chỉ cần ghi vào một API. Thư viện này xử lý khả năng tương thích ngược bằng cách dịch các phương thức phiên phát nội dung đa phương tiện sang các phương thức tương đương trên các phiên bản nền tảng cũ (nếu có).
Nếu đã có một ứng dụng hoạt động đang sử dụng các lớp cũ, bạn nên cập nhật lên các lớp tương thích. Khi sử dụng các phiên bản khả năng tương thích, bạn có thể xoá tất cả lệnh gọi đến registerMediaButtonReceiver()
và mọi phương thức từ RemoteControlClient
.
Đo lường hiệu suất
Trong Android 8.0 (API cấp 26) trở lên, phương thức getMetrics()
có sẵn cho một số lớp nội dung nghe nhìn. Phương thức này trả về một đối tượng PersistableBundle
chứa thông tin về cấu hình và hiệu suất, được biểu thị dưới dạng bản đồ các thuộc tính và giá trị.
Phương thức getMetrics()
được xác định cho các lớp nội dung đa phương tiện sau:
MediaPlayer.getMetrics()
MediaRecorder.getMetrics()
MediaCodec.getMetrics()
MediaExtractor.getMetrics()
Các chỉ số được thu thập riêng biệt cho từng thực thể và duy trì trong suốt thời gian hoạt động của thực thể. Nếu không có chỉ số, phương thức sẽ trả về giá trị rỗng. Các chỉ số thực tế được trả về sẽ phụ thuộc vào lớp.