ใน ExoPlayer สื่อทุกชิ้นจะแสดงด้วย MediaItem
อย่างไรก็ตาม โปรแกรมเล่นต้องใช้อินสแตนซ์ MediaSource
ในการเล่นเนื้อหา โดยโปรแกรมเล่นจะสร้างรายการเหล่านี้จากรายการสื่อโดยใช้ MediaSource.Factory
โดยค่าเริ่มต้น โปรแกรมเล่นจะใช้ DefaultMediaSourceFactory
ซึ่งสามารถสร้างอินสแตนซ์ของการใช้งาน MediaSource
เนื้อหาต่อไปนี้
DashMediaSource
สำหรับ DASHSsMediaSource
สำหรับ SmoothStreamingHlsMediaSource
สำหรับ HLSProgressiveMediaSource
สำหรับไฟล์สื่อปกติRtspMediaSource
สำหรับ RTSP
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)
ของโรงงานเพื่อสร้างแหล่งที่มาของสื่อสำหรับรายการสื่อแต่ละรายการที่เพิ่มลงในเพลย์ลิสต์
API เพลย์ลิสต์ที่อิงตามแหล่งที่มาของสื่อ
อินเทอร์เฟซ 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
รายการเดียว ซึ่งหมายความว่าเนื้อหาจะมีลักษณะเหมือนรายการเดียว หากการแก้ไขนี้ทำเพื่อเล่นรายการหลายรายการที่ไม่ควรมีลักษณะเหมือนรายการเดียว คุณควรใช้เมธอด playlist API เช่นPlayer.addMediaItem
แทนSilenceMediaSource
: สร้างช่วงไม่มีเสียงตามระยะเวลาที่ระบุ ซึ่งมีประโยชน์ในการเติมช่องว่างAdsMediaSource
: ขยายแหล่งที่มาของสื่อด้วยความสามารถในการแทรกโฆษณาฝั่งไคลเอ็นต์ ดูรายละเอียดได้ในคู่มือการแทรกโฆษณาServerSideAdInsertionMediaSource
: ขยายแหล่งที่มาของสื่อด้วยความสามารถในการแทรกโฆษณาฝั่งเซิร์ฟเวอร์ ดูรายละเอียดได้ในคู่มือการแทรกโฆษณา