รายการสื่อ

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 ของตนให้สอดคล้องกันด้วยเพื่อให้การแชร์ใช้งานได้