ExoPlayer가 지원하는 형식을 정의할 때는 '미디어 형식'이 여러 수준에서 정의된다는 점에 유의해야 합니다. 가장 낮은 수준에서 가장 높은 수준까지는 다음과 같습니다.
- 개별 미디어 샘플의 형식 (예: 동영상 프레임 또는 오디오 프레임)입니다. 샘플 형식입니다. 일반적인 동영상 파일에는 최소 두 가지 샘플 형식의 미디어가 포함됩니다. 하나는 동영상 (예: H.264)용이고 다른 하나는 오디오 (예: AAC)용입니다.
- 미디어 샘플과 연결된 메타데이터를 포함하는 컨테이너의 형식입니다. 이러한 형식을 컨테이너 형식이라고 합니다. 미디어 파일에는 단일 컨테이너 형식 (예: MP4)이 있으며 이는 일반적으로 파일 확장자로 표시됩니다. 일부 오디오 전용 형식 (예: MP3)의 경우 샘플 형식과 컨테이너 형식이 동일할 수 있습니다.
- DASH, SmoothStreaming, HLS와 같은 적응형 스트리밍 기술 이러한 형식은 미디어 형식이 아니지만 ExoPlayer가 제공하는 지원 수준을 정의해야 합니다.
다음 섹션에서는 최고 수준부터 최저 수준까지 각 수준에서 ExoPlayer의 지원을 정의합니다. 마지막 두 섹션에서는 독립형 자막 형식과 HDR 동영상 재생 지원을 설명합니다.
가변 품질 스트리밍
DASH
ExoPlayer는 여러 컨테이너 형식으로 DASH를 지원합니다. 미디어 스트림은 디멀티플렉싱되어야 합니다. 즉, 동영상, 오디오, 텍스트는 DASH 매니페스트의 별도 AdaptationSet 요소에 정의되어야 합니다 (CEA-608은 아래 표에 설명된 대로 예외임). 포함된 오디오 및 동영상 샘플 형식도 지원되어야 합니다 (자세한 내용은 샘플 형식 섹션 참고).
| 기능 | 지원됨 | 비고 |
|---|---|---|
| 컨테이너 | ||
| FMP4 | 예 | 디멀티플렉싱된 스트림만 |
| WebM | 예 | 디멀티플렉싱된 스트림만 |
| Matroska | 예 | 디멀티플렉싱된 스트림만 |
| MPEG-TS | 아니요 | 지원 계획 없음 |
| 자막 | ||
| TTML | 예 | ISO/IEC 14496-30에 따라 원시 또는 FMP4에 삽입 |
| WebVTT | 예 | ISO/IEC 14496-30에 따라 원시 또는 FMP4에 삽입 |
| CEA-608 | 예 | SCTE 접근성 설명자를 사용하여 신호가 전송될 때 FMP4에 삽입됨 |
| CEA-708 | 예 | SCTE 접근성 설명자를 사용하여 신호가 전송될 때 FMP4에 삽입됨 |
| 메타데이터 | ||
| 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는 FMP4 컨테이너 형식으로 SmoothStreaming을 지원합니다. 미디어 스트림은 디멀티플렉싱되어야 합니다. 즉, 동영상, 오디오, 텍스트는 SmoothStreaming 매니페스트의 별도 StreamIndex 요소에 정의되어야 합니다. 포함된 오디오 및 동영상 샘플 형식도 지원되어야 합니다 (자세한 내용은 샘플 형식 섹션 참고).
| 기능 | 지원됨 | 비고 |
|---|---|---|
| 컨테이너 | ||
| 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만 |
| 서버 제어 | ||
| 델타 업데이트 | 예 | |
| 재생목록 다시 로드 차단 | 예 | |
| 미리 로드 힌트의 로드 차단 | 예 | 길이가 정의되지 않은 바이트 범위는 제외 |
| 광고 삽입 | ||
| 서버 안내 광고 삽입(전면 광고) | 일부만 | X-ASSET-URI가 포함된 VOD만 해당
라이브 스트림과 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 라이브러리 또는 ExoPlayer 라이브러리의 FLAC 추출기 사용*** |
| AMR | 예 | 일정한 비트 전송률 탐색을 사용해서만 탐색 가능** |
* 컨테이너가 미디어 플레이어가 효율적인 방식으로 탐색을 실행할 수 있도록 메타데이터 (예: 샘플 색인)를 제공하지 않으므로 탐색이 지원되지 않습니다. 탐색이 필요한 경우 더 적합한 컨테이너 형식을 사용하는 것이 좋습니다.
** 이러한 추출기에는 일정한 비트 전송률 가정을 사용하여 대략적인 탐색을 사용 설정하는 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING 플래그가 있습니다. 이 기능은 기본적으로 사용 설정되어 있지 않습니다. 이 기능을 지원하는 모든 추출기에 대해 이 기능을 사용 설정하는 가장 간단한 방법은 여기에 설명된 대로 DefaultExtractorsFactory.setConstantBitrateSeekingEnabled를 사용하는 것입니다.
*** FLAC 라이브러리 추출기는 모든 API 수준에서 프레임워크가 처리할 수 있는 원시 오디오를 출력합니다. ExoPlayer 라이브러리 FLAC 추출기는 FLAC 오디오 프레임을 출력하므로 FLAC 디코더 (예: FLAC를 처리하는 MediaCodec 디코더 (API 수준 27부터 필요) 또는 FLAC가 사용 설정된 FFmpeg 라이브러리)가 있어야 합니다. 애플리케이션이 FLAC 라이브러리로 빌드된 경우 DefaultExtractorsFactory는 확장 프로그램 추출기를 사용합니다.
그렇지 않으면 ExoPlayer 라이브러리 추출기를 사용합니다.
RTSP
ExoPlayer는 실시간 및 주문형 RTSP를 모두 지원합니다. 지원되는 샘플 형식과 네트워크 유형은 아래에 나열되어 있습니다.
지원되는 샘플 형식
- H264 (SDP 미디어 설명에는 디코더 초기화를 위한 fmtp 속성에 SPS/PPS 데이터가 포함되어야 함)
- AAC (ADTS 비트 스트림 포함)
- AC3
지원되는 네트워크 유형
- UDP 유니캐스트를 통한 RTP (멀티캐스트는 지원되지 않음)
- 인터리브 RTSP, TCP를 사용하는 RTSP를 통한 RTP
샘플 형식
기본적으로 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 울트라 HDR | 예 | Android 14 이전 또는 HDR이 아닌 디스플레이에서 SDR로 대체 |
| 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는 MP4의 Dolby Vision, Matroska/WebM의 HDR10+ 등 다양한 컨테이너에서 HDR (High Dynamic Range) 동영상 추출을 처리합니다. HDR 콘텐츠의 디코딩 및 표시는 Android 플랫폼과 기기의 지원에 따라 달라집니다. Android 버전 간 HDR 지원의 HDR 디코딩/디스플레이 기능 및 제한사항을 확인하는 방법을 알아보려면 HDR 동영상 재생을 참고하세요.
특정 코덱 프로필 지원이 필요한 HDR 스트림을 재생할 때 ExoPlayer의 기본 MediaCodec 선택기는 해당 프로필을 지원하는 디코더를 선택합니다 (사용 가능한 경우). 해당 프로필을 지원하지 않는 동일한 MIME 유형의 다른 디코더가 코덱 목록에서 더 위에 표시되더라도 마찬가지입니다. 이로 인해 스트림이 동일한 MIME 유형의 하드웨어 디코더 기능을 초과하는 경우 소프트웨어 디코더가 선택될 수 있습니다.