เมื่อกำหนดรูปแบบที่ 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 ที่มีเวลาในการตอบสนองต่ำมาก | ใช่ | |
| Common Media Client Data (CMCD) | ใช่ | คู่มือการผสานรวม CMCD |
SmoothStreaming
ExoPlayer รองรับ SmoothStreaming ด้วยรูปแบบคอนเทนเนอร์ FMP4 สตรีมสื่อต้องได้รับการแยกข้อมูล ซึ่งหมายความว่าต้องกำหนดวิดีโอ เสียง และข้อความในองค์ประกอบ StreamIndex ที่ต่างกันในไฟล์ Manifest ของ SmoothStreaming นอกจากนี้ รูปแบบของตัวอย่างเสียงและวิดีโอที่รวมอยู่ด้วยต้องได้รับการรองรับด้วย (ดูรายละเอียดในส่วนรูปแบบของตัวอย่าง)
| ฟีเจอร์ | รองรับ | ความคิดเห็น |
|---|---|---|
| คอนเทนเนอร์ | ||
| FMP4 | ใช่ | สตรีมที่แยกข้อมูลแล้วเท่านั้น |
| คำบรรยายแทนเสียง/คำบรรยายวิดีโอ | ||
| TTML | ใช่ | ฝังอยู่ใน FMP4 |
| การปกป้องเนื้อหา | ||
| PlayReady SL2000 | ใช่ | Android TV เท่านั้น |
| การเล่นแบบสด | ||
| การเล่นแบบสดปกติ | ใช่ | |
| Common Media Client Data (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 เท่านั้น |
| การควบคุมเซิร์ฟเวอร์ | ||
| การอัปเดต Delta | ใช่ | |
| การบล็อกการโหลดเพลย์ลิสต์ซ้ำ | ใช่ | |
| การบล็อกการโหลดคำแนะนำในการโหลดล่วงหน้า | ใช่ | ยกเว้นช่วงไบต์ที่มีความยาวที่ไม่ระบุ |
| การแทรกโฆษณา | ||
| การแสดงโฆษณาที่เซิร์ฟเวอร์ควบคุม (โฆษณาคั่นระหว่างหน้า) | เพียงบางส่วน | VOD ที่มี X-ASSET-URI เท่านั้น
เราจะเพิ่มสตรีมแบบสดและX-ASSET-LISTในภายหลัง |
| โฆษณาฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ IMA | ใช่ | คู่มือการแทรกโฆษณา |
| การเล่นแบบสด | ||
| การเล่นแบบสดปกติ | ใช่ | |
| HLS แบบเวลาในการตอบสนองต่ำ (Apple) | ใช่ | |
| HLS แบบเวลาในการตอบสนองต่ำ (ชุมชน) | ไม่ | |
| Common Media Client Data 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 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING สำหรับเปิดใช้การกรอเวลาโดยประมาณโดยใช้ค่าประมาณอัตราบิตคงที่ ฟังก์ชันการทำงานนี้จะไม่เปิดใช้โดยค่าเริ่มต้น วิธีที่ง่ายที่สุดในการเปิดใช้ฟังก์ชันการทำงานนี้สำหรับเครื่องมือแยกข้อมูลทั้งหมดที่รองรับคือการใช้ DefaultExtractorsFactory.setConstantBitrateSeekingEnabled ตามที่อธิบายไว้ที่นี่
*** เครื่องมือแยกข้อมูล FLAC Library จะแสดงผลเสียงดิบ ซึ่งเฟรมเวิร์กจะจัดการได้ในระดับ 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 แบบยูนิแคสต์ (ไม่รองรับมัลติแคสต์)
- 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 | ไม่ | ไม่รองรับเครื่องมือแยก |
| JPEG | ใช่ | |
| รูปภาพเคลื่อนไหว JPEG | ใช่ | รองรับรูปภาพนิ่งและวิดีโอ |
| JPEG Ultra HDR | ใช่ | เปลี่ยนกลับไปใช้ SDR ก่อน Android 14 หรือในจอแสดงผลที่ไม่ใช่ HDR |
| PNG | ใช่ | |
| WebP | ใช่ | |
| HEIF/HEIC | ใช่ | |
| รูปภาพเคลื่อนไหว HEIC | เพียงบางส่วน | รองรับเฉพาะภาพนิ่ง* |
| AVIF (เบสไลน์) | ใช่ | ถอดรหัสได้ใน Android 14 ขึ้นไปเท่านั้น |
* คุณดูส่วนวิดีโอของรูปภาพเคลื่อนไหว HEIC ได้โดยใช้ MetadataRetriever และเล่นเป็นไฟล์เดี่ยว
รูปแบบคำบรรยายแบบสแตนด์อโลน
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 ประเภทเดียวกัน