แหล่งที่มาของสื่อ
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
สื่อทุกชิ้นใน ExoPlayer จะแสดงด้วย MediaItem
อย่างไรก็ตาม
เป็นการภายใน โปรแกรมเล่นต้องใช้ MediaSource
อินสแตนซ์เพื่อเล่นเนื้อหา
โปรแกรมเล่นจะสร้างรายการเหล่านี้จากรายการสื่อโดยใช้ MediaSource.Factory
โดยค่าเริ่มต้น โปรแกรมเล่นวิดีโอจะใช้ DefaultMediaSourceFactory
ซึ่งสามารถสร้าง
อินสแตนซ์ของการใช้เนื้อหา MediaSource
ต่อไปนี้
นอกจากนี้ DefaultMediaSourceFactory
ยังอาจสร้างแหล่งที่มาของสื่อที่ซับซ้อนมากขึ้นได้
เกี่ยวกับคุณสมบัติของรายการสื่อที่เกี่ยวข้อง ซึ่งได้อธิบายไว้ใน
รายละเอียดเกี่ยวกับ
หน้ารายการสื่อ
สำหรับแอปที่ต้องการการตั้งค่าแหล่งที่มาของสื่อซึ่งโปรแกรมไม่รองรับ
การกำหนดค่าเริ่มต้นของโปรแกรมเล่น
มีหลายตัวเลือกสำหรับ
การปรับแต่งได้มากขึ้น
เมื่อสร้างโปรแกรมเล่น คุณจะแทรก MediaSource.Factory
ได้ ตัวอย่างเช่น
หากแอปต้องการแทรกโฆษณาและใช้ CacheDataSource.Factory
เพื่อรองรับ
การแคช อินสแตนซ์ของ DefaultMediaSourceFactory
สามารถกำหนดค่าให้ตรงกับ
และได้ใส่ข้อกำหนดเหล่านี้ระหว่างการสร้างโปรแกรมเล่น
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();
DefaultMediaSourceFactory
JavaDoc
จะอธิบายตัวเลือกที่มีอย่างละเอียดยิ่งขึ้น
นอกจากนี้ยังแทรกการใช้งาน MediaSource.Factory
ที่กำหนดเองสำหรับ
ตัวอย่างเพื่อสนับสนุนการสร้างประเภทแหล่งที่มาของสื่อที่กำหนดเอง จากโรงงาน
ระบบจะเรียก createMediaSource(MediaItem)
ให้สร้างแหล่งที่มาของสื่อสำหรับ
รายการสื่อที่
เพิ่มลงในเพลย์ลิสต์
อินเทอร์เฟซ ExoPlayer
กำหนดเมธอดเพลย์ลิสต์เพิ่มเติมที่ยอมรับ
แหล่งที่มาของสื่อ แทนที่จะเป็นรายการสื่อ จึงสามารถข้าม
MediaSource.Factory
ภายในของโปรแกรมเล่น และส่งอินสแตนซ์แหล่งที่มาของสื่อไปยัง
โปรแกรมเล่นโดยตรง:
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 มาพร้อมการใช้งาน MediaSource
มากมายในการแก้ไขและเขียนข้อความ
อินสแตนซ์อื่นๆ ของ MediaSource
วิธีนี้มีประโยชน์มากที่สุดในกรณีที่
การกำหนดค่าเองต้องรวมเข้าด้วยกัน และไม่มีเส้นทางการตั้งค่าที่ง่ายกว่านี้
เพียงพอ
ClippingMediaSource
: อนุญาตให้ตัดคลิปสื่อไปยังช่วงการประทับเวลาที่ระบุ
หากนี่เป็นการแก้ไขเพียงอย่างเดียว คุณควรใช้
MediaItem.ClippingConfiguration
แทน
FilteringMediaSource
: กรองแทร็กที่พร้อมใช้งานตามประเภทที่ระบุ สำหรับ
ตัวอย่างเช่น การแสดงแทร็กวิดีโอจากไฟล์ที่มีทั้งเสียง
และวิดีโอ หากนี่เป็นการแก้ไขเพียงอย่างเดียว คุณควรใช้
พารามิเตอร์การเลือกแทร็กแทน
MergingMediaSource
: รวมสื่อหลายๆ แหล่งเพื่อเล่นพร้อมกัน ใน
ในเกือบทุกกรณี ขอแนะนำให้เรียกใช้ตัวสร้างด้วย
ตั้งค่า adjustPeriodTimeOffsets
และ clipDurations
เป็น "จริง" เพื่อให้แน่ใจว่าทั้งหมด
แหล่งข้อมูลเริ่มต้นและสิ้นสุดในเวลาเดียวกัน หากแก้ไขเพื่อเพิ่ม
คำบรรยายจากไซด์โหลด แนะนำให้ใช้
MediaItem.SubtitleConfiguration
แทน
ConcatenatingMediaSource2
: รวมแหล่งที่มาของสื่อหลายแห่งเพื่อเล่น
ติดต่อกัน โครงสร้างสื่อที่ผู้ใช้มองเห็นได้เผยให้เห็น
Timeline.Window
ซึ่งหมายความว่าจะมีลักษณะเหมือนรายการเดียว หากสิ่งนี้
การแก้ไขนั้นเกิดขึ้นเพื่อเล่นหลายรายการที่ไม่ควรมีลักษณะเหมือน
รายการเดียว คุณควรใช้เมธอด API สำหรับเพลย์ลิสต์ เช่น
Player.addMediaItem
แทน
SilenceMediaSource
: สร้างการปิดเสียงตามระยะเวลาที่ระบุซึ่ง
มีประโยชน์ในการเติมเต็มช่องว่าง
AdsMediaSource
: ขยายแหล่งที่มาของสื่อด้วยการแทรกโฆษณาฝั่งไคลเอ็นต์
ความสามารถ ดูรายละเอียดได้ในคู่มือการแทรกโฆษณา
ServerSideAdInsertionMediaSource
: ขยายแหล่งที่มาของสื่อด้วยโฆษณาฝั่งเซิร์ฟเวอร์
ความสามารถในการแทรก ดูรายละเอียดได้ในคู่มือการแทรกโฆษณา
ตัวอย่างเนื้อหาและโค้ดในหน้าเว็บนี้ขึ้นอยู่กับใบอนุญาตที่อธิบายไว้ในใบอนุญาตการใช้เนื้อหา Java และ OpenJDK เป็นเครื่องหมายการค้าหรือเครื่องหมายการค้าจดทะเบียนของ Oracle และ/หรือบริษัทในเครือ
อัปเดตล่าสุด 2025-07-27 UTC
[[["เข้าใจง่าย","easyToUnderstand","thumb-up"],["แก้ปัญหาของฉันได้","solvedMyProblem","thumb-up"],["อื่นๆ","otherUp","thumb-up"]],[["ไม่มีข้อมูลที่ฉันต้องการ","missingTheInformationINeed","thumb-down"],["ซับซ้อนเกินไป/มีหลายขั้นตอนมากเกินไป","tooComplicatedTooManySteps","thumb-down"],["ล้าสมัย","outOfDate","thumb-down"],["ปัญหาเกี่ยวกับการแปล","translationIssue","thumb-down"],["ตัวอย่าง/ปัญหาเกี่ยวกับโค้ด","samplesCodeIssue","thumb-down"],["อื่นๆ","otherDown","thumb-down"]],["อัปเดตล่าสุด 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."]]