แอปเดโมหลักของ ExoPlayer มีวัตถุประสงค์หลัก 2 ประการ ได้แก่
- เพื่อให้ตัวอย่างการใช้งาน ExoPlayer ที่ค่อนข้างง่ายแต่มีฟีเจอร์ครบถ้วน คุณสามารถใช้แอปเดโมเป็นจุดเริ่มต้นที่สะดวกในการพัฒนา แอปของคุณเอง
- เพื่อให้ลองใช้ ExoPlayer ได้ง่าย คุณใช้แอปเดโมเพื่อทดสอบการเล่น เนื้อหาของคุณเองนอกเหนือจากตัวอย่างที่รวมไว้ได้
หน้านี้จะอธิบายวิธีรับ คอมไพล์ และเรียกใช้แอปเดโม รวมถึงวิธีใช้แอปเพื่อเล่นสื่อของคุณเอง
การรับรหัส
ซอร์สโค้ดสำหรับแอปเดโมหลักอยู่ในโฟลเดอร์ demos/main ของโปรเจ็กต์ GitHub หากยังไม่ได้ดำเนินการ ให้โคลนโปรเจ็กต์ลงในไดเรกทอรีในเครื่องโดยทำดังนี้
git clone https://github.com/androidx/media.git
จากนั้นเปิดโปรเจ็กต์ใน Android Studio คุณควรเห็นสิ่งต่อไปนี้ใน มุมมองโปรเจ็กต์ Android (โฟลเดอร์ที่เกี่ยวข้องของแอปเดโมได้รับการขยายแล้ว)

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

แอปสาธิตจะแสดงรายการตัวอย่าง (SampleChooserActivity) การเลือกตัวอย่างจะเปิดกิจกรรมที่ 2 (PlayerActivity) เพื่อเล่น โดยเดโม
มีฟีเจอร์ตัวควบคุมการเล่นและฟังก์ชันการเลือกแทร็ก นอกจากนี้ยังใช้EventLoggerคลาสยูทิลิตีของ ExoPlayer เพื่อแสดงข้อมูลการแก้ไขข้อบกพร่องที่เป็นประโยชน์ใน
บันทึกของระบบ คุณดูการบันทึกนี้ (พร้อมกับการบันทึกระดับข้อผิดพลาดสำหรับแท็กอื่นๆ) ได้ด้วยคำสั่งต่อไปนี้
adb logcat EventLogger:V *:E
การเปิดใช้ตัวถอดรหัสที่มาพร้อมกัน
ExoPlayer มีส่วนขยายหลายรายการที่อนุญาตให้ใช้ตัวถอดรหัสซอฟต์แวร์ที่มาพร้อมกัน ซึ่งรวมถึง AV1, VP9, Opus, FLAC และ FFmpeg (เสียงเท่านั้น) แอปเดโม สามารถสร้างให้รวมและใช้ส่วนขยายเหล่านี้ได้ดังนี้
- สร้างส่วนขยายแต่ละรายการที่คุณต้องการรวมไว้ โปรดทราบว่านี่เป็นกระบวนการที่ต้องดำเนินการด้วยตนเอง โปรดดูวิธีการใน
README.mdไฟล์ของแต่ละส่วนขยาย ในมุมมองตัวแปรบิลด์ของ Android Studio ให้ตั้งค่าตัวแปรบิลด์สำหรับโมดูลเดโม เป็น
withDecoderExtensionsDebugหรือwithDecoderExtensionsReleaseตามที่ แสดงในรูปภาพต่อไปนี้
คอมไพล์ ติดตั้ง และเรียกใช้การกำหนดค่า
demoตามปกติ
โดยค่าเริ่มต้น ระบบจะใช้ตัวถอดรหัสส่วนขยายก็ต่อเมื่อไม่มีตัวถอดรหัสแพลตฟอร์มที่เหมาะสม คุณระบุได้ว่าควรใช้ตัวถอดรหัสส่วนขยายตามที่อธิบายไว้ในส่วนต่อไปนี้
การเล่นเนื้อหาของคุณเอง
คุณเล่นเนื้อหาของคุณเองในแอปเดโมได้หลายวิธี
1. การแก้ไขไฟล์เนื้อหา/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. Cannot be combined with mime_type. 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",
"mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
"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. Cannot be combined with mime_type. 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",
"mime_type": "[O] The MIME type of the sample. Cannot be combined with extension.",
"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
ส่วนเสริมที่ไม่บังคับที่รองรับสำหรับเจตนาตัวอย่างเดียวมีดังนี้
- ตัวอย่างการกำหนดค่าเพิ่มเติม
mime_type[String] คำแนะนำประเภท MIME ตัวอย่าง เช่นapplication/dash+xmlสำหรับเนื้อหา DASHclip_start_position_ms[Long] จุดเริ่มต้นที่ควรตัดตัวอย่าง มีหน่วยเป็นมิลลิวินาทีclip_end_position_ms[ยาว] จุดสิ้นสุดที่ควรตัดตัวอย่าง มีหน่วยเป็นมิลลิวินาทีdrm_schemeรูปแบบ DRM [String] หากได้รับการปกป้อง ค่าที่ใช้ได้คือwidevineplayreadyและclearkeyนอกจากนี้ ระบบยังยอมรับ UUID ของรูปแบบ DRM ด้วยdrm_license_uri[String] 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[String] URI ของไฟล์ช่วยเหลือของคำบรรยายsubtitle_mime_type[String] ประเภท MIME ของ subtitle_uri (ต้องระบุหากตั้งค่า subtitle_uri)subtitle_language[String] รหัสภาษา BCP47 ของไฟล์คำบรรยายแทนเสียง (ระบบจะไม่สนใจหากไม่ได้ตั้งค่า subtitle_uri)ad_tag_uri[String] URI ของแท็กโฆษณาที่จะโหลดโดยใช้[ส่วนขยาย IMA][]prefer_extension_decoders[บูลีน] จะให้ตัวถอดรหัสส่วนขยายมีความสำคัญมากกว่าตัวถอดรหัสของแพลตฟอร์มหรือไม่
เมื่อใช้ adb shell am start เพื่อเรียกใช้ Intent คุณจะตั้งค่าสตริงเพิ่มเติมที่ไม่บังคับได้โดยใช้ --es (เช่น --es extension mpd) คุณจะตั้งค่าบูลีนเพิ่มเติมที่ไม่บังคับได้โดยใช้ --ez (เช่น --ez prefer_extension_decoders TRUE) คุณจะตั้งค่า Long เพิ่มเติมที่ไม่บังคับได้โดยใช้ --el (เช่น --el clip_start_position_ms 5000) คุณจะตั้งค่าอาร์เรย์สตริงเพิ่มเติมที่ไม่บังคับได้โดยใช้ --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 สำหรับตัวอย่างที่ 2 - ระบบจะส่ง URI ของตัวอย่างเป็นส่วนเสริมที่มีคีย์
uri_<sample-index>
ส่วนเนื้อหาพิเศษอื่นๆ ที่ไม่ได้ขึ้นอยู่กับตัวอย่างจะไม่มีการเปลี่ยนแปลง เช่น คุณ สามารถเรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลเพื่อเล่นเพลย์ลิสต์ที่มี 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