Playlist API อิงตามอินสแตนซ์ MediaItem
ซึ่งสร้างได้สะดวกโดยใช้ MediaItem.Builder
MediaSource.Factory
จะแปลง MediaItem
ให้เป็น MediaSource
ที่เล่นได้ภายในโปรแกรมเล่น หากไม่มีการกําหนดค่าที่กําหนดเอง DefaultMediaSourceFactory
จะเป็นผู้ดำเนินการแปลงนี้ ซึ่งสามารถสร้างแหล่งที่มาของสื่อที่ซับซ้อนซึ่งสอดคล้องกับพร็อพเพอร์ตี้ของรายการสื่อ พร็อพเพอร์ตี้บางรายการที่ตั้งค่าในรายการสื่อได้แสดงอยู่ด้านล่าง
รายการสื่อแบบง่าย
รายการสื่อที่มีเพียง URI ของสตรีมสามารถสร้างได้ด้วยfromUri
เมธอดอำนวยความสะดวกต่อไปนี้
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
สำหรับกรณีอื่นๆ ทั้งหมด คุณจะใช้ MediaItem.Builder
ได้ ในตัวอย่างต่อไปนี้ ระบบจะสร้างรายการสื่อที่มีรหัสและข้อมูลเมตาที่แนบมา
Kotlin
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
การแนบข้อมูลเมตามีประโยชน์สำหรับการอัปเดต UI ของแอปเมื่อเพลย์ลิสต์เปลี่ยน
รูปภาพ
การเล่นรูปภาพต้องใช้ระยะเวลาในรายการสื่อเพื่อระบุระยะเวลาที่รูปภาพควรแสดงระหว่างการเล่น ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปภาพเคลื่อนไหวและคลังการโหลดรูปภาพ (เช่น Glide) ได้ที่หน้าคู่มือรูปภาพ
Kotlin
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
นามสกุลไฟล์ที่ไม่ใช่มาตรฐานสำหรับสื่อแบบปรับเปลี่ยน
ExoPlayer มีแหล่งที่มาของสื่อแบบปรับเปลี่ยนได้สำหรับ DASH, HLS และ SmoothStreaming หาก URI ของรายการสื่อแบบปรับเปลี่ยนได้ดังกล่าวลงท้ายด้วยนามสกุลไฟล์มาตรฐาน ระบบจะสร้างแหล่งที่มาของสื่อที่เกี่ยวข้องโดยอัตโนมัติ หาก URI มีส่วนขยายที่ไม่ใช่มาตรฐานหรือไม่มีส่วนขยายเลย คุณสามารถตั้งค่าประเภท MIME อย่างชัดเจนเพื่อระบุประเภทของรายการสื่อได้ ดังนี้
Kotlin
val mediaItem = MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();
สตรีมสื่อแบบโปรเกรสซีฟไม่จำเป็นต้องมีประเภท MIME
เนื้อหาที่ได้รับการคุ้มครอง
สำหรับเนื้อหาที่ได้รับการคุ้มครอง คุณควรตั้งค่าพร็อพเพอร์ตี้ DRM ของรายการสื่อ โดยจำเป็นต้องระบุ UUID แต่พร็อพเพอร์ตี้อื่นๆ ทั้งหมดเป็นตัวเลือก
ตัวอย่างการกําหนดค่าสําหรับการเล่นรายการที่ได้รับการป้องกันด้วย Widevine DRM ซึ่ง URI ของใบอนุญาตไม่อยู่ในสื่อโดยตรง (เช่น ในเพลย์ลิสต์ DASH) และต้องใช้สําเร็จการสนทนาหลายรายการ (เช่น เนื่องจากการหมุนคีย์)
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build()) .build();
ภายในโปรแกรมเล่น DefaultMediaSourceFactory
จะส่งพร็อพเพอร์ตี้เหล่านี้ไปยัง DrmSessionManagerProvider
เพื่อรับ DrmSessionManager
จากนั้นจะแทรก DrmSessionManager
ลงใน MediaSource
ที่สร้างขึ้น คุณปรับแต่งเพิ่มเติมลักษณะการทำงานของ DRM ให้เหมาะกับความต้องการของคุณได้
การไซด์โหลดแทร็กคำบรรยาย
หากต้องการโหลดแทร็กคำบรรยายแทนการอัปโหลด คุณสามารถเพิ่มอินสแตนซ์ MediaItem.Subtitle
ขณะสร้างรายการสื่อได้ ดังนี้
Kotlin
val subtitle = SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build() val mediaItem = MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()
Java
MediaItem.SubtitleConfiguration subtitle = new MediaItem.SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build(); MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setSubtitleConfigurations(ImmutableList.of(subtitle)) .build();
DefaultMediaSourceFactory
จะใช้ MergingMediaSource
เพื่อรวมแหล่งที่มาของสื่อเนื้อหาเข้ากับ SingleSampleMediaSource
สำหรับแทร็กคำบรรยายแต่ละแทร็ก DefaultMediaSourceFactory
ไม่รองรับการโหลดจากอุปกรณ์อื่น
คำบรรยายแทนเสียงสำหรับ DASH แบบหลายช่วงเวลา
การตัดคลิปสตรีมสื่อ
หากต้องการตัดเนื้อหาที่รายการสื่ออ้างอิง ให้ตั้งค่าตำแหน่งเริ่มต้นและสิ้นสุดที่กำหนดเองโดยทำดังนี้
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( new ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build()) .build();
ภายใน DefaultMediaSourceFactory
จะใช้ ClippingMediaSource
เพื่อตัดสิ้นสุดแหล่งที่มาของสื่อเนื้อหา มีพร็อพเพอร์ตี้การครอบตัดเพิ่มเติม ดูรายละเอียดเพิ่มเติมใน MediaItem.Builder
Javadoc
การแทรกโฆษณา
หากต้องการแทรกโฆษณา คุณควรตั้งค่าพร็อพเพอร์ตี้ URI ของแท็กโฆษณาของรายการสื่อ ดังนี้
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
ภายใน DefaultMediaSourceFactory
จะรวมแหล่งที่มาของสื่อเนื้อหาใน
AdsMediaSource
เพื่อแทรกโฆษณาตามที่แท็กโฆษณากำหนด โปรแกรมเล่นยังต้องกําหนดค่า DefaultMediaSourceFactory
ของตนให้สอดคล้องกันด้วยเพื่อให้การแชร์ใช้งานได้