ExoPlayer hỗ trợ DASH với nhiều định dạng vùng chứa. Các luồng nội dung nghe nhìn phải được tách kênh, nghĩa là video, âm thanh và văn bản phải được xác định trong các phần tử AdaptationSet riêng biệt trong tệp kê khai DASH (CEA-608 là một trường hợp ngoại lệ như mô tả trong bảng bên dưới). Các định dạng mẫu âm thanh và video có trong đó cũng phải
được hỗ trợ (xem phần
định dạng mẫu để biết thông tin chi tiết).
| Tính năng | Được hỗ trợ | Bình luận |
|---|---|---|
| Vùng chứa | ||
| FMP4 | CÓ | Chỉ các luồng đã tách kênh |
| WebM | CÓ | Chỉ các luồng đã tách kênh |
| Matroska | CÓ | Chỉ các luồng đã tách kênh |
| MPEG-TS | KHÔNG | Không có kế hoạch hỗ trợ |
| Phụ đề / phụ đề | ||
| TTML | CÓ | Thô hoặc được nhúng trong FMP4 theo ISO/IEC 14496-30 |
| WebVTT | CÓ | Thô hoặc được nhúng trong FMP4 theo ISO/IEC 14496-30 |
| CEA-608 | CÓ | Được nhúng trong FMP4 khi được báo hiệu bằng cách sử dụng các mô tả về khả năng tiếp cận SCTE |
| CEA-708 | CÓ | Được nhúng trong FMP4 khi được báo hiệu bằng cách sử dụng các mô tả về khả năng tiếp cận SCTE |
| Siêu dữ liệu | ||
| Siêu dữ liệu EMSG | CÓ | Được nhúng trong FMP4 |
| Biện pháp bảo vệ nội dung | ||
| Widevine | CÓ | Lược đồ "cenc": API 19 trở lên; lược đồ "cbcs": API 25 trở lên |
| PlayReady SL2000 | CÓ | Android TV, chỉ lược đồ "cenc" |
| ClearKey | CÓ | API 21 trở lên, chỉ lược đồ "cenc" |
| Chèn quảng cáo | ||
| Phát nhiều dấu chấm | CÓ | |
| Chèn quảng cáo do máy chủ hướng dẫn (xlinks) | KHÔNG | |
| Quảng cáo phía máy chủ và phía máy khách IMA | CÓ | Hướng dẫn chèn quảng cáo |
| Phát trực tiếp | ||
| Phát trực tiếp thông thường | CÓ | |
| Phát trực tiếp CMAF có độ trễ cực thấp | CÓ | |
| Dữ liệu ứng dụng nội dung nghe nhìn phổ biến (CMCD) | CÓ | Hướng dẫn tích hợp CMCD |
Sử dụng MediaItem
Để phát luồng DASH, bạn cần phụ thuộc vào mô-đun DASH.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.10.0")
Groovy
implementation "androidx.media3:media3-exoplayer-dash:1.10.0"
Sau đó, bạn có thể tạo MediaItem cho URI MPD DASH và truyền URI đó đến trình phát.
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)) // Prepare the player. player.prepare()
Java
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(dashUri)); // Prepare the player. player.prepare();
Nếu URI không kết thúc bằng .mpd, bạn có thể truyền MimeTypes.APPLICATION_MPD đến setMimeType của MediaItem.Builder để chỉ định rõ ràng loại nội dung.
ExoPlayer sẽ tự động điều chỉnh giữa các biểu diễn được xác định trong tệp kê khai, có tính đến cả băng thông hiện có và khả năng của thiết bị.
Sử dụng DashMediaSource
Để có thêm các lựa chọn tuỳ chỉnh, bạn có thể tạo DashMediaSource và truyền trực tiếp đến trình phát thay vì MediaItem.
Kotlin
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() // Create a dash media source pointing to a dash manifest uri. val mediaSource: MediaSource = DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri)) // Create a player instance which gets an adaptive track selector by default. val player = ExoPlayer.Builder(context).build() // Set the media source to be played. player.setMediaSource(mediaSource) // Prepare the player. player.prepare()
Java
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a dash media source pointing to a dash manifest uri. MediaSource mediaSource = new DashMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(dashUri)); // Create a player instance which gets an adaptive track selector by default. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. player.prepare();
Truy cập vào tệp kê khai
Bạn có thể truy xuất tệp kê khai hiện tại bằng cách gọi Player.getCurrentManifest.
Đối với DASH, bạn nên truyền đối tượng được trả về đến DashManifest. Lệnh gọi lại onTimelineChanged của Player.Listener cũng được gọi bất cứ khi nào tệp kê khai được tải. Điều này sẽ xảy ra một lần đối với nội dung theo yêu cầu và có thể nhiều lần đối với nội dung trực tiếp. Đoạn mã sau đây cho biết cách một ứng dụng có thể thực hiện một việc gì đó bất cứ khi nào tệp kê khai được tải.
Kotlin
player.addListener( object : Player.Listener { override fun onTimelineChanged( timeline: Timeline, @Player.TimelineChangeReason reason: Int, ) { val manifest = player.currentManifest if (manifest is DashManifest) { // Do something with the manifest. } } } )
Java
player.addListener( new Player.Listener() { @Override public void onTimelineChanged( Timeline timeline, @Player.TimelineChangeReason int reason) { Object manifest = player.getCurrentManifest(); if (manifest != null) { DashManifest dashManifest = (DashManifest) manifest; // Do something with the manifest. } } });
Tuỳ chỉnh quá trình phát
ExoPlayer cung cấp nhiều cách để bạn điều chỉnh trải nghiệm phát cho phù hợp với nhu cầu của ứng dụng. Hãy xem trang Tuỳ chỉnh để biết các ví dụ.