미디어 항목

playlist APIMediaItem.Builder를 사용하여 편리하게 빌드할 수 있는 MediaItem 인스턴스를 기반으로 합니다. 플레이어 내에서 MediaItemMediaSource.Factory에 의해 재생 가능한 MediaSource로 변환됩니다. 맞춤 구성이 없으면 이 변환은 미디어 항목의 속성에 해당하는 복잡한 미디어 소스를 빌드할 수 있는 DefaultMediaSourceFactory에 의해 실행됩니다. 미디어 항목에 설정할 수 있는 일부 속성은 아래에 설명되어 있습니다.

간단한 미디어 항목

스트림 URI로만 구성된 미디어 항목은 fromUri 편의 메서드를 사용하여 빌드할 수 있습니다.

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

자바

MediaItem mediaItem = MediaItem.fromUri(videoUri);

다른 모든 경우에는 MediaItem.Builder를 사용할 수 있습니다. 다음 예에서는 ID 및 연결된 메타데이터로 미디어 항목이 빌드됩니다.

Kotlin

val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()

자바

MediaItem mediaItem =
    new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();

메타데이터를 첨부하면 재생목록 전환이 발생할 때 앱의 UI를 업데이트하는 데 유용할 수 있습니다.

이미지

이미지를 재생하려면 미디어 항목에 재생 중에 이미지를 표시할 시간을 지정하는 재생 시간이 필요합니다. 모션 포토이미지 로드 라이브러리(예: Glide)에 관한 자세한 내용은 이미지 가이드 페이지를 참고하세요.

Kotlin

val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()

자바

MediaItem mediaItem =
    new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();

적응형 미디어의 비표준 파일 확장자

ExoPlayer는 DASH, HLS, SmoothStreaming용 적응형 미디어 소스를 제공합니다. 이러한 적응형 미디어 항목의 URI가 표준 파일 확장자로 끝나면 해당 미디어 소스가 자동으로 생성됩니다. URI에 비표준 확장자가 있거나 확장자가 전혀 없는 경우 MIME 유형을 명시적으로 설정하여 미디어 항목의 유형을 나타낼 수 있습니다.

Kotlin

val mediaItem = MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()

자바

MediaItem mediaItem =
    new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();

프로그레시브 미디어 스트림의 경우 MIME 유형이 필요하지 않습니다.

보호된 콘텐츠

보호된 콘텐츠의 경우 미디어 항목의 DRM 속성을 설정해야 합니다. UUID는 필수사항이고 다른 모든 속성은 선택사항입니다.

미디어에서 라이선스 URI를 직접 사용할 수 없고 (예: DASH 재생목록) 여러 세션이 필요한 (예: 키 순환으로 인해) Widevine DRM으로 보호된 항목을 재생하기 위한 구성 예시입니다.

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setDrmConfiguration(
      MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
        .setLicenseUri(licenseUri)
        .setMultiSession(true)
        .setLicenseRequestHeaders(httpRequestHeaders)
        .build()
    )
    .build()

자바

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setDrmConfiguration(
            new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
                .setLicenseUri(licenseUri)
                .setMultiSession(true)
                .setLicenseRequestHeaders(httpRequestHeaders)
                .build())
        .build();

플레이어 내에서 DefaultMediaSourceFactory는 이러한 속성을 DrmSessionManagerProvider에 전달하여 DrmSessionManager를 가져오고, 생성된 MediaSource에 삽입합니다. 필요에 따라 DRM 동작을 추가로 맞춤설정할 수 있습니다.

자막 트랙 사이드로드

자막 트랙을 사이드로드하려면 미디어 항목을 빌드할 때 MediaItem.Subtitle 인스턴스를 추가하면 됩니다.

Kotlin

val subtitle =
  SubtitleConfiguration.Builder(subtitleUri)
    .setMimeType(mimeType) // The correct MIME type (required).
    .setLanguage(language) // The subtitle language (optional).
    .setSelectionFlags(selectionFlags) // Selection flags for the track (optional).
    .build()
val mediaItem =
  MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()

자바

MediaItem.SubtitleConfiguration subtitle =
    new MediaItem.SubtitleConfiguration.Builder(subtitleUri)
        .setMimeType(mimeType) // The correct MIME type (required).
        .setLanguage(language) // The subtitle language (optional).
        .setSelectionFlags(selectionFlags) // Selection flags for the track (optional).
        .build();
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setSubtitleConfigurations(ImmutableList.of(subtitle))
        .build();

내부적으로 DefaultMediaSourceFactoryMergingMediaSource를 사용하여 콘텐츠 미디어 소스를 각 자막 트랙의 SingleSampleMediaSource와 결합합니다. DefaultMediaSourceFactory는 다중 기간 DASH의 자막 사이드로드를 지원하지 않습니다.

미디어 스트림 클립

미디어 항목에서 참조하는 콘텐츠를 클립하려면 맞춤 시작 위치와 종료 위치를 설정합니다.

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setClippingConfiguration(
      MediaItem.ClippingConfiguration.Builder()
        .setStartPositionMs(startPositionMs)
        .setEndPositionMs(endPositionMs)
        .build()
    )
    .build()

자바

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder()
                .setStartPositionMs(startPositionMs)
                .setEndPositionMs(endPositionMs)
                .build())
        .build();

내부적으로 DefaultMediaSourceFactoryClippingMediaSource를 사용하여 콘텐츠 미디어 소스를 래핑합니다. 추가 클리핑 속성이 있습니다. 자세한 내용은 MediaItem.Builder Javadoc을 참고하세요.

광고 삽입

광고를 삽입하려면 미디어 항목의 광고 태그 URI 속성을 설정해야 합니다.

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())

자바

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

내부적으로 DefaultMediaSourceFactory는 콘텐츠 미디어 소스를 AdsMediaSource로 래핑하여 광고 태그에 정의된 광고를 삽입합니다. 이렇게 하려면 플레이어의 DefaultMediaSourceFactory적절하게 구성되어야 합니다.