Nguồn nội dung nghe nhìn
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Trong ExoPlayer, mọi nội dung đa phương tiện đều được biểu thị bằng MediaItem
. Tuy nhiên
nội bộ, người chơi cần có thực thể MediaSource
để phát nội dung. Chiến lược phát hành đĩa đơn
trình phát tạo các video này từ các mục nội dung đa phương tiện bằng MediaSource.Factory
.
Theo mặc định, người chơi sử dụng DefaultMediaSourceFactory
có thể tạo
của các cách triển khai MediaSource
nội dung sau:
DefaultMediaSourceFactory
cũng có thể tạo các nguồn đa phương tiện phức tạp hơn, tuỳ thuộc vào
về thuộc tính của các mục nội dung đa phương tiện tương ứng. Điều này được mô tả trong phần
thông tin chi tiết về
Trang mục nội dung đa phương tiện.
Đối với các ứng dụng cần thiết lập nguồn nội dung nghe nhìn không được
cấu hình mặc định của trình phát, sẽ có một số tuỳ chọn cho
phần tuỳ chỉnh.
Khi tạo trình phát, MediaSource.Factory
có thể được chèn vào. Ví dụ:
nếu một ứng dụng muốn chèn quảng cáo và sử dụng CacheDataSource.Factory
để hỗ trợ
lưu vào bộ nhớ đệm, bạn có thể định cấu hình bản sao của DefaultMediaSourceFactory
để khớp
các yêu cầu này và được chèn trong quá trình tạo trình phát:
Kotlin
val mediaSourceFactory: MediaSource.Factory =
DefaultMediaSourceFactory(context)
.setDataSourceFactory(cacheDataSourceFactory)
.setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
Java
MediaSource.Factory mediaSourceFactory =
new DefaultMediaSourceFactory(context)
.setDataSourceFactory(cacheDataSourceFactory)
.setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();
Chiến lược phát hành đĩa đơn
Tài liệu Java DefaultMediaSourceFactory
sẽ mô tả chi tiết hơn về các tuỳ chọn có sẵn.
Bạn cũng có thể chèn một phương thức triển khai MediaSource.Factory
tuỳ chỉnh cho
để hỗ trợ việc tạo loại nguồn nội dung nghe nhìn tuỳ chỉnh. Của nhà máy
createMediaSource(MediaItem)
sẽ được gọi để tạo nguồn nội dung nghe nhìn cho mỗi
mục nội dung đa phương tiện
đã thêm vào danh sách phát.
Giao diện ExoPlayer
xác định các phương thức danh sách phát bổ sung chấp nhận
nguồn nội dung nghe nhìn thay vì mục nội dung nghe nhìn. Điều này giúp bạn có thể bỏ qua
MediaSource.Factory
nội bộ của trình phát và truyền các bản sao nguồn nội dung đa phương tiện đến
trình phát trực tiếp:
Kotlin
// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)
// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))
exoPlayer.prepare()
exoPlayer.play()
Java
// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource);
// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));
exoPlayer.prepare();
exoPlayer.play();
ExoPlayer cung cấp nhiều cách triển khai MediaSource
để sửa đổi và soạn
các thực thể MediaSource
khác. Các chỉ số này hữu ích nhất trong trường hợp có nhiều
phải được kết hợp và không có đường dẫn thiết lập nào đơn giản hơn
là đủ.
ClippingMediaSource
: Cho phép cắt nội dung nghe nhìn theo phạm vi dấu thời gian được chỉ định.
Nếu đây là cách sửa đổi duy nhất, bạn nên sử dụng
MediaItem.ClippingConfiguration
.
FilteringMediaSource
: Lọc các kênh có sẵn theo các loại đã chỉ định, cho
ví dụ: chỉ hiển thị bản nhạc video từ một tệp có chứa cả âm thanh
và video. Nếu đây là cách sửa đổi duy nhất, bạn nên sử dụng
theo dõi các thông số lựa chọn.
MergingMediaSource
: Hợp nhất nhiều nguồn nội dung nghe nhìn để phát song song. Trong
hầu hết mọi trường hợp, bạn nên gọi hàm khởi tạo bằng
adjustPeriodTimeOffsets
và clipDurations
được đặt thành true để đảm bảo tất cả
nguồn bắt đầu và kết thúc cùng một lúc. Nếu bạn thực hiện sửa đổi này để thêm
phụ đề được tải bên cạnh, bạn nên sử dụng
MediaItem.SubtitleConfiguration
.
ConcatenatingMediaSource2
: Hợp nhất nhiều nguồn nội dung nghe nhìn để phát
một cách liên tiếp. Cấu trúc nội dung đa phương tiện mà người dùng thấy được thể hiện một
Timeline.Window
, nghĩa là thành phần này trông giống như một mục duy nhất. Nếu trường hợp này
sửa đổi được thực hiện để phát nhiều mục không được trông giống như
một gói duy nhất, bạn nên sử dụng phương thức API danh sách phát như
Hãy Player.addMediaItem
.
SilenceMediaSource
: Tạo khoảng lặng trong một khoảng thời gian cụ thể
rất hữu ích để bổ sung thông tin còn thiếu.
AdsMediaSource
: Mở rộng nguồn nội dung nghe nhìn bằng tính năng chèn quảng cáo phía máy khách
các chức năng khác nhau. Tham khảo hướng dẫn chèn quảng cáo để biết thông tin chi tiết.
ServerSideAdInsertionMediaSource
: Mở rộng nguồn nội dung nghe nhìn bằng quảng cáo phía máy chủ
khả năng chèn. Tham khảo hướng dẫn chèn quảng cáo để biết thông tin chi tiết.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Media sources\n\nIn ExoPlayer, every piece of media is represented by a `MediaItem`. However\ninternally, the player needs `MediaSource` instances to play the content. The\nplayer creates these from media items using a `MediaSource.Factory`.\n\nBy default the player uses a `DefaultMediaSourceFactory`, which can create\ninstances of the following content `MediaSource` implementations:\n\n- `DashMediaSource` for [DASH](/guide/topics/media/exoplayer/dash).\n- `SsMediaSource` for [SmoothStreaming](/guide/topics/media/exoplayer/smoothstreaming).\n- `HlsMediaSource` for [HLS](/guide/topics/media/exoplayer/hls).\n- `ProgressiveMediaSource` for [regular media files](/guide/topics/media/exoplayer/progressive).\n- `RtspMediaSource` for [RTSP](/guide/topics/media/exoplayer/rtsp).\n\n`DefaultMediaSourceFactory` can also create more complex media sources depending\non the properties of the corresponding media items. This is described in more\ndetail on the\n[Media items page](/guide/topics/media/exoplayer/media-items).\n\nFor apps that need media source setups that are not supported by the\ndefault configuration of the player, there are several options for\ncustomization.\n\nCustomizing media source creation\n---------------------------------\n\nWhen building the player, a `MediaSource.Factory` can be injected. For example,\nif an app wants to insert ads and use a `CacheDataSource.Factory` to support\ncaching, an instance of `DefaultMediaSourceFactory` can be configured to match\nthese requirements and injected during player construction: \n\n### Kotlin\n\n```kotlin\n val mediaSourceFactory: MediaSource.Factory =\n DefaultMediaSourceFactory(context)\n .setDataSourceFactory(cacheDataSourceFactory)\n .setLocalAdInsertionComponents(adsLoaderProvider, playerView)\n val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()\n```\n\n### Java\n\n```java\nMediaSource.Factory mediaSourceFactory =\n new DefaultMediaSourceFactory(context)\n .setDataSourceFactory(cacheDataSourceFactory)\n .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);\nExoPlayer player =\n new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();\n```\n\n\u003cbr /\u003e\n\nThe\n[`DefaultMediaSourceFactory` JavaDoc](/reference/androidx/media3/exoplayer/source/DefaultMediaSourceFactory)\ndescribes the available options in more detail.\n\nIt's also possible to inject a custom `MediaSource.Factory` implementation, for\nexample to support creation of a custom media source type. The factory's\n`createMediaSource(MediaItem)` will be called to create a media source for each\nmedia item that is\n[added to the playlist](/guide/topics/media/exoplayer/playlists).\n\nMedia source based playlist API\n-------------------------------\n\nThe [`ExoPlayer`](/reference/androidx/media3/exoplayer/ExoPlayer) interface defines additional playlist methods that accept\nmedia sources rather than media items. This makes it possible to bypass the\nplayer's internal `MediaSource.Factory` and pass media source instances to the\nplayer directly: \n\n### Kotlin\n\n```kotlin\n// Set a list of media sources as initial playlist.\nexoPlayer.setMediaSources(listOfMediaSources)\n// Add a single media source.\nexoPlayer.addMediaSource(anotherMediaSource)\n\n// Can be combined with the media item API.\nexoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))\n\nexoPlayer.prepare()\nexoPlayer.play()\n```\n\n### Java\n\n```java\n// Set a list of media sources as initial playlist.\nexoPlayer.setMediaSources(listOfMediaSources);\n// Add a single media source.\nexoPlayer.addMediaSource(anotherMediaSource);\n\n// Can be combined with the media item API.\nexoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));\n\nexoPlayer.prepare();\nexoPlayer.play();\n```\n\n\u003cbr /\u003e\n\nAdvanced media source composition\n---------------------------------\n\nExoPlayer provides multiple `MediaSource` implementations to modify and compose\nother `MediaSource` instances. These are most useful in cases where multiple\ncustomizations have to be combined and none of the simpler setup paths are\nsufficient.\n\n- `ClippingMediaSource`: Allows to clip media to a specified timestamp range. If this is the only modification, it's preferable to use [`MediaItem.ClippingConfiguration`](/guide/topics/media/exoplayer/media-items#clipping-media) instead.\n- `FilteringMediaSource`: Filters available tracks to the specified types, for example, just exposing the video track from a file that contains both audio and video. If this is the only modification, it's preferable to use [track selection parameters](/guide/topics/media/exoplayer/track-selection#disabling-track) instead.\n- `MergingMediaSource`: Merges multiple media sources to play in parallel. In almost all cases, it's advisable to call the constructor with `adjustPeriodTimeOffsets` and `clipDurations` set to true to ensure all sources start and end at the same time. If this modification is done to add side-loaded subtitles, it's preferable to use [`MediaItem.SubtitleConfiguration`](/guide/topics/media/exoplayer/media-items#sideloading-subtitle) instead.\n- `ConcatenatingMediaSource2`: Merges multiple media source to play consecutively. The user-visible media structure exposes a single `Timeline.Window`, meaning that it looks like a single item. If this modification is done to play multiple items that are not supposed to look like a single one, it's preferable to use the [playlist API](/guide/topics/media/exoplayer/playlists) methods like `Player.addMediaItem` instead.\n- `SilenceMediaSource`: Generates silence for a specified duration that is useful to fill gaps.\n- `AdsMediaSource`: Extends a media source with client-side ad insertion capabilities. Refer to the [ad insertion guide](/guide/topics/media/exoplayer/ad-insertion) for details.\n- `ServerSideAdInsertionMediaSource`: Extends a media source with server-side ad insertion capabilities. Refer to the [ad insertion guide](/guide/topics/media/exoplayer/ad-insertion) for details."]]