SmoothStreaming

ExoPlayer는 FMP4 컨테이너 형식으로 SmoothStreaming을 지원합니다. 미디어 스트림은 역다중화되어야 합니다. 즉, 동영상, 오디오, 텍스트가 SmoothStreaming 매니페스트의 고유한 StreamIndex 요소로 정의되어야 합니다. 포함된 오디오 및 동영상 샘플 형식도 지원되어야 합니다 (자세한 내용은 샘플 형식 섹션 참고).

기능 지원됨 댓글
컨테이너
FMP4 디믹스된 스트림만
자막
TTML : ML FMP4에 삽입됨
콘텐츠 보호
PlayReady SL2000 Android TV만
실시간 재생
정기 라이브 재생
Common Media Client Data (CMCD) 통합 가이드

MediaItem 사용

SmoothStreaming 스트림을 재생하려면 SmoothStreaming 모듈을 사용해야 합니다.

Kotlin

implementation("androidx.media3:media3-exoplayer-smoothstreaming:1.3.1")

Groovy

implementation "androidx.media3:media3-exoplayer-smoothstreaming:1.3.1"

그런 다음 SmoothStreaming 매니페스트 URI의 MediaItem를 만들어 플레이어에 전달할 수 있습니다.

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(ssUri))
// Prepare the player.
player.prepare()

Java

// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(ssUri));
// Prepare the player.
player.prepare();

URI가 .ism/Manifest로 끝나지 않으면 MimeTypes.APPLICATION_SSMediaItem.BuildersetMimeType에 전달하여 콘텐츠 유형을 명시적으로 나타낼 수 있습니다.

ExoPlayer는 사용 가능한 대역폭과 기기 기능을 모두 고려하여 매니페스트에 정의된 표현 간에 자동으로 조정합니다.

SsMediaSource 사용

더 많은 맞춤설정 옵션을 보려면 SsMediaSource를 만들어 MediaItem 대신 플레이어에 직접 전달하면 됩니다.

Kotlin

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a SmoothStreaming media source pointing to a manifest uri.
val mediaSource: MediaSource =
  SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a SmoothStreaming media source pointing to a manifest uri.
MediaSource mediaSource =
    new SsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(ssUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

매니페스트에 액세스

Player.getCurrentManifest를 호출하여 현재 매니페스트를 가져올 수 있습니다. SmoothStreaming의 경우 반환된 객체를 SsManifest로 전송해야 합니다. Player.ListeneronTimelineChanged 콜백도 매니페스트가 로드될 때마다 호출됩니다. 이 작업은 주문형 콘텐츠에 한 번, 라이브 콘텐츠에서 여러 번 발생할 수 있습니다. 다음 코드 스니펫은 매니페스트가 로드될 때마다 앱이 어떤 작업을 실행할 수 있는지 보여줍니다.

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is SsManifest) {
        // Do something with the manifest.
      }
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          SsManifest ssManifest = (SsManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

재생 맞춤설정

ExoPlayer는 앱의 요구사항에 따라 재생 환경을 맞춤설정할 수 있는 여러 방법을 제공합니다. 예시를 보려면 맞춤설정 페이지를 참조하세요.