ใน 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)ของ Factory เพื่อสร้างแหล่งที่มาของสื่อสำหรับ
รายการสื่อแต่ละรายการที่เพิ่มลงในเพลย์ลิสต์
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: ขยายแหล่งที่มาของสื่อด้วยความสามารถในการแทรกโฆษณาฝั่งเซิร์ฟเวอร์ ดูรายละเอียดได้ในคำแนะนำในการแทรกโฆษณา