แหล่งที่มาของสื่อ

ใน 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) ของโรงงานเพื่อสร้างแหล่งที่มาของสื่อสำหรับรายการสื่อแต่ละรายการที่เพิ่มลงในเพลย์ลิสต์

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