MediaTrack
mewakili trek media, yang dapat berupa streaming audio, streaming video, atau teks
(seperti subtitel atau teks tertutup). Aplikasi Anda dapat mengelompokkan, menata gaya, dan mengaktifkan
trek media.
Mengonfigurasi trek
Anda dapat mengonfigurasi jalur dan menetapkan ID unik ke jalur tersebut. Kode berikut membuat trek teks berbahasa Inggris, trek teks bahasa Prancis, dan trek audio bahasa Prancis, masing-masing dengan ID mereka 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 trek ke dalam item media, yang diwakili oleh
MediaInfo
Instance MediaInfo
mengambil berbagai trek dan menggabungkan informasi lain tentang item media tersebut.
Berdasarkan contoh, aplikasi Anda dapat menambahkan tiga trek media tersebut ke media
dengan meneruskan daftar ketiga trek tersebut ke
MediaInfo.Builder.setMediaTracks(List)
Aplikasi Anda perlu mengaitkan jalur di MediaInfo
dengan cara ini sebelum dimuat
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 mematikan tiga
sub judul dalam contoh), panggil
MediaInfo.Builder.setMediaTracks(List)
dan meneruskan daftar ID kosong.
Perbarui jalur
Aplikasi Anda dapat mengaktifkan satu atau beberapa jalur yang terkait dengan 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()); } });
Mengatur gaya trek teks
TextTrackStyle
mengenkapsulasi informasi gaya visual dari trek teks. Setelah membuat atau memperbarui
TextTrackStyle yang sudah ada, Anda dapat menerapkan gaya tersebut ke
item media 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 memungkinkan pengguna untuk memperbarui gaya untuk trek teks, baik menggunakan pengaturan yang disediakan oleh sistem atau oleh aplikasi itu sendiri. Di Android KitKat dan di lain waktu, Anda dapat menggunakan setelan teks tertutup di seluruh sistem yang disediakan oleh kerangka kerja:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
Untuk versi sebelum KitKat, panggilan di atas akan menampilkan objek yang kolom belum ditentukan, jadi Anda harus mengisi kolom tersebut di aplikasi, berdasarkan pilihan pengguna dan beberapa nilai default. Anda dapat menata gaya teks berikut elemen gaya trek:
- Warna dan opasitas latar depan (teks)
- 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) sebagai berikut:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
Di KitKat dan versi yang lebih baru, Anda harus mendaftarkan aplikasi untuk mendapatkan notifikasi
saat setelan teks tertutup di seluruh sistem diperbarui. Untuk mencapai tujuan ini, Anda perlu
terapkan
CaptioningManager.CaptioningChangeListener
dalam aplikasi Anda dan daftarkan pemroses ini dengan memanggil:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
Ketika aplikasi Anda menerima panggilan balik bahwa setelan teks telah berubah, Anda
kemudian perlu mengekstrak pengaturan
baru dan memperbarui gaya teks
teks untuk media yang sedang diputar dengan memanggil
RemoteMediaClient.setTextTrackStyle
dan meneruskan gaya baru.
Terima info terbaru terkait status
Ketika beberapa pengirim terhubung ke penerima yang sama, penting untuk setiap pengirim mengetahui perubahan pada penerima bahkan jika perubahan itu dimulai dari pengirim lain.
Untuk mencapai hal ini, aplikasi Anda harus mendaftarkan
RemoteMediaClient.Listener
dan
RemoteMediaClient.ProgressListener
.
Jika
TextTrackStyle
perubahan media saat ini, maka semua pengirim yang terhubung akan diberi tahu
melalui kedua pemroses terdaftar di atas. Dalam hal ini, SDK penerima
tidak memverifikasi apakah gaya baru berbeda dari gaya sebelumnya dan
memberi tahu semua pengirim
yang terhubung. Namun, jika status
perubahan jalur aktif, hanya RemoteMediaClient.ProgressListener
dalam
pengirim yang terhubung akan diberi tahu.
Memenuhi persyaratan CORS
Untuk streaming media adaptif, Google Cast memerlukan keberadaan CORS, tetapi bahkan file mp4 sederhana aliran media memerlukan CORS jika menyertakan Trek. Jika Anda ingin mengaktifkan Lagu untuk media apa pun, Anda harus mengaktifkan CORS untuk streaming lagu dan media Anda feed. Jadi, jika Anda tidak memiliki header CORS untuk media mp4 sederhana di server Anda, dan kemudian Anda menambahkan trek sub judul sederhana, Anda tidak akan dapat untuk melakukan streaming media kecuali Anda memperbarui server header CORS. Selain itu, Anda harus mengizinkan setidaknya header berikut: Content-Type, Accept-Encoding, dan Range. Perhatikan bahwa dua {i>header<i} terakhir adalah {i>header<i} tambahan yang mungkin tidak diperlukan sebelumnya.