Playlist API อิงตามMediaItemอินสแตนซ์ ซึ่งสร้างได้อย่างสะดวกโดยใช้ MediaItem.Builder ภายในเพลเยอร์ MediaItem จะแปลงเป็น MediaSource ที่เล่นได้โดย MediaSource.Factory หากไม่มีการกำหนดค่าที่กำหนดเอง
DefaultMediaSourceFactory จะเป็นผู้ดำเนินการ Conversion นี้ ซึ่งสามารถสร้างแหล่งที่มาของสื่อที่ซับซ้อนซึ่งสอดคล้องกับพร็อพเพอร์ตี้ของ
รายการสื่อ คุณสมบัติบางอย่างที่ตั้งค่าในรายการสื่อได้มีระบุไว้
ด้านล่าง
รายการสื่อแบบง่าย
สร้างรายการสื่อที่มีเฉพาะ 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 ของแอป เมื่อมีการเปลี่ยนเพลย์ลิสต์
รูปภาพ
การเล่นรูปภาพต้องมีระยะเวลาในรายการสื่อเพื่อระบุระยะเวลาที่ควรแสดงรูปภาพระหว่างการเล่น ดูข้อมูลเพิ่มเติมเกี่ยวกับ Motion Photos และ ไลบรารีการโหลดรูปภาพ (เช่น 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 ที่สร้างขึ้น คุณสามารถปรับแต่งเพิ่มเติม
ตามความต้องการได้
การไซด์โหลดแทร็กคำบรรยาย
หากต้องการโหลดแทร็กคำบรรยายแทนเสียงจากภายนอก คุณจะเพิ่มอินสแตนซ์ MediaItem.Subtitle ได้เมื่อสร้างรายการสื่อโดยทำดังนี้
Kotlin
val subtitle = 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() 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()) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
ภายใน DefaultMediaSourceFactory จะรวมแหล่งที่มาของสื่อเนื้อหาไว้ใน
AdsMediaSource เพื่อแทรกโฆษณาตามที่กำหนดไว้ในแท็กโฆษณา ทั้งนี้ โปรแกรมเล่นจะต้องDefaultMediaSourceFactory
ได้รับการกำหนดค่าตามนั้นด้วย