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()
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
ด้วยวิธีนี้ก่อนที่จะโหลด
สื่อไปยังเครื่องรับ
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();
นำแทร็กออก
ถ้าต้องการลบแทร็กทั้งหมดออกจากสื่อปัจจุบัน (เช่น ปิดแทร็ก
คำบรรยายในตัวอย่าง) เรียก
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 ) } })
// 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 ) } })
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)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
สำหรับเวอร์ชันก่อน KitKat การเรียกด้านบนจะแสดงออบเจ็กต์ที่ ไม่ได้กำหนด ดังนั้นคุณต้องป้อนข้อมูลในช่องเหล่านั้นในแอปของคุณ เกี่ยวกับการเลือกของผู้ใช้และค่าเริ่มต้นบางส่วน คุณสามารถจัดรูปแบบข้อความต่อไปนี้ได้ องค์ประกอบของรูปแบบแทร็ก:
- สีและความทึบแสงของพื้นหน้า (ข้อความ)
- สีและความโปร่งแสงของพื้นหลัง
- ชนิดขอบ
- สีขอบ
- สเกลแบบอักษร
- ชุดแบบอักษร
- รูปแบบตัวอักษร
ตัวอย่างเช่น ตั้งค่าสีข้อความเป็นสีแดง (FF) ที่มีความทึบแสง 50% (80) ดังนี้
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
ใน KitKat และเวอร์ชันที่ใหม่กว่า คุณควรลงทะเบียนแอปเพื่อรับการแจ้งเตือน
เมื่อมีการอัปเดตการตั้งค่าคำบรรยายทั้งระบบ ในกรณีนี้ คุณต้องทำดังนี้
ติดตั้งใช้งาน
CaptioningManager.CaptioningChangeListener
ในแอปของคุณและลงทะเบียน Listener นี้โดยการโทร:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
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 รายการสุดท้ายคือ ส่วนหัวเพิ่มเติมที่คุณอาจไม่จำเป็นต้องใช้ก่อนหน้านี้