Medya Kanalları'nı kullanma

MediaTrack Ses akışı, video akışı veya metin olabilecek bir medya parçasını temsil eder (ör. altyazılar). Uygulamanız gruplandırabilir, biçimlendirebilir ve etkinleştirebilir medya parçaları.

Kanal yapılandırma

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

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

Parçaları gruplandır

Birden fazla parçayı, medya öğesi olarak gruplandırabilirsiniz. Bu öğe, MediaInfo. MediaInfo örneği bir dizi parçayı alır ve medya öğesiyle ilgili diğer bilgileri toplar. Örneği temel alarak, uygulamanız bu üç medya kanalını bir medyaya ve bu üç parçanın bir listesini MediaInfo.Builder.setMediaTracks(List). Uygulamanızın yüklenmeden önce MediaInfo ile kanalları bu şekilde ilişkilendirmesi gerekiyor medyayı alıcıya ulaştırmak istiyorum.

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 (örneğin, üçünü altyazı varsa) MediaInfo.Builder.setMediaTracks(List) ve boş bir kimlik listesi iletin.

Parçaları güncelleme

Uygulamanız medyayla ilişkilendirilmiş bir veya daha fazla kanalı etkinleştirebilir öğesine (medya yüklendikten sonra) RemoteMediaClient.setActiveMediaTracks(long[]) etkinleştirilecek parçaların kimliklerini aktarmalıdır. Bu örnek, şu özelliği etkinleştirir: Fransızca altyazı ve Fransızca ses:

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ının stilini ayarlama

TextTrackStyle bir metin parçasının stil bilgilerini içerir. Oluşturduktan veya güncelledikten sonra mevcut bir TextTrackStyle'ı seçerseniz bu stili çağırarak medya öğesi RemoteMediaClient.setTextTrackStyle aşağıdaki gibidir:

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 Android KitKat'ta ve sonrası alt yazılar için Yönetici tarafından sağlanan sistem genelinde altyazı ayarlarını çerçeve:

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

KitKat'tan önceki sürümler için yukarıdaki çağrı, alanları tanımlanmamış olduğundan, bu alanları kontrol etmek için kullanıcı seçimlerine ve bazı varsayılan değerlere göre değişir. Aşağıdaki metni biçimlendirebilirsiniz stil öğelerini izleyin:

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

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

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

KitKat ve sonraki sürümlerde, bilgilendirilmek için uygulamanızı kaydetmeniz gerekir Altyazı ayarları güncellendiğinde. Bu amaca ulaşmak için uygulamak CaptioningManager.CaptioningChangeListener ve şunu arayarak bu dinleyiciyi kaydedin:

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

Uygulamanız altyazı ayarlarının değiştirildiğine dair bir geri arama aldığında yeni ayarları çıkarması ve metin stilinin şu anda oynatılan medyanın altyazısı RemoteMediaClient.setTextTrackStyle geçiyorum.

Durum güncellemelerini alın

Aynı alıcıya birden fazla gönderici bağlı olduğunda aşağıdakiler önemlidir: alıcıdaki değişikliklerden haberdar olmasını sağlamak için diğer gönderenlerden başlatıldı.

Bu doğrultuda, uygulamanız RemoteMediaClient.Listener ve RemoteMediaClient.ProgressListener.

Öğe TextTrackStyle tüm bağlı gönderenlere bildirim gönderilir. her ikisi aracılığıyla edinilebilir. Bu durumda alıcı SDK yeni stilin öncekinden farklı olup olmadığını doğrulamaz ve tüm bağlı gönderenlere bildirim gönderir. Ancak, etkin kanal değişiklikleri, yalnızca RemoteMediaClient.ProgressListener bağlı gönderenlere bildirim gönderilir.

CORS şartlarını karşılama

Google Cast, uyarlanabilir medya akışı için CORS üstbilgileri, hatta basit bir mp4 dosyası bile Parça içeren medya akışları için CORS Parçalar özelliğini etkinleştirmek istiyorsanız izin istiyorsanız hem parça akışlarınız hem de medyanız için CORS'yi etkinleştirmeniz gerekir akışlar. Bu nedenle, basit mp4 medyanız için CORS başlıkları yoksa, basit bir altyazı parçası eklerseniz medyanızı akış şeklinde aktarmanızı sağlar. Bunun için sunucunuzu uygun CORS başlığı. Ayrıca, en azından aşağıdaki başlıklara izin vermeniz gerekir: Content-Type, Accept-Encoding ve Range. Son iki başlığın daha önce ihtiyaç duymadığınız ek başlıklar kullanabilirsiniz.