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

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

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

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

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

จัดกลุ่มแทร็ก

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

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

นำแทร็กออก

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

อัปเดตแทร็ก

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

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

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

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

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

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

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

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

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

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

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

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

Kotlin
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 นอกจากนี้ คุณต้องอนุญาตส่วนหัวต่อไปนี้เป็นอย่างน้อย ประเภทเนื้อหา การเข้ารหัสการยอมรับ และช่วง โปรดทราบว่าส่วนหัว 2 รายการสุดท้ายคือ ส่วนหัวเพิ่มเติมที่คุณอาจไม่จำเป็นต้องใช้ก่อนหน้านี้