รายการสื่อ

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 ได้รับการกำหนดค่าตามนั้นด้วย