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:
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();
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.
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();
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:
// 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()); } });
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:
// 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()); } });
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:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
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:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
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:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
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.