DASH

ExoPlayer รองรับ DASH ด้วยรูปแบบคอนเทนเนอร์หลายรูปแบบ สตรีมสื่อต้องเป็น demuxed ซึ่งหมายความว่าวิดีโอ เสียง และข้อความต้องได้รับการกำหนดแยกกัน องค์ประกอบ AdaptationSet ในไฟล์ Manifest ของ DASH (CEA-608 เป็นข้อยกเว้นเช่นเดียวกับ ดังที่อธิบายไว้ในตารางด้านล่าง) รูปแบบเสียงและวิดีโอตัวอย่างที่มีอยู่ต้อง (โปรดดู รูปแบบตัวอย่างเพื่อดูรายละเอียด)

ฟีเจอร์ รองรับ ความคิดเห็น
คอนเทนเนอร์
FMP4 ใช่ สตรีมที่ถอดรหัสเท่านั้น
WebM ใช่ สตรีมที่ถอดรหัสเท่านั้น
มาโทรสกา ใช่ สตรีมที่ถอดรหัสเท่านั้น
MPEG-TS ไม่ ไม่ได้วางแผนการสนับสนุน
คำบรรยายแทนเสียง/คำบรรยาย
TTML ใช่ ไฟล์ข้อมูล RAW หรือฝังอยู่ใน FMP4 ตามมาตรฐาน ISO/IEC 14496-30
WebVTT ใช่ ไฟล์ข้อมูล RAW หรือฝังอยู่ใน FMP4 ตามมาตรฐาน ISO/IEC 14496-30
CEA-608 ใช่ ฝังอยู่ใน FMP4 เมื่อมีสัญญาณโดยใช้ข้อบ่งชี้การช่วยเหลือพิเศษ SCTE
CEA-708 ใช่ ฝังอยู่ใน FMP4 เมื่อมีสัญญาณโดยใช้ข้อบ่งชี้การช่วยเหลือพิเศษ SCTE
ข้อมูลเมตา
ข้อมูลเมตา EMSG ใช่ ฝังอยู่ใน FMP4
การปกป้องเนื้อหา
Widevine ใช่ "cenc" สคีม: API 19+; "ลูกบาศก์" สคีม: API 25+
PlayReady SL2000 ใช่ Android TV, "cenc" สคีมเท่านั้น
คีย์เคลียร์คีย์ ใช่ API 21 ขึ้นไป, "cenc" สคีมเท่านั้น
การเล่นแบบสด
การเล่นแบบสดปกติ ใช่
การเล่นแบบสดของ CMAF ที่มีเวลาในการตอบสนองต่ำมาก ใช่
ข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD) ใช่ คู่มือการผสานรวม

การใช้ MediaItem

หากต้องการเล่นสตรีม DASH คุณต้องใช้โมดูล DASH

Kotlin

implementation("androidx.media3:media3-exoplayer-dash:1.4.0")

ดึงดูด

implementation "androidx.media3:media3-exoplayer-dash:1.4.0"

จากนั้นให้สร้าง MediaItem สำหรับ DASH MPD URI และส่งไปยังโปรแกรมเล่น

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri));
// Prepare the player.
player.prepare();

หาก URI ไม่ได้ลงท้ายด้วย .mpd คุณส่ง MimeTypes.APPLICATION_MPD ได้ เป็น setMimeType จาก MediaItem.Builder เพื่อระบุประเภทของฟิลด์ เนื้อหา

ExoPlayer จะปรับตามตัวแทนที่กำหนดไว้ใน ไฟล์ Manifest โดยพิจารณาจากทั้งความสามารถของแบนด์วิดท์และของอุปกรณ์ที่มีอยู่

การใช้ DashMediaSource

หากต้องการตัวเลือกการปรับแต่งเพิ่มเติม คุณสามารถสร้าง DashMediaSource และส่งต่อ ไปยังโปรแกรมเล่นโดยตรง แทนที่จะเป็น MediaItem

Kotlin

val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a dash media source pointing to a dash manifest uri.
val mediaSource: MediaSource =
  DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri))
// Create a player instance which gets an adaptive track selector by default.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a dash media source pointing to a dash manifest uri.
MediaSource mediaSource =
    new DashMediaSource.Factory(dataSourceFactory)
        .createMediaSource(MediaItem.fromUri(dashUri));
// Create a player instance which gets an adaptive track selector by default.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

การเข้าถึงไฟล์ Manifest

คุณสามารถเรียกไฟล์ Manifest ปัจจุบันโดยเรียก Player.getCurrentManifest สำหรับ DASH คุณควรแคสต์ออบเจ็กต์ที่แสดงผลไปยัง DashManifest จะมีการเรียก Callback onTimelineChanged ของ Player.Listener เมื่อใดก็ตามที่ ระบบจะโหลดไฟล์ Manifest การดำเนินการนี้จะเกิดขึ้นครั้งเดียวสำหรับเนื้อหาแบบออนดีมานด์ และ อาจหลายต่อหลายครั้งสำหรับเนื้อหาสด ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีที่แอป ทำอะไรบางอย่างได้ทุกครั้งที่ไฟล์ Manifest โหลดขึ้นมา

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is DashManifest) {
        // Do something with the manifest.
      }
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          DashManifest dashManifest = (DashManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

การปรับแต่งการเล่น

ExoPlayer มอบวิธีที่หลากหลายเพื่อให้คุณได้ปรับแต่งประสบการณ์การเล่นให้ตรงกับ ความต้องการของแอปได้ ดูตัวอย่างในหน้าการปรับแต่ง