Menggunakan Trek Media

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:

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

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.

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

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:

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

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:

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

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:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
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:

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
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:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
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.