ใช้แทร็กสื่อ

MediaTrack แสดงถึงแทร็กสื่อ ซึ่งอาจเป็นสตรีมเสียง สตรีมวิดีโอ หรือข้อความ (เช่น คำบรรยายหรือคำบรรยายแทนเสียง) แอปของคุณสามารถจัดกลุ่ม จัดรูปแบบ และเปิดใช้งาน แทร็กสื่อ

กำหนดค่าแทร็ก

โดยคุณจะกำหนดค่าแทร็กและกำหนดรหัสที่ไม่ซ้ำกันให้กับแทร็กได้ โค้ดต่อไปนี้จะสร้างแทร็กข้อความภาษาอังกฤษ แทร็กข้อความภาษาฝรั่งเศส และแทร็กเสียงฝรั่งเศส โดยแต่ละรายการจะมีรหัสของตัวเอง

คอตลิน
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();

การติดตามแบบกลุ่ม

คุณจัดกลุ่มหลายๆ แทร็กเป็นรายการสื่อได้ ซึ่งจะแสดงด้วย MediaInfo อินสแตนซ์ของ MediaInfo จะใช้อาร์เรย์ของแทร็กและรวบรวมข้อมูลอื่นๆ เกี่ยวกับรายการสื่อ จากตัวอย่าง แอปของคุณสามารถเพิ่มแทร็กสื่อ 3 แทร็กนั้นลงในรายการสื่อโดยการส่งรายการแทร็ก 3 แทร็กดังกล่าวไปยัง MediaInfo.Builder.setMediaTracks(List) แอปของคุณจำเป็นต้องเชื่อมโยงแทร็กใน MediaInfo ในลักษณะนี้ก่อนจึงจะโหลดสื่อไปยังเครื่องรับได้

คอตลิน
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();

นำแทร็กออก

หากต้องการนำแทร็กทั้งหมดออกจากสื่อปัจจุบัน (เช่น ปิดคำบรรยาย 3 คำในตัวอย่าง) ให้เรียกใช้ MediaInfo.Builder.setMediaTracks(List) แล้วส่งรายการรหัสที่ว่างเปล่า

อัปเดตแทร็ก

แอปของคุณเปิดใช้งานแทร็กอย่างน้อย 1 แทร็กที่เชื่อมโยงกับรายการสื่อได้ (หลังจากโหลดสื่อแล้ว) โดยการเรียกใช้ RemoteMediaClient.setActiveMediaTracks(long[]) และส่งรหัสของแทร็กเพื่อเปิดใช้งาน ตัวอย่างนี้เปิดใช้งานคำบรรยายภาษาฝรั่งเศสและเสียงภาษาฝรั่งเศส

คอตลิน
// 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());
        }
    });

จัดรูปแบบแทร็กข้อความ

TextTrackStyle สรุปข้อมูลการจัดรูปแบบของแทร็กข้อความ หลังจากสร้างหรืออัปเดต TextTrackStyle ที่มีอยู่ คุณจะใช้สไตล์ดังกล่าวกับรายการสื่อที่กำลังเล่นอยู่ได้โดยเรียกใช้ RemoteMediaClient.setTextTrackStyle ดังนี้

คอตลิน
// 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());
        }
    });

แอปของคุณควรอนุญาตให้ผู้ใช้อัปเดตสไตล์สำหรับแทร็กข้อความ โดยใช้การตั้งค่าที่ระบบมีให้หรือจากตัวแอปเอง ใน Android KitKat และเวอร์ชันใหม่กว่า คุณสามารถใช้การตั้งค่าคำบรรยายทั้งระบบตามกรอบการทำงานต่อไปนี้

คอตลิน
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

สำหรับเวอร์ชันก่อน KitKat การเรียกข้างต้นจะแสดงผลออบเจ็กต์ที่ไม่ได้กำหนดช่อง ดังนั้นคุณจะต้องเติมข้อมูลในช่องเหล่านั้นในแอปโดยอิงตามการเลือกของผู้ใช้และค่าเริ่มต้นบางส่วน คุณสามารถจัดรูปแบบองค์ประกอบ รูปแบบแทร็กข้อความต่อไปนี้ได้

  • สีและความทึบแสงเบื้องหน้า (ข้อความ)
  • สีและความโปร่งแสงของพื้นหลัง
  • ชนิดขอบ
  • สีขอบ
  • ขนาดตัวอักษร
  • ชุดแบบอักษร
  • รูปแบบตัวอักษร

ตัวอย่างเช่น ตั้งค่าสีข้อความเป็นสีแดง (FF) และความทึบแสง 50% (80) ดังนี้

คอตลิน
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

ใน KitKat และเวอร์ชันที่ใหม่กว่า คุณควรลงทะเบียนแอปเพื่อรับการแจ้งเตือนเมื่อการตั้งค่าคำบรรยายทั้งระบบได้รับการอัปเดต ด้วยเหตุนี้ คุณจึงต้องติดตั้ง CaptioningManager.CaptioningChangeListener ในแอปและลงทะเบียน Listener นี้โดยเรียกใช้

คอตลิน
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
CaptioningManager.addCaptioningChangeListener(yourChangeListener);

เมื่อแอปได้รับการติดต่อกลับว่าการตั้งค่าคำบรรยายมีการเปลี่ยนแปลง คุณต้องแยกการตั้งค่าใหม่และอัปเดตรูปแบบของคำบรรยายแทนเสียงสำหรับสื่อที่กำลังเล่นอยู่โดยการเรียกใช้ RemoteMediaClient.setTextTrackStyle และส่งผ่านในรูปแบบใหม่

รับการอัปเดตสถานะ

เมื่อผู้ส่งหลายคนเชื่อมต่อกับผู้รับรายเดียวกัน สิ่งสำคัญสำหรับผู้ส่งแต่ละรายคือต้องระวังการเปลี่ยนแปลงในตัวรับแม้ว่าการเปลี่ยนแปลงเหล่านั้นจะเริ่มจากผู้ส่งรายอื่น

แอปของคุณควรลงทะเบียน RemoteMediaClient.Listener และ RemoteMediaClient.ProgressListener เพื่อดำเนินการดังกล่าว

หาก TextTrackStyle ของสื่อปัจจุบันมีการเปลี่ยนแปลง ผู้ส่งที่เชื่อมต่อทั้งหมดจะได้รับแจ้งผ่าน Listener ที่ลงทะเบียนข้างต้นทั้ง 2 รายการ ในกรณีนี้ SDK ของฝั่งผู้รับจะไม่ยืนยันว่าสไตล์ใหม่แตกต่างจากสไตล์ก่อนหน้าหรือไม่ และจะแจ้งเตือนผู้ส่งที่เชื่อมต่อทุกคน อย่างไรก็ตาม หากสถานะของแทร็กที่ใช้งานอยู่มีการเปลี่ยนแปลง จะมีการแจ้งเตือนเฉพาะ RemoteMediaClient.ProgressListener ในผู้ส่งที่เชื่อมต่อเท่านั้น

ปฏิบัติตามข้อกำหนด CORS

สำหรับการสตรีมสื่อแบบปรับอัตโนมัติ Google Cast กำหนดให้ต้องมีส่วนหัว CORS แต่สตรีมสื่อ mp4 แบบธรรมดาก็ยังต้องใช้ CORS หากมีแทร็กรวมอยู่ด้วย หากต้องการเปิดใช้แทร็กสำหรับสื่อใดก็ตาม คุณต้องเปิดใช้ CORS สำหรับทั้งสตรีมแทร็กและสตรีมสื่อ ดังนั้นหากคุณไม่มีส่วนหัว CORS สำหรับสื่อ mp4 แบบธรรมดาในเซิร์ฟเวอร์ แล้วเพิ่มแทร็กคำบรรยายแบบธรรมดา คุณจะไม่สามารถสตรีมสื่อได้ เว้นแต่ว่าจะอัปเดตเซิร์ฟเวอร์ให้รวมส่วนหัว CORS ที่เหมาะสม นอกจากนี้ คุณต้องอนุญาตส่วนหัวต่อไปนี้เป็นอย่างต่ำ: Content-Type, Accept-Encrypting และ Range โปรดทราบว่าส่วนหัว 2 รายการสุดท้ายเป็นส่วนหัวเพิ่มเติมที่คุณอาจไม่จำเป็นต้องใช้ก่อนหน้านี้