미디어 트랙 사용

MediaTrack는 오디오 스트림, 동영상 스트림 또는 텍스트(예: 자막 또는 자막)일 수 있는 미디어 트랙을 나타냅니다. 앱에서 미디어 트랙을 그룹화하고 스타일을 지정하고 활성화할 수 있습니다.

트랙 구성

트랙을 구성하고 트랙에 고유 ID를 할당할 수 있습니다. 다음 코드는 각각 고유 ID가 있는 영어 텍스트 트랙, 프랑스어 텍스트 트랙, 프랑스어 오디오 트랙을 만듭니다.

Kotlin
val englishSubtitle = MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT)
    .setName("English Subtitle")
    .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
    .setContentId("https://some-url/caption_en.vtt")
    /* language is required for subtitle type but optional otherwise */
    .setLanguage("en-US")
    .build()

val frenchSubtitle = MediaTrack.Builder(2, MediaTrack.TYPE_TEXT)
    .setName("French Subtitle")
    .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
    .setContentId("https://some-url/caption_fr.vtt")
    .setLanguage("fr")
    .build()

val frenchAudio = MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO)
    .setName("French Audio")
    .setContentId("trk0001")
    .setLanguage("fr")
    .build()
자바
MediaTrack englishSubtitle = new MediaTrack.Builder(1 /* ID */,
MediaTrack.TYPE_TEXT)
  .setName("English Subtitle")
  .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
  .setContentId("https://some-url/caption_en.vtt")
  /* language is required for subtitle type but optional otherwise */
  .setLanguage("en-US")
  .build();

MediaTrack frenchSubtitle = new MediaTrack.Builder(2, MediaTrack.TYPE_TEXT)
  .setName("French Subtitle")
  .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
  .setContentId("https://some-url/caption_fr.vtt")
  .setLanguage("fr")
  .build();

MediaTrack frenchAudio = new MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO)
  .setName("French Audio")
  .setContentId("trk0001")
  .setLanguage("fr")
  .build();

트랙 그룹화

여러 트랙을 MediaInfo로 표시되는 미디어 항목으로 그룹화할 수 있습니다. MediaInfo의 인스턴스는 트랙의 배열을 가져와 미디어 항목에 관한 다른 정보를 집계합니다. 이 예를 기반으로 앱은 이러한 세 개의 미디어 트랙을 MediaInfo.Builder.setMediaTracks(List)에 전달하여 미디어 항목에 추가할 수 있습니다. 앱은 미디어를 수신기에 로드하기 전에 이러한 방식으로 MediaInfo에 트랙을 연결해야 합니다.

Kotlin
val tracks: MutableList<MediaTrack> = ArrayList<MediaTrack>()
tracks.add(englishSubtitle)
tracks.add(frenchSubtitle)
tracks.add(frenchAudio)
val mediaInfo = MediaInfo.Builder(url)
    .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
    .setContentType(getContentType())
    .setMetadata(getMetadata())
    .setMediaTracks(tracks)
    .build()
자바
List tracks = new ArrayList();
tracks.add(englishSubtitle);
tracks.add(frenchSubtitle);
tracks.add(frenchAudio);
MediaInfo mediaInfo = MediaInfo.Builder(url)
  .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
  .setContentType(getContentType())
  .setMetadata(getMetadata())
  .setMediaTracks(tracks)
  .build();

트랙 삭제

현재 미디어에서 모든 트랙을 삭제하려면 (예: 예에서는 3개의 자막 사용 중지) MediaInfo.Builder.setMediaTracks(List)를 호출하고 빈 ID 목록을 전달합니다.

트랙 업데이트

앱은 RemoteMediaClient.setActiveMediaTracks(long[])를 호출하고 활성화할 트랙의 ID를 전달하여 미디어 항목과 연결된 하나 이상의 트랙을 활성화할 수 있습니다 (미디어가 로드된 후). 이 예에서는 프랑스어 자막과 프랑스어 오디오를 활성화합니다.

Kotlin
// the ID for the French subtitle is '2' and for the French audio '3'
remoteMediaClient.setActiveMediaTracks(longArrayOf(2, 3))
    .setResultCallback(ResultCallback {
            mediaChannelResult: RemoteMediaClient.MediaChannelResult ->
                if (!mediaChannelResult.status.isSuccess) {
                    Log.e(TAG, "Failed with status code:" +
                            mediaChannelResult.status.statusCode
                    )
                }
    })
자바
// the ID for the French subtitle is '2' and for the French audio '3'
remoteMediaClient.setActiveMediaTracks(new long[]{2, 3})
    .setResultCallback(mediaChannelResult -> {
        if (!mediaChannelResult.getStatus().isSuccess()) {
            Log.e(TAG, "Failed with status code:" +
                    mediaChannelResult.getStatus().getStatusCode());
        }
    });

텍스트 트랙 스타일 지정

TextTrackStyle는 텍스트 트랙의 스타일 지정 정보를 캡슐화합니다. 기존 TextTrackStyle을 만들거나 업데이트한 후에는 다음과 같이 RemoteMediaClient.setTextTrackStyle를 호출하여 현재 재생 중인 미디어 항목에 이 스타일을 적용할 수 있습니다.

Kotlin
// the ID for the French subtitle is '2' and for the French audio '3'
remoteMediaClient.setTextTrackStyle(style)
    .setResultCallback(ResultCallback {
            mediaChannelResult: RemoteMediaClient.MediaChannelResult ->
                if (!mediaChannelResult.status.isSuccess) {
                    Log.e(TAG, "Failed to set the style, status code: " +
                            mediaChannelResult.status.statusCode
                    )
                }
    })
자바
remoteMediaClient.setTextTrackStyle(style)
    .setResultCallback(mediaChannelResult -> {
        if (!mediaChannelResult.getStatus().isSuccess()) {
            Log.e(TAG, "Failed to set the style, status code: " +
                    mediaChannelResult.getStatus().getStatusCode());
        }
    });

앱에서는 사용자가 시스템 또는 앱 자체에서 제공한 설정을 사용하여 텍스트 트랙의 스타일을 업데이트할 수 있도록 허용해야 합니다. Android KitKat 이상에서는 프레임워크에서 제공하는 시스템 전체 자막 설정을 사용할 수 있습니다.

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
자바
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

KitKat 이전 버전의 경우 위 호출은 필드가 정의되지 않은 객체를 반환하므로 사용자 선택 및 일부 기본값에 따라 앱에서 이러한 필드를 채워야 합니다. 다음 텍스트 트랙 스타일 요소의 스타일을 지정할 수 있습니다.

  • 포그라운드 (텍스트) 색상 및 불투명도
  • 배경 색상 및 불투명도
  • 가장자리 유형
  • 가장자리 색상
  • 글꼴 크기
  • 글꼴 모음
  • 글꼴 스타일

예를 들어, 다음과 같이 텍스트 색상을 빨간색 (FF)으로, 불투명도는 50%(80)로 설정합니다.

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
자바
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

KitKat 이상 버전에서는 시스템 전체 자막 설정이 업데이트될 때 알림을 받도록 앱을 등록해야 합니다. 이를 위해 앱에서 CaptioningManager.CaptioningChangeListener를 구현하고 다음을 호출하여 이 리스너를 등록해야 합니다.

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
자바
CaptioningManager.addCaptioningChangeListener(yourChangeListener);

앱에서 자막 설정이 변경되었다는 콜백을 받으면 RemoteMediaClient.setTextTrackStyle를 호출하고 새 스타일을 전달하여 새 설정을 추출하고 현재 재생 중인 미디어의 텍스트 자막 스타일을 업데이트해야 합니다.

상태 업데이트 수신

여러 발신자가 동일한 수신자에 연결되면 이러한 변경사항이 다른 발신자에서 시작되었더라도 각 발신자가 수신자의 변경사항을 인식하는 것이 중요합니다.

이를 위해 앱에서 RemoteMediaClient.ListenerRemoteMediaClient.ProgressListener를 등록해야 합니다.

현재 미디어의 TextTrackStyle가 변경되면 위에 등록된 리스너를 모두 통해 연결된 모든 발신자에게 알림이 전송됩니다. 이 경우 수신기 SDK는 새 스타일이 이전 스타일과 다른지 확인하지 않으며 연결된 모든 발신자에 관계없이 알림을 보냅니다. 그러나 활성 트랙 상태가 변경되면 연결된 발신자의 RemoteMediaClient.ProgressListener에만 알림이 전송됩니다.

CORS 요구사항 충족

적응형 미디어 스트리밍의 경우 Google Cast에는 CORS 헤더가 있어야 하지만, 간단한 mp4 미디어 스트림도 트랙을 포함하는 경우 CORS가 필요합니다. 미디어에 트랙을 사용 설정하려면 트랙 스트림과 미디어 스트림 모두에 CORS를 사용 설정해야 합니다. 따라서 서버의 간단한 mp4 미디어에 사용할 수 있는 CORS 헤더가 없는 상태에서 간단한 자막 트랙을 추가하면 적절한 CORS 헤더를 포함하도록 서버를 업데이트하지 않으면 미디어를 스트리밍할 수 없습니다. 또한 최소한 Content-Type, Accept-Encoding, Range 헤더는 허용해야 합니다. 마지막 두 헤더는 이전에 필요하지 않았을 수 있는 추가 헤더입니다.