เมื่อกำหนดรูปแบบที่ ExoPlayer รองรับ สิ่งสำคัญที่ควรทราบคือ "รูปแบบสื่อ" จะกำหนดไว้ที่หลายระดับ โดยเรียงจากระดับต่ำสุดไปยังระดับสูงสุด
- รูปแบบของตัวอย่างสื่อแต่ละรายการ (เช่น เฟรมวิดีโอหรือเฟรมเสียง) ต่อไปนี้คือรูปแบบตัวอย่าง โปรดทราบว่าไฟล์วิดีโอทั่วไปจะมีสื่อในรูปแบบตัวอย่างอย่างน้อย 2 รูปแบบ ได้แก่ รูปแบบหนึ่งสำหรับวิดีโอ (เช่น H.264) และอีกรูปแบบหนึ่งสำหรับเสียง (เช่น AAC)
- รูปแบบของคอนเทนเนอร์ที่เก็บตัวอย่างสื่อและข้อมูลเมตาที่เกี่ยวข้อง ซึ่งเป็นรูปแบบคอนเทนเนอร์ ไฟล์สื่อมีรูปแบบคอนเทนเนอร์เดียว (เช่น MP4) ซึ่งมักจะระบุด้วยนามสกุลไฟล์ โปรดทราบ ว่าสำหรับรูปแบบเสียงอย่างเดียวบางรูปแบบ (เช่น MP3) รูปแบบตัวอย่างและรูปแบบคอนเทนเนอร์ อาจเหมือนกัน
- เทคโนโลยีการสตรีมที่ปรับเปลี่ยนได้ เช่น DASH, SmoothStreaming และ HLS แม้ว่า รายการเหล่านี้จะไม่ใช่รูปแบบสื่อ แต่ก็ยังจำเป็นต้องกำหนดระดับการรองรับที่ ExoPlayer มี
ส่วนต่อไปนี้จะอธิบายการรองรับของ ExoPlayer ในแต่ละระดับ ตั้งแต่ระดับสูงสุดไปจนถึงระดับต่ำสุด ส่วนสุดท้าย 2 ส่วนจะอธิบายการรองรับรูปแบบคำบรรยายแทนเสียงแบบสแตนด์อโลน และการเล่นวิดีโอ HDR
การสตรีมแบบปรับอัตโนมัติ
DASH
ExoPlayer รองรับ DASH ที่มีรูปแบบคอนเทนเนอร์หลายรูปแบบ ต้องแยกสตรีมสื่อออก ซึ่งหมายความว่าต้องกำหนดวิดีโอ เสียง และข้อความในองค์ประกอบ AdaptationSet ที่แตกต่างกันในไฟล์ Manifest ของ DASH (CEA-608 เป็นข้อยกเว้นตามที่อธิบายไว้ในตารางด้านล่าง) นอกจากนี้ รูปแบบตัวอย่างเสียงและวิดีโอที่อยู่ในไฟล์ต้องได้รับการรองรับด้วย (ดูรายละเอียดในส่วนรูปแบบตัวอย่าง)
| ฟีเจอร์ | รองรับ | ความคิดเห็น |
|---|---|---|
| คอนเทนเนอร์ | ||
| FMP4 | ใช่ | สตรีมที่แยกแล้วเท่านั้น |
| WebM | ใช่ | สตรีมที่แยกแล้วเท่านั้น |
| Matroska | ใช่ | สตรีมที่แยกแล้วเท่านั้น |
| MPEG-TS | ไม่ | ไม่มีแผนที่จะรองรับ |
| คำบรรยายแทนเสียง / คำบรรยาย | ||
| TTML | ใช่ | ดิบหรือฝังใน FMP4 ตาม ISO/IEC 14496-30 |
| WebVTT | ใช่ | ดิบหรือฝังใน FMP4 ตาม ISO/IEC 14496-30 |
| CEA-608 | ใช่ | ฝังใน FMP4 เมื่อมีการส่งสัญญาณ โดยใช้ตัวอธิบายการช่วยเหลือพิเศษของ SCTE |
| CEA-708 | ใช่ | ฝังใน FMP4 เมื่อมีการส่งสัญญาณ โดยใช้ตัวอธิบายการช่วยเหลือพิเศษของ SCTE |
| ข้อมูลเมตา | ||
| ข้อมูลเมตาของ EMSG | ใช่ | ฝังใน FMP4 |
| การปกป้องเนื้อหา | ||
| Widevine | ใช่ | รูปแบบ "cenc": API 19 ขึ้นไป; รูปแบบ "cbcs": API 25 ขึ้นไป |
| PlayReady SL2000 | ใช่ | Android TV, รูปแบบ "cenc" เท่านั้น |
| ClearKey | ใช่ | API 21 ขึ้นไป รูปแบบ "cenc" เท่านั้น |
| การแทรกโฆษณา | ||
| การเล่นแบบหลายช่วงเวลา | ใช่ | |
| การแทรกโฆษณาที่เซิร์ฟเวอร์แนะนำ (xlinks) | ไม่ | |
| โฆษณาฝั่งเซิร์ฟเวอร์และ ฝั่งไคลเอ็นต์ของ IMA | ใช่ | คู่มือการแทรกโฆษณา |
| การเล่นสด | ||
| การเล่นไลฟ์สดปกติ | ใช่ | |
| การเล่นสดแบบ CMAF ที่มีเวลาในการตอบสนองต่ำมาก | ใช่ | |
| ข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD) | ใช่ | คู่มือการผสานรวม CMCD |
SmoothStreaming
ExoPlayer รองรับ SmoothStreaming ด้วยรูปแบบคอนเทนเนอร์ FMP4 ต้องแยกสตรีมสื่อออก ซึ่งหมายความว่าต้องกำหนดวิดีโอ เสียง และข้อความในองค์ประกอบ StreamIndex ที่แตกต่างกันในไฟล์ Manifest ของ SmoothStreaming นอกจากนี้ ระบบยังต้องรองรับรูปแบบตัวอย่างเสียงและวิดีโอที่อยู่ในไฟล์ด้วย (ดูรายละเอียดในส่วนรูปแบบตัวอย่าง)
| ฟีเจอร์ | รองรับ | ความคิดเห็น |
|---|---|---|
| คอนเทนเนอร์ | ||
| FMP4 | ใช่ | สตรีมที่แยกแล้วเท่านั้น |
| คำบรรยาย/คำบรรยายแทนเสียง | ||
| TTML | ใช่ | ฝังใน FMP4 |
| การปกป้องเนื้อหา | ||
| PlayReady SL2000 | ใช่ | Android TV เท่านั้น |
| การเล่นสด | ||
| การเล่นไลฟ์สดปกติ | ใช่ | |
| ข้อมูลไคลเอ็นต์สื่อทั่วไป (CMCD) | ใช่ | คู่มือการผสานรวม |
HLS
ExoPlayer รองรับ HLS ที่มีรูปแบบคอนเทนเนอร์หลายรูปแบบ นอกจากนี้ ระบบยังต้องรองรับรูปแบบตัวอย่างเสียงและวิดีโอที่อยู่ในไฟล์ด้วย (ดูรายละเอียดได้ที่ส่วนรูปแบบตัวอย่าง ) เราขอแนะนำให้ผู้ผลิตเนื้อหา HLS สร้างสตรีม HLS คุณภาพสูงตามที่อธิบายไว้ในบล็อกโพสต์นี้
| ฟีเจอร์ | รองรับ | ความคิดเห็น |
|---|---|---|
| คอนเทนเนอร์ | ||
| MPEG-TS | ใช่ | |
| FMP4/CMAF | ใช่ | |
| ADTS (AAC) | ใช่ | |
| MP3 | ใช่ | |
| คำบรรยายแทนเสียง / คำบรรยาย | ||
| CEA-608 | ใช่ | |
| CEA-708 | ใช่ | |
| WebVTT | ใช่ | |
| ข้อมูลเมตา | ||
| ID3 | ใช่ | |
| SCTE-35 | ไม่ | |
| การปกป้องเนื้อหา | ||
| AES-128 | ใช่ | |
| ตัวอย่าง AES-128 | ไม่ | |
| Widevine | ใช่ | API 19 ขึ้นไป (รูปแบบ "cenc") และ 25 ขึ้นไป (รูปแบบ "cbcs") |
| PlayReady SL2000 | ใช่ | Android TV เท่านั้น |
| การควบคุมเซิร์ฟเวอร์ | ||
| การอัปเดตแบบเดลต้า | ใช่ | |
| การบล็อกการโหลดเพลย์ลิสต์ซ้ำ | ใช่ | |
| การบล็อกการโหลดคำใบ้การโหลดล่วงหน้า | ใช่ | ยกเว้นไบต์เรนจ์ที่มีความยาว ไม่ระบุ |
| การแทรกโฆษณา | ||
| การแทรกโฆษณาที่เซิร์ฟเวอร์แนะนำ (โฆษณาคั่นระหว่างหน้า) | เพียงบางส่วน | เฉพาะ VOD ที่มี X-ASSET-URI
เราจะเพิ่มไลฟ์สดและ
X-ASSET-LISTในภายหลัง
|
| โฆษณาฝั่งเซิร์ฟเวอร์และ ฝั่งไคลเอ็นต์ของ IMA | ใช่ | คู่มือการแทรกโฆษณา |
| การเล่นสด | ||
| การเล่นไลฟ์สดปกติ | ใช่ | |
| HLS ที่มีเวลาในการตอบสนองต่ำ (Apple) | ใช่ | |
| HLS ที่มีเวลาในการตอบสนองต่ำ (ชุมชน) | ไม่ | |
| ข้อมูลไคลเอ็นต์สื่อทั่วไป CMCD | ใช่ | คู่มือการผสานรวม CMCD |
รูปแบบคอนเทนเนอร์แบบโปรเกรสซีฟ
ExoPlayer สามารถเล่นสตรีมในรูปแบบคอนเทนเนอร์ต่อไปนี้ได้โดยตรง นอกจากนี้ ระบบยังต้องรองรับรูปแบบตัวอย่างเสียงและวิดีโอที่รวมอยู่ด้วย (ดูรายละเอียดในส่วนรูปแบบตัวอย่าง) ดูการรองรับคอนเทนเนอร์และรูปแบบรูปภาพได้ที่รูปภาพ
| รูปแบบคอนเทนเนอร์ | รองรับ | ความคิดเห็น |
|---|---|---|
| MP4 | ใช่ | |
| M4A | ใช่ | |
| FMP4 | ใช่ | |
| WebM | ใช่ | |
| Matroska | ใช่ | |
| MP3 | ใช่ | สตรีมบางรายการจะค้นหาได้โดยใช้การค้นหาบิตเรตคงที่เท่านั้น** |
| Ogg | ใช่ | มี Vorbis, Opus และ FLAC |
| WAV | ใช่ | |
| MPEG-TS | ใช่ | |
| MPEG-PS | ใช่ | |
| FLV | ใช่ | กรอไม่ได้* |
| ADTS (AAC) | ใช่ | ค้นหาได้โดยใช้การค้นหาบิตเรตคงที่เท่านั้น** |
| FLAC | ใช่ | การใช้ไลบรารี FLAC หรือโปรแกรมแยก FLAC ในไลบรารี ExoPlayer*** |
| AMR | ใช่ | ค้นหาได้โดยใช้การค้นหาบิตเรตคงที่เท่านั้น** |
* ระบบไม่รองรับการกรอเนื่องจากคอนเทนเนอร์ไม่มีข้อมูลเมตา (เช่น ดัชนีตัวอย่าง) เพื่อให้มีเดียเพลเยอร์ทำการกรอได้อย่างมีประสิทธิภาพ หากจำเป็นต้องใช้การค้นหา เราขอแนะนำให้ใช้รูปแบบคอนเทนเนอร์ที่เหมาะสมกว่า
** ตัวแยกข้อมูลเหล่านี้มีFLAG_ENABLE_CONSTANT_BITRATE_SEEKINGแฟล็กสำหรับ
เปิดใช้การกรอโดยประมาณโดยใช้สมมติฐานอัตราบิตคงที่ ฟังก์ชันนี้จะไม่ได้เปิดใช้โดยค่าเริ่มต้น วิธีที่ง่ายที่สุดในการเปิดใช้ฟังก์ชันนี้สำหรับโปรแกรมแยกข้อมูลทั้งหมดที่รองรับคือการใช้ DefaultExtractorsFactory.setConstantBitrateSeekingEnabled ตามที่อธิบายไว้ที่นี่
*** ตัวแยกไลบรารี FLAC จะแสดงผลเสียงดิบ ซึ่งเฟรมเวิร์กสามารถจัดการได้
ในทุกระดับ API โปรแกรมแยก FLAC ของไลบรารี ExoPlayer จะแสดงเฟรมเสียง FLAC จึงต้องมีตัวถอดรหัส FLAC (เช่น MediaCodec
ตัวถอดรหัสที่จัดการ FLAC (ต้องใช้ตั้งแต่ API ระดับ 27 ขึ้นไป) หรือไลบรารี FFmpeg ที่เปิดใช้ FLAC) DefaultExtractorsFactory จะใช้ตัวแยกส่วนขยายหากแอปพลิเคชันสร้างขึ้นด้วยไลบรารี FLAC
ไม่เช่นนั้นก็จะใช้ตัวแยกไลบรารี ExoPlayer
RTSP
ExoPlayer รองรับ RTSP ทั้งแบบสดและแบบออนดีมานด์ รูปแบบตัวอย่างและ ประเภทเครือข่ายที่รองรับแสดงอยู่ด้านล่าง
รูปแบบตัวอย่างที่รองรับ
- H264 (คำอธิบายสื่อ SDP ต้องมีข้อมูล SPS/PPS ในแอตทริบิวต์ fmtp สำหรับการเริ่มต้นตัวถอดรหัส)
- AAC (ที่มีสตรีมบิต ADTS)
- AC3
ประเภทเครือข่ายที่รองรับ
- RTP ผ่าน UDP Unicast (ไม่รองรับ Multicast)
- RTSP แบบแทรก, RTP ผ่าน RTSP โดยใช้ TCP
รูปแบบตัวอย่าง
โดยค่าเริ่มต้น ExoPlayer จะใช้ตัวถอดรหัสของแพลตฟอร์ม Android ดังนั้นรูปแบบตัวอย่างที่รองรับ จึงขึ้นอยู่กับแพลตฟอร์มพื้นฐานมากกว่า ExoPlayer โปรดดูรูปแบบสื่อที่รองรับเพื่อดู เอกสารประกอบเกี่ยวกับรูปแบบตัวอย่างที่อุปกรณ์ Android รองรับ โปรดทราบว่า อุปกรณ์แต่ละเครื่องอาจรองรับรูปแบบเพิ่มเติมจากที่ระบุไว้
นอกจากตัวถอดรหัสแพลตฟอร์มของ Android แล้ว ExoPlayer ยังใช้ ส่วนขยายตัวถอดรหัสซอฟต์แวร์ได้ด้วย คุณต้องสร้างและรวมรายการเหล่านี้ไว้ในโปรเจ็กต์ที่ต้องการใช้ด้วยตนเอง ปัจจุบันเรามีไลบรารีตัวถอดรหัสซอฟต์แวร์สำหรับ AV1, VP9, FLAC, Opus, FFmpeg, MIDI, IAMF และ MPEG-H
ไลบรารี FFmpeg
ไลบรารี FFmpeg รองรับการถอดรหัสรูปแบบตัวอย่างเสียงที่แตกต่างกัน มากมาย คุณเลือกตัวถอดรหัสที่จะรวมเมื่อสร้าง ไลบรารีได้ตามที่ระบุไว้ใน README.md ของไลบรารี ตารางต่อไปนี้แสดงการแมประหว่างรูปแบบตัวอย่างเสียงกับชื่อตัวถอดรหัส FFmpeg ที่เกี่ยวข้อง
| รูปแบบตัวอย่าง | ชื่อตัวถอดรหัส |
|---|---|
| Vorbis | vorbis |
| Opus | opus |
| FLAC | flac |
| ALAC | alac |
| PCM μ-law | pcm_mulaw |
| PCM A-law | pcm_alaw |
| MP1, MP2, MP3 | mp3 |
| AMR-NB | amrnb |
| AMR-WB | amrwb |
| AAC | aac |
| AC-3 | ac3 |
| E-AC-3 | eac3 |
| DTS, DTS-HD | DCA |
| TrueHD | mlp truehd |
รูปภาพ
ExoPlayer รองรับรูปแบบรูปภาพต่อไปนี้ ดูวิธีผสานรวมกับไลบรารีภายนอกที่อาจรองรับชุดรูปแบบอื่นได้ที่ ไลบรารีการโหลดรูปภาพ
| รูปแบบรูปภาพ | รองรับ | หมายเหตุ |
|---|---|---|
| BMP | ใช่ | |
| GIF | ไม่ | ไม่รองรับ Extractor |
| JPEG | ใช่ | |
| ภาพเคลื่อนไหว JPEG | ใช่ | รองรับรูปภาพนิ่งและวิดีโอ |
| JPEG Ultra HDR | ใช่ | กลับไปใช้ SDR ก่อน Android 14 หรือในจอแสดงผลที่ไม่ใช่ HDR |
| PNG | ใช่ | |
| WebP | ใช่ | |
| HEIF/HEIC | ใช่ | |
| รูปภาพเคลื่อนไหว HEIC | ใช่ | |
| AVIF (พื้นฐาน) | ใช่ | ถอดรหัสได้ใน Android 14 ขึ้นไปเท่านั้น |
รูปแบบคำบรรยายแบบสแตนด์อโลน
ExoPlayer รองรับไฟล์คำบรรยายแทนเสียงแบบสแตนด์อโลนในหลากหลายรูปแบบ คุณโหลดไฟล์คำบรรยายแทนเสียงจากภายนอกได้ตามที่อธิบายไว้ในหน้าสื่อ
| รูปแบบคอนเทนเนอร์ | รองรับ | ประเภท MIME |
|---|---|---|
| WebVTT | ใช่ | MimeTypes.TEXT_VTT |
| TTML / SMPTE-TT | ใช่ | MimeTypes.APPLICATION_TTML |
| SubRip | ใช่ | MimeTypes.APPLICATION_SUBRIP |
| SubStationAlpha (SSA/ASS) | ใช่ | MimeTypes.TEXT_SSA |
การเล่นวิดีโอ HDR
ExoPlayer จัดการการแยกวิดีโอ High Dynamic Range (HDR) ในคอนเทนเนอร์ต่างๆ รวมถึง Dolby Vision ใน MP4 และ HDR10+ ใน Matroska/WebM การถอดรหัส และการแสดงเนื้อหา HDR ขึ้นอยู่กับการรองรับจากแพลตฟอร์ม Android และ อุปกรณ์ ดูข้อมูลเกี่ยวกับการตรวจสอบความสามารถในการถอดรหัส/แสดงผล HDR และข้อจำกัดของ การรองรับ HDR ใน Android เวอร์ชันต่างๆ ได้ที่ การเล่นวิดีโอ HDR
เมื่อเล่นสตรีม HDR ที่ต้องรองรับโปรไฟล์ตัวแปลงรหัสที่เฉพาะเจาะจง
ตัวเลือกเริ่มต้นของ MediaCodec ExoPlayer จะเลือกตัวถอดรหัสที่รองรับโปรไฟล์นั้น (หากมี) แม้ว่าตัวถอดรหัสอื่นสำหรับ MIME ประเภทเดียวกันซึ่ง
ไม่รองรับโปรไฟล์นั้นจะปรากฏในรายการตัวแปลงรหัสที่สูงกว่า ซึ่งอาจส่งผลให้มีการเลือกตัวถอดรหัสซอฟต์แวร์ในกรณีที่สตรีมเกินความสามารถของตัวถอดรหัสฮาร์ดแวร์สำหรับ MIME ประเภทเดียวกัน