ExoPlayer hỗ trợ DASH với nhiều định dạng vùng chứa. Luồng nội dung nghe nhìn phải
tách biệt, nghĩa là video, âm thanh và văn bản phải được xác định riêng biệt
Các phần tử AdaptationSet
trong tệp kê khai DASH (CEA-608 là một trường hợp ngoại lệ vì
được mô tả trong bảng dưới đây). Các định dạng mẫu âm thanh và video có trong đó phải
cũng được hỗ trợ (xem
định dạng mẫu để biết thông tin chi tiết).
Tính năng | Có thể làm | Bình luận |
---|---|---|
Vùng chứa | ||
FMP4 | CÓ | Chỉ những sự kiện phát trực tiếp chưa được phát trực tiếp |
WebM | CÓ | Chỉ những sự kiện phát trực tiếp chưa được phát trực tiếp |
Matroska | CÓ | Chỉ những sự kiện phát trực tiếp chưa được phát trực tiếp |
MPEG-TS | KHÔNG | Chưa lên kế hoạch hỗ trợ |
Phụ đề | ||
TTML | CÓ | Thô hoặc nhúng trong FMP4 theo tiêu chuẩn ISO/IEC 14496-30 |
WebVTT | CÓ | Thô hoặc nhúng trong FMP4 theo tiêu chuẩn ISO/IEC 14496-30 |
CEA-608 | CÓ | Được nhúng trong FMP4 khi được báo hiệu bằng bộ mô tả Hỗ trợ tiếp cận theo chuẩn SCTE |
CEA-708 | CÓ | Được nhúng trong FMP4 khi được báo hiệu bằng bộ mô tả Hỗ trợ tiếp cận theo chuẩn SCTE |
Siêu dữ liệu | ||
Siêu dữ liệu EMSG | CÓ | Được nhúng trong FMP4 |
Bảo vệ nội dung | ||
Widevine | CÓ | "cenc" lược đồ: API 19 trở lên; "cbcs" lược đồ: API 25 trở lên |
PlaySẵn sàng SL2000 | CÓ | Android TV, "cenc" chỉ lược đồ |
Phím Xóa | CÓ | API 21+, "cenc" chỉ lược đồ |
Phát trực tiếp | ||
Phát trực tiếp thường xuyên | CÓ | |
Phát trực tiếp CMAF độ trễ thấp nhất | 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 |
Sử dụng MediaItem
Để phát một luồng DASH, bạn cần phụ thuộc vào mô-đun DASH.
Kotlin
implementation("androidx.media3:media3-exoplayer-dash:1.4.0")
Groovy
implementation "androidx.media3:media3-exoplayer-dash:1.4.0"
Sau đó, bạn có thể tạo MediaItem
cho URI MPD DASH và truyền đế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 của bạn không kết thúc bằng .mpd
, bạn có thể chuyển MimeTypes.APPLICATION_MPD
vào setMimeType
của MediaItem.Builder
để chỉ ra rõ loại của
nội dung.
ExoPlayer sẽ tự động điều chỉnh giữa các cách biểu diễn được xác định trong tệp kê khai, xem xét cả băng thông có sẵn và khả năng của thiết bị.
Sử dụng DashMediaSource
Để có thêm lựa chọn tuỳ chỉnh, bạn có thể tạo một DashMediaSource
rồi truyền vào đó
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ề tới DashManifest
. Chiến lược phát hành đĩa đơn
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. Việc này chỉ xảy ra một lần đối với nội dung theo yêu cầu và
nhiều lần đối với nội dung phát trực tiếp. Đoạn mã sau đây cho thấy cách một ứng dụng
có thể làm 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, @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 chế độ 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 của ứng dụng. Xem trang Tuỳ chỉnh để biết các ví dụ.