MediaTrack
merepresentasikan trek media, yang dapat berupa streaming audio, streaming video, atau teks
(seperti subtitel atau teks tertutup). Aplikasi Anda dapat mengelompokkan, menata gaya, dan mengaktifkan
jalur media.
Mengonfigurasi jalur
Anda dapat mengonfigurasi jalur dan menetapkan ID unik ke jalur tersebut. Kode berikut membuat trek teks bahasa Inggris, trek teks bahasa Prancis, dan trek audio Prancis, masing-masing dengan ID-nya sendiri:
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();
Trek grup
Anda dapat mengelompokkan beberapa jalur ke dalam item media, yang direpresentasikan oleh
MediaInfo
.
Instance MediaInfo
mengambil array jalur dan menggabungkan informasi lain tentang item media.
Berdasarkan contoh ini, aplikasi Anda dapat menambahkan tiga jalur media tersebut ke item
media dengan meneruskan daftar yang berisi tiga jalur tersebut ke
MediaInfo.Builder.setMediaTracks(List)
.
Aplikasi Anda perlu mengaitkan trek dalam MediaInfo
dengan cara ini sebelum memuat
media ke penerima.
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();
Hapus track
Untuk menghapus semua trek dari media saat ini (seperti menonaktifkan tiga
subtitel dalam contoh), panggil
MediaInfo.Builder.setMediaTracks(List)
dan teruskan daftar ID kosong.
Perbarui lagu
Aplikasi Anda dapat mengaktifkan satu atau beberapa jalur yang terkait dengan item
media (setelah media dimuat), dengan memanggil
RemoteMediaClient.setActiveMediaTracks(long[])
dan meneruskan ID jalur yang akan diaktifkan. Contoh ini mengaktifkan
subtitel bahasa Prancis dan audio bahasa Prancis:
// 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()); } });
Menata gaya trek teks
TextTrackStyle
mengenkapsulasi informasi gaya visual jalur teks. Setelah membuat atau memperbarui
TextTrackStyle yang ada, Anda dapat menerapkan gaya tersebut ke item media
yang sedang diputar dengan memanggil
RemoteMediaClient.setTextTrackStyle
,
seperti ini:
// 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()); } });
Aplikasi Anda harus mengizinkan pengguna memperbarui gaya untuk jalur teks, baik menggunakan setelan yang disediakan oleh sistem atau oleh aplikasi itu sendiri. Di Android KitKat dan yang lebih baru, Anda dapat menggunakan setelan teks tertutup seluruh sistem yang disediakan oleh framework:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
Untuk versi sebelum KitKat, panggilan di atas akan menampilkan objek yang kolomnya tidak ditentukan, sehingga Anda perlu mengisi kolom tersebut di aplikasi, berdasarkan pilihan pengguna dan beberapa nilai default. Anda dapat menata gaya elemen gaya trek teks berikut:
- Warna dan opasitas (teks) latar depan
- Warna dan opasitas latar belakang
- Jenis tepi
- Warna Tepi
- Skala Font
- Jenis Font
- Gaya Font
Misalnya, setel warna teks ke merah (FF) dengan opasitas 50% (80) seperti berikut:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
Di KitKat dan versi yang lebih baru, Anda harus mendaftarkan aplikasi untuk diberi tahu
saat setelan teks tertutup di seluruh sistem diperbarui. Untuk mencapai tujuan ini, Anda harus
menerapkan
CaptioningManager.CaptioningChangeListener
di aplikasi dan mendaftarkan pemroses ini dengan memanggil:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
Saat aplikasi menerima callback bahwa setelan teks telah berubah, Anda
harus mengekstrak setelan baru dan memperbarui gaya teks
teks untuk media yang sedang diputar dengan memanggil
RemoteMediaClient.setTextTrackStyle
dan meneruskan gaya baru.
Menerima pembaruan status
Jika beberapa pengirim terhubung ke penerima yang sama, setiap pengirim harus mengetahui perubahan pada penerima meskipun perubahan tersebut dimulai dari pengirim lain.
Untuk tujuan ini, aplikasi Anda harus mendaftarkan
RemoteMediaClient.Listener
dan
RemoteMediaClient.ProgressListener
.
Jika
TextTrackStyle
media saat ini berubah, semua pengirim yang terhubung akan diberi tahu
melalui kedua pemroses yang terdaftar di atas. Dalam hal ini, SDK penerima
tidak memverifikasi apakah gaya baru berbeda dari gaya sebelumnya dan
akan memberi tahu semua pengirim yang terhubung. Namun, jika status
jalur aktif berubah, hanya RemoteMediaClient.ProgressListener
dalam
pengirim terhubung yang akan diberi tahu.
Memenuhi persyaratan CORS
Untuk streaming media adaptif, Google Cast memerlukan keberadaan header CORS, tetapi bahkan streaming media mp4 sederhana memerlukan CORS jika menyertakan Trek. Jika ingin mengaktifkan Jalur untuk media apa pun, Anda harus mengaktifkan CORS untuk aliran trek dan aliran media. Jadi, jika Anda tidak memiliki header CORS yang tersedia untuk media mp4 sederhana di server, lalu Anda menambahkan trek subtitel sederhana, Anda tidak akan dapat melakukan streaming media kecuali jika server diupdate agar menyertakan header CORS yang sesuai. Selain itu, Anda harus mengizinkan setidaknya header berikut: Content-Type, Accept-Encoding, dan Rentang. Perlu diperhatikan bahwa dua header terakhir adalah header tambahan yang mungkin tidak Anda perlukan sebelumnya.