Medya Kanalları'nı kullanma

MediaTrack; ses akışı, video akışı veya metin (altyazı gibi) olabilecek bir medya parçasını temsil eder. Uygulamanız, medya kanallarını gruplandırabilir, biçimlendirebilir ve etkinleştirebilir.

Kanal yapılandırma

Bir kanalı yapılandırabilir ve bu kanala benzersiz bir kimlik atayabilirsiniz. Aşağıdaki kod, her biri kendi kimliğine sahip bir İngilizce metin parçası, bir Fransızca metin parçası ve bir Fransızca ses parçası oluşturur:

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()
Java
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();

Grup kanalları

Birden fazla kanalı, MediaInfo ile temsil edilen bir medya öğesinde gruplandırabilirsiniz. MediaInfo örneği, bir parça dizisi alır ve medya öğesiyle ilgili diğer bilgileri toplar. Örneğe dayanarak, uygulamanız bu üç medya kanalını, bu üç kanalın listesini MediaInfo.Builder.setMediaTracks(List)'e ileterek bir medya öğesine ekleyebilir. Uygulamanızın, medyayı alıcıya yüklemeden önce kanalları bir MediaInfo içinde bu şekilde ilişkilendirmesi gerekir.

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()
Java
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();

Kanalları kaldır

Mevcut medyadaki tüm parçaları kaldırmak için (ör. örnekteki üç altyazıyı kapatmak) MediaInfo.Builder.setMediaTracks(List) numaralı telefonu arayın ve boş bir kimlik listesi iletin.

Kanalları güncelle

Uygulamanız, RemoteMediaClient.setActiveMediaTracks(long[]) çağrısı yaparak ve etkinleştirilecek parçaların kimliklerini ileterek medya öğesiyle ilişkilendirilmiş bir veya daha fazla kanalı etkinleştirebilir (medya yüklendikten sonra). Şu örnekte Fransızca altyazı ve Fransızca ses etkinleştiriliyor:

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
                    )
                }
    })
Java
// 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());
        }
    });

Metin parçaları için stil oluşturma

TextTrackStyle, bir metin parçasının stil bilgilerini içerir. Mevcut bir TextTrackStyle oluşturduktan veya güncelledikten sonra, RemoteMediaClient.setTextTrackStyle çağrısı yaparak bu stili şu anda oynatılan medya öğesine uygulayabilirsiniz:

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
                    )
                }
    })
Java
remoteMediaClient.setTextTrackStyle(style)
    .setResultCallback(mediaChannelResult -> {
        if (!mediaChannelResult.getStatus().isSuccess()) {
            Log.e(TAG, "Failed to set the style, status code: " +
                    mediaChannelResult.getStatus().getStatusCode());
        }
    });

Uygulamanız, kullanıcıların sistem veya uygulamanın kendisi tarafından sağlanan ayarları kullanarak metin kanallarının stilini güncellemesine izin vermelidir. Android KitKat ve sonraki sürümlerde, çerçevenin sağladığı sistem genelinde altyazı ayarlarını kullanabilirsiniz:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

KitKat'tan önceki sürümlerde yukarıdaki çağrı, alanları tanımlanmamış bir nesne döndürür. Bu nedenle, uygulamanızdaki bu alanları kullanıcı seçimlerine ve bazı varsayılan değerlere göre doldurmanız gerekir. Aşağıdaki metin izleme stili öğelerinin stilini belirleyebilirsiniz:

  • Ön plan (metin) rengi ve opaklığı
  • Arka plan rengi ve şeffaflık
  • Kenar türü
  • Kenar Rengi
  • Yazı Tipi Ölçeği
  • Yazı Tipi Ailesi
  • Yazı Tipi Stili

Örneğin, metin rengini% 50 opaklık (80) ile kırmızı (FF) olarak aşağıdaki gibi ayarlayın:

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

KitKat ve sonraki sürümlerde, sistem genelindeki altyazı ayarları güncellendiğinde bildirim almak için uygulamanızı kaydetmeniz gerekir. Bu amaçla, uygulamanıza CaptioningManager.CaptioningChangeListener özelliğini uygulamanız ve aşağıdaki çağrıyı yaparak bu işleyiciyi kaydetmeniz gerekir:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
CaptioningManager.addCaptioningChangeListener(yourChangeListener);

Uygulamanız altyazı ayarlarının değiştiğini belirten bir geri arama aldığında, yeni ayarları çıkarmanız ve şu anda oynatılan medya için RemoteMediaClient.setTextTrackStyle yöntemini çağırıp yeni stilde ileterek metin altyazısının stilini güncellemeniz gerekir.

Durum güncellemelerini alın

Birden fazla gönderici aynı alıcıya bağlandığında, değişiklikler diğer gönderenlerden gelmiş olsa bile her gönderenin alıcıdaki değişikliklerden haberdar olması önemlidir.

Buna uygun olarak uygulamanız RemoteMediaClient.Listener ve RemoteMediaClient.ProgressListener değerlerini kaydetmelidir.

Mevcut medya öğelerinin TextTrackStyle değeri değişirse bağlı gönderenlerin tümü, yukarıda belirtilen kayıtlı işleyicilerin her ikisi aracılığıyla da bildirim alır. Bu durumda alıcı SDK'sı, yeni stilin önceki stilinden farklı olup olmadığını doğrulamaz ve tüm bağlı gönderenleri bilgilendirir. Ancak etkin kanalların durumu değişirse yalnızca bağlı gönderenlerdeki RemoteMediaClient.ProgressListener bilgilendirilir.

CORS gereksinimlerini karşılayın

Google Cast, uyarlanabilir medya akışı için CORS başlıklarının bulunmasını gerektirir ancak basit mp4 medya akışları bile Parçalar içeriyorsa CORS gerektirir. Herhangi bir medya için Parçalar'ı etkinleştirmek istiyorsanız hem parça akışlarınız hem de medya akışlarınız için CORS'yi etkinleştirmeniz gerekir. Dolayısıyla, sunucunuzda basit mp4 medyanız için CORS başlıkları yoksa ve daha sonra, basit bir altyazı parçası eklerseniz sunucunuzu uygun CORS başlığını içerecek şekilde güncellemediğiniz sürece medya akışı yapamazsınız. Ayrıca, en azından şu üstbilgilere izin vermeniz gerekir: Content-Type, Accept-Encoding ve Range. Son iki üst bilginin, daha önce ihtiyacınız olmayabilecek ek başlıklar olduğunu unutmayın.