แอปพลิเคชันการสาธิต ExoPlayer

แอปเดโมหลักของ ExoPlayer มีวัตถุประสงค์หลัก 2 ประการ ได้แก่

  1. เพื่อให้ตัวอย่างการใช้งาน ExoPlayer ที่ค่อนข้างเรียบง่ายแต่มีฟีเจอร์ครบถ้วน สามารถใช้แอปเดโมเป็นจุดเริ่มต้นที่สะดวกในการพัฒนา แอปของคุณเองได้
  2. เพื่อให้ทดลองใช้ ExoPlayer ได้ง่ายๆ ใช้แอปเดโมเพื่อทดสอบการเล่นได้ เนื้อหาของคุณนอกเหนือจากตัวอย่างที่รวมอยู่ในการทดสอบ

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

กำลังรับรหัส

คุณสามารถดูซอร์สโค้ดของแอปเดโมหลักได้ในโฟลเดอร์ demos/main ของ โปรเจ็กต์ GitHub ของเรา โคลนโปรเจ็กต์เป็น ไดเรกทอรีในเครื่อง:

git clone https://github.com/androidx/media.git

จากนั้นให้เปิดโปรเจ็กต์ใน Android Studio คุณจะเห็นข้อมูลต่อไปนี้ใน มุมมองโปรเจ็กต์ Android (ขยายโฟลเดอร์ที่เกี่ยวข้องของแอปเดโมแล้ว):

โปรเจ็กต์ใน Android Studio

การคอมไพล์และการเรียกใช้

หากต้องการคอมไพล์และเรียกใช้แอปเดโม ให้เลือกและเรียกใช้การกำหนดค่า demo ใน Android Studio แอปเดโมจะติดตั้งและเรียกใช้ในอุปกรณ์ Android ที่เชื่อมต่ออยู่ เราขอแนะนำให้ใช้อุปกรณ์จริงหากเป็นไปได้ ถ้าต้องการใช้โปรแกรมจำลอง แทน โปรดอ่านส่วนโปรแกรมจำลองในอุปกรณ์ที่รองรับ อุปกรณ์เสมือนใช้อิมเมจระบบที่มีระดับ API อย่างน้อย 23

SampleSelectrActivity และกิจกรรม Player

แอปเดโมจะแสดงรายการตัวอย่าง (SampleChooserActivity) กำลังเลือก ตัวอย่างจะเปิดกิจกรรมที่ 2 (PlayerActivity) สำหรับการเล่น เดโม จะแสดงตัวควบคุมการเล่นและฟังก์ชันการเลือกแทร็ก นอกจากนี้ยังใช้ คลาสยูทิลิตี EventLogger ของ ExoPlayer เพื่อแสดงข้อมูลการแก้ไขข้อบกพร่องที่เป็นประโยชน์ บันทึกของระบบ สามารถดูการบันทึกนี้ได้ (พร้อมด้วยการบันทึกระดับข้อผิดพลาดของ อื่นๆ) ด้วยคำสั่ง:

adb logcat EventLogger:V *:E

การเปิดใช้ตัวถอดรหัสแบบแพ็กเกจ

ExoPlayer มีส่วนขยายจำนวนหนึ่งที่อนุญาตให้ใช้ซอฟต์แวร์ที่รวมอยู่ในแพ็กเกจได้ เช่น AV1, VP9, Opus, FLAC และ FFmpeg (เฉพาะเสียง) แอปเดโม สามารถสร้างขึ้นเพื่อรวมและใช้ส่วนขยายเหล่านี้ได้ดังนี้

  1. สร้างส่วนขยายแต่ละรายการที่คุณต้องการรวมไว้ โปรดทราบว่านี่เป็น ขั้นตอนที่ต้องทำด้วยตนเอง ดูไฟล์ README.md ในแต่ละส่วนขยายสำหรับ วิธีทำ
  2. ในมุมมองบิลด์ตัวแปรของ Android Studio ให้ตั้งค่าตัวแปรบิลด์สำหรับเดโม withDecoderExtensionsDebug หรือ withDecoderExtensionsRelease เป็น ที่แสดงในภาพต่อไปนี้

    การเลือกตัวแปรบิลด์ "withDecoder extensionsDebug" ของเดโม

  3. คอมไพล์ ติดตั้ง และเรียกใช้การกำหนดค่า demo ตามปกติ

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

การเล่นเนื้อหาของคุณเอง

การเล่นเนื้อหาของคุณเองในแอปเดโมมีหลายวิธี

1. การแก้ไข assets/media.exolist.json

ตัวอย่างที่แสดงในแอปเดโมโหลดจาก assets/media.exolist.json การแก้ไขไฟล์ JSON นี้จะทำให้คุณสามารถเพิ่มและนำตัวอย่างออกจากการสาธิต แอป สคีมามีลักษณะดังนี้ โดยที่ [O] ระบุแอตทริบิวต์ที่ไม่บังคับ

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of sample",
        "uri": "The URI of the sample",
        "extension": "[O] Sample type hint. Values: mpd, ism, m3u8",
        "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
        "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
        "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
        "drm_license_uri": "[O] URI of the license server if protected",
        "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
        "drm_key_request_properties": "[O] Key request headers if protected",
        "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks"
        "drm_multi_session": "[O] Enables key rotation if protected",
        "subtitle_uri": "[O] The URI of a subtitle sidecar file",
        "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
        "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)",
        "ad_tag_uri": "[O] The URI of an ad tag to load via the IMA extension"
      },
      ...etc
    ]
  },
  ...etc
]

คุณสามารถระบุเพลย์ลิสต์ของตัวอย่างได้โดยใช้สคีมา

[
  {
    "name": "Name of heading",
    "samples": [
      {
        "name": "Name of playlist sample",
        "playlist": [
          {
            "uri": "The URI of the first sample in the playlist",
            "extension": "[O] Sample type hint. Values: mpd, ism, m3u8"
            "clip_start_position_ms": "[O] A start point to which the sample should be clipped, in milliseconds"
            "clip_end_position_ms": "[O] An end point from which the sample should be clipped, in milliseconds"
            "drm_scheme": "[O] Drm scheme if protected. Values: widevine, playready, clearkey",
            "drm_license_uri": "[O] URI of the license server if protected",
            "drm_force_default_license_uri": "[O] Whether to force use of "drm_license_uri" for key requests that include their own license URI",
            "drm_key_request_properties": "[O] Key request headers if protected",
            "drm_session_for_clear_content": "[O] Whether to attach a DRM session to clear video and audio tracks",
            "drm_multi_session": "[O] Enables key rotation if protected",
            "subtitle_uri": "[O] The URI of a subtitle sidecar file",
            "subtitle_mime_type": "[O] The MIME type of subtitle_uri (required if subtitle_uri is set)",
            "subtitle_language": "[O] The BCP47 language code of the subtitle file (ignored if subtitle_uri is not set)"
          },
          {
            "uri": "The URI of the second sample in the playlist",
            ...etc
          },
          ...etc
        ]
      },
      ...etc
    ]
  },
  ...etc
]

ส่วนหัวของคำขอคีย์จะระบุเป็นออบเจ็กต์ที่มีสตริง หากจำเป็น สำหรับแต่ละส่วนหัว

"drm_key_request_properties": {
  "name1": "value1",
  "name2": "value2",
  ...etc
}

ในกิจกรรมตัวเลือกตัวอย่าง เมนูรายการเพิ่มเติมมีตัวเลือกสำหรับ เพื่อระบุว่าต้องการใช้ตัวถอดรหัสส่วนขยายหรือไม่

URI ไฟล์ในเครื่องและข้อจำกัดของพื้นที่เก็บข้อมูลที่กำหนดขอบเขต

เมื่อระบุ URI ของไฟล์ในเครื่อง แอปเดโมจะขอพื้นที่เก็บข้อมูลที่จำเป็น สิทธิ์การเข้าถึงเพื่ออ่านไฟล์เหล่านี้ แต่จาก Android 13 สามารถโหลดไฟล์ที่กำหนดเองที่ไม่ได้ลงท้ายด้วยไฟล์สื่อทั่วไป ส่วนขยาย (เช่น .mp4) หากคุณจำเป็นต้องโหลดไฟล์ดังกล่าว คุณสามารถวางในไฟล์ ไดเรกทอรีพื้นที่เก็บข้อมูลเฉพาะของแอปเดโมที่ไม่มีข้อจํากัดในการเข้าถึง ช่วงเวลานี้ โดยทั่วไปจะอยู่ที่ /sdcard/Android/data/androidx.media3.demo.main/files

2. กำลังโหลดไฟล์ exolist.json ภายนอก

แอปเดโมสามารถโหลดไฟล์ JSON ภายนอกโดยใช้สคีมาด้านบนและตั้งชื่อแล้ว ตามข้อตกลง *.exolist.json ตัวอย่างเช่น หากคุณโฮสต์ ที่ https://yourdomain.com/samples.exolist.json คุณสามารถเปิดได้ใน แอปเดโมโดยใช้:

adb shell am start -a android.intent.action.VIEW \
    -d https://yourdomain.com/samples.exolist.json

คลิกลิงก์ *.exolist.json (เช่น ในเบราว์เซอร์หรืออีเมล ) ในอุปกรณ์ที่ติดตั้งแอปเดโมแล้ว แอปเดโมจะเปิดขึ้นในเดโมด้วย แอป ดังนั้น การโฮสต์ไฟล์ JSON ของ *.exolist.json จึงมีวิธีง่ายๆ เผยแพร่เนื้อหาให้ผู้อื่นลองใช้ในแอปเดโม

3. การเริ่มทำงาน Intent

คุณสามารถใช้ Intent เพื่อข้ามรายการตัวอย่างและเปิดใช้งานโดยตรงไปยัง การเล่น หากต้องการเล่นตัวอย่างเดียว ให้ตั้งค่าการดำเนินการของ Intent เป็น androidx.media3.demo.main.action.VIEW และ URI ข้อมูลไปยัง URI ของ ตัวอย่างให้เล่น Intent ดังกล่าวสามารถเริ่มทำงานจากเทอร์มินัลได้โดยใช้สิ่งต่อไปนี้

adb shell am start -a androidx.media3.demo.main.action.VIEW \
    -d https://yourdomain.com/sample.mp4

ส่วนเพิ่มเติมที่ไม่บังคับซึ่งรองรับสำหรับ Intent ตัวอย่างรายการเดียวมีดังนี้

  • ตัวอย่างส่วนเพิ่มเติมของการกำหนดค่า
    • mime_type [สตริง] ตัวอย่างคำแนะนำประเภท MIME ตัวอย่างเช่น application/dash+xmlสำหรับเนื้อหา DASH
    • clip_start_position_ms [แบบยาว] จุดเริ่มต้นที่ควรยกตัวอย่าง ตัดเป็นมิลลิวินาที
    • clip_end_position_ms [แบบยาว] จุดสิ้นสุดที่ตัวอย่างควรเป็น ตัดเป็นมิลลิวินาที
    • drm_scheme [สตริง] รูปแบบ DRM หากมีการป้องกัน ค่าที่ถูกต้องคือ widevine playready และ clearkey ระบบยอมรับ UUID ของรูปแบบ DRM ด้วย
    • drm_license_uri [สตริง] URI ของเซิร์ฟเวอร์ใบอนุญาต หากมีการป้องกัน
    • drm_force_default_license_uri [บูลีน] เลือกว่าจะบังคับใช้หรือไม่ drm_license_uri สำหรับคำขอคีย์ที่มี URI ใบอนุญาตของตนเอง
    • drm_key_request_properties [อาร์เรย์สตริง] ส่วนหัวของคำขอคีย์ที่แพ็กเป็น name1, value1, name2, value2 ฯลฯ หากได้รับการป้องกัน
    • drm_session_for_clear_content [บูลีน] เลือกว่าจะแนบเซสชัน DRM หรือไม่ เพื่อล้างแทร็กวิดีโอและแทร็กเสียง
    • drm_multi_session [บูลีน] เปิดใช้การหมุนเวียนคีย์หากมีการป้องกัน
    • subtitle_uri [สตริง] URI ของไฟล์ช่วยเหลือของคำบรรยาย
    • subtitle_mime_type [สตริง] ประเภท MIME ของ subtitle_uri (ต้องระบุหาก ตั้งค่าคำบรรยาย)
    • subtitle_language [สตริง] รหัสภาษา BCP47 ของไฟล์คำบรรยาย (ยกเว้นหากไม่ได้ตั้งค่า title_uri ไว้)
    • ad_tag_uri [สตริง] URI ของแท็กโฆษณาที่จะโหลดโดยใช้ [ส่วนขยาย IMA][]
    • prefer_extension_decoders [บูลีน] ระบุว่าตัวถอดรหัสส่วนขยายเป็น แนะนำให้ใช้กับแพลตฟอร์ม

เมื่อใช้ adb shell am start เพื่อให้ Intent เริ่มทำงาน สตริงเพิ่มเติมที่ไม่บังคับจะทำสิ่งต่อไปนี้ได้ ตั้งค่าด้วย --es (เช่น --es extension mpd) บูลีนเพิ่มเติมที่ไม่บังคับได้ ตั้งค่าด้วย --ez (เช่น --ez prefer_extension_decoders TRUE) ตัวเลือกเพิ่มเติม คุณสามารถตั้งค่าวิดีโอแบบยาวด้วย --el (เช่น --el clip_start_position_ms 5000) CANNOT TRANSLATE ตั้งค่าอาร์เรย์สตริงเพิ่มเติมได้ด้วย --esa (เช่น --esa drm_key_request_properties name1,value1)

หากต้องการเล่นเพลย์ลิสต์ตัวอย่าง ให้ตั้งค่าการดำเนินการของ Intent เป็น androidx.media3.demo.main.action.VIEW_LIST ตัวอย่างการกำหนดค่า ค่าใช้จ่ายเพิ่มเติมยังคงเหมือนเดิมสำหรับ androidx.media3.demo.main.action.VIEW แต่มีข้อแตกต่าง 2 ประการดังนี้

  • ข้อมูลเพิ่มเติม คีย์ควรมีขีดล่างและดัชนีแบบ 0 ของตัวอย่าง เป็นคำต่อท้าย ตัวอย่างเช่น extension_0 จะแนะนำประเภทตัวอย่างสำหรับ ตัวอย่าง drm_scheme_1 จะกำหนดรูปแบบ DRM สำหรับตัวอย่างที่สอง
  • มีการส่ง URI ของตัวอย่างเป็นส่วนเสริมพร้อมกับคีย์ uri_<sample-index>

ส่วนเพิ่มเติมอื่นๆ ที่ไม่ใช่ตัวอย่าง Dependency จะไม่เปลี่ยนแปลง ตัวอย่างเช่น คุณสามารถ สามารถเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อเล่นเพลย์ลิสต์ที่มี 2 รายการ การลบล้างส่วนขยายของรายการที่ 2

adb shell am start -a androidx.media3.demo.main.action.VIEW_LIST \
    --es uri_0 https://a.com/sample1.mp4 \
    --es uri_1 https://b.com/sample2.fake_mpd \
    --es extension_1 mpd