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();
แทร็กเป็นกลุ่ม
คุณจัดกลุ่มแทร็กหลายรายการเป็นรายการสื่อได้ ซึ่งนําเสนอโดย 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();
นำแทร็กออก
หากต้องการนําแทร็กทั้งหมดออกจากสื่อปัจจุบัน (เช่น ปิดคําบรรยาย 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 ) } })
// 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
สรุปข้อมูลการจัดรูปแบบของแทร็กข้อความ หลังจากสร้างหรืออัปเดต TextTextStyle ที่มีอยู่แล้ว คุณสามารถนําสไตล์ดังกล่าวไปใช้กับรายการสื่อที่เล่นอยู่ได้โดยเรียกใช้ 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 บรรทัดสุดท้ายคือ ส่วนหัวเพิ่มเติมที่คุณอาจไม่จําเป็นต้องใช้ก่อนหน้านี้