ย้ายข้อมูลไปยังผู้รับเว็บ

คําแนะนํานี้จะอธิบายวิธีย้ายข้อมูลแอป Cast Receiver v2 ไปยังแอป Web Receiver ล่าสุด

SDK เฟรมเวิร์กแอปพลิเคชัน (CAF) ใหม่หรือที่เรียกว่า Web Receiver v3 เป็นการอัปเกรดที่สําคัญจาก SDK ผู้รับ v2 SDK ตัวรับเว็บมี SDK ที่ใช้งานง่ายและมีประสิทธิภาพสําหรับการพัฒนาแอปพลิเคชันตัวรับสื่อสื่อ

Web Receiver จะให้ API ที่สอดคล้องกับ API ของผู้ส่ง CAF ใหม่มากกว่า โดยเป็นการรวมโปรแกรมเล่นอย่างเต็มรูปแบบ (MPL และ Shaka) ตลอดจนการใช้งานและการสนับสนุนทั้งหมดสําหรับสื่อแคสต์และคําสั่งเสียง Google Assistant CAF SDK ยังมี UI เริ่มต้นที่จัดรูปแบบด้วย CSS ได้อย่างง่ายดาย และบริการเชื่อมโยงข้อมูลเพื่อลดความซับซ้อนของการใช้งาน UI

ทําไมจึงต้องย้ายข้อมูล

การย้ายข้อมูลแอปพลิเคชัน Receiver v2 ไปยัง Web Receiver อาจทําให้โค้ดจํานวนมากที่เกี่ยวข้องกับโปรแกรมเล่นหายไป คุณจึงมีสมาธิกับการเขียนตรรกะทางธุรกิจเฉพาะแอปพลิเคชัน

CAF ผสานรวมโปรแกรมเล่น MPL และ Shaka อย่างราบรื่นเพื่อรองรับเนื้อหาประเภทต่างๆ ได้มากยิ่งขึ้น เช่น HTTP Live Streaming (TS และ CMAF), MPEG-DASH, Smooth Streaming และประเภทที่พร็อพเพอร์ตี้แหล่งที่มาขององค์ประกอบสื่อ (MP3, MP4, Icecast ฯลฯ) รองรับ ดูรายการทั้งหมดได้ในสื่อที่รองรับ Google Cast ปัจจุบัน CAF ไม่รองรับโปรแกรมเล่นที่ผู้ใช้ให้ไว้

การย้ายข้อมูลไปยัง CAF จะเพิ่มการรองรับการควบคุมด้วยเสียงด้วย Google Assistant ระบบจะรองรับคําสั่งเสียง Google Assistant ใหม่โดยอัตโนมัติเมื่อใช้ CAF

นอกจากการรองรับคําสั่งสื่อใหม่ เช่น "เปลี่ยนแทร็กตามภาษา" และ "เปลี่ยนอัตราการเล่น" แล้ว CAF ยังรองรับคิวที่ดีขึ้น การรองรับโฆษณาในตัว และการสนับสนุนแบบเรียลไทม์ได้ดียิ่งขึ้น

สิ่งที่เปลี่ยนแปลง

Web Receiver API พยายามปฏิบัติตามรูปแบบที่ผู้ส่ง CAF แนะนําสําหรับ Android และ iOS และแตกต่างจาก v2

ตัวรับเว็บใช้เนมสเปซใหม่ cast.framework แทนเนมสเปซ cast.receiver สําหรับ API ทั้งหมดที่เปิดเผย ออบเจ็กต์ข้อมูลจํานวนมากที่ v2 ใช้นั้นเหมือนกันใน CAF และจะแสดงภายใต้เนมสเปซ cast.framework.messages (ส่วนใหญ่อยู่ภายใต้ cast.receiver.media)

บริการ v2 ต่อไปนี้จะถูกแทนที่ด้วยบริการ CAF ที่เกี่ยวข้อง

  • CastReceiverManager คลาสจะแทนที่ด้วย CastReceiverContext ซึ่งเป็นกระบวนการจัดการเซสชันการแคสต์ ผู้ส่ง การส่งข้อความที่กําหนดเอง และเหตุการณ์ในระบบทั่วโลก คุณใช้ CastReceiverOptions เพื่อมอบตัวเลือกแอปพลิเคชันส่วนกลาง (เช่น คิว เวอร์ชันผู้รับ การกําหนดค่าการเล่น ฯลฯ) ให้บริบทได้
  • คลาส MediaManager จะแทนที่ด้วย PlayerManager ซึ่งเป็นพร็อพเพอร์ตี้ของ CastReceiverContext Singleton และจะจัดการเซสชันสื่อ คําขอสื่อ คําขอเสียงของ Google Assistant (CommandAndControlManager ใน v2) และเริ่มทํางานเหตุการณ์สื่อ การกําหนดค่าสําหรับโปรแกรมเล่น (cast.player.api.Host ใน MPL) ให้บริการโดย PlaybackConfig ซึ่งให้บริการทั่วโลกหรือตามคําขอโหลดก็ได้

PlayerManager ยังเผยให้เห็นคลาสย่อยของผู้จัดการย่อยด้วย

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

// Set global options.
const options = new cast.framework.CastReceiverOptions();
options.versionCode = DEVELOPERS_APP_VERSION;

context.start(options);

ตรรกะทางธุรกิจของผู้รับ

ตัวแฮนเดิลเหตุการณ์ที่เปิดเผยของตัวรับสัญญาณ v2 (เช่น CastReceiverManager.onReady หรือ MediaManager.onLoad) เพื่อเพิ่มตรรกะทางธุรกิจ ใน CAF ระบบจะแทนที่ Listener เหตุการณ์ด้วย Listener เหตุการณ์ (CastReceiverContext.addEventListener) และตัวทริกเกอร์ข้อความ (PlayerManager.setMessageInterceptor) ตัวรับสัญญาณสามารถมี Listener เหตุการณ์หลายรายการได้ (Listener จะไม่ส่งผลต่อเหตุการณ์) และตัวแทรก 1 ตัวต่อข้อความ ตัวสกัดกั้นสามารถอัปเดตคําขอหรือจัดการได้ (แสดงคําขอที่แก้ไข ข้อความสําเร็จ หรือข้อความแสดงข้อผิดพลาด) และอาจเป็นเครื่องจัดการแบบไม่พร้อมกันซึ่งให้คํามั่นสัญญาได้

ตัวสกัดกั้นคําขอโหลดเป็นตําแหน่งที่พบบ่อยที่สุดในการเพิ่มตรรกะเฉพาะแอปพลิเคชัน สําหรับคําขอโหลดจากผู้ส่ง ตัวโหลดการโหลดสามารถแปลง Content ID เป็น URL เนื้อหาได้ นอกจากนี้ยังมีการเรียกตัวโหลดการโหลดสําหรับคําขอโหลดล่วงหน้าและแคชล่วงหน้า หากไม่มีการจัดหาตัวขัดขวางที่ชัดเจนสําหรับการโหลดล่วงหน้าหรือแคชล่วงหน้า

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    request => {
      // Resolve entity to content id
      if (request.media.entity && !request.media.contentId) {
        return getMediaByEntity(request.media.entity).then(
            media => {
              request.media.contentId = media.url;
              return request;
            });
      }
      return request;
    });

ระบบจะแทนที่ตัวแฮนเดิลสถานะสื่อที่กําหนดเอง v2 ด้วยตัวสกัดกั้นข้อความสําหรับข้อความสถานะสื่อ แอปผู้รับเว็บที่ไม่ต้องการให้ URL สื่อแสดงในสถานะสื่อสามารถให้รีโซลเวอร์ URL (PlayerManager.setMediaUrlResolver) ซึ่งให้ URL ของสื่อสําหรับคําขอโหลด CAF จะใช้ URL ดังกล่าวภายใน และไม่ได้ระบุไว้ในสถานะสื่อ

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.MEDIA_STATUS,
    status => {
      // Disable seek.
      status.supportedMediaCommands &=
          ~cast.framework.messages.Command.SEEK
      return status;
    });

กิจกรรม

ผู้รับเว็บมีชุดเหตุการณ์ที่ครอบคลุมทั้งจาก CastReceiverContext และ PlayerManager แอป Web Receiver สามารถมี Listener ได้หลายเหตุการณ์และยังให้ Listener รายการเดียวกับหลายเหตุการณ์ได้ด้วย (ดูเหตุการณ์บางส่วนใน cast.framework.events.category)

เหตุการณ์ดังกล่าวครอบคลุมคําขอของผู้ใช้ ความคืบหน้าในการเล่น การประมวลผลโปรแกรมเล่น และเหตุการณ์องค์ประกอบสื่อระดับต่ํา (CAF ไม่เปิดเผยองค์ประกอบสื่อ)

แอป Web Receiver จะเพิ่ม Listener เหตุการณ์เพื่อดําเนินการได้ (เช่น เพิ่มคําจํากัดความแทร็กข้อความเมื่อโหลดเสร็จสมบูรณ์) หรือสําหรับข้อมูลวิเคราะห์

// Log all media commands
playerManager.addEventListener(
    cast.framework.events.category.REQUEST,
    event => logEvent(event.type));

รถบัสข้อความที่กําหนดเอง

CAF จะไม่แสดงรถบัสข้อความใน API แต่ให้ CastReceiverContext.addCustomMessageListener เพิ่ม Listener ข้อความสําหรับเนมสเปซที่เฉพาะเจาะจง (เฉพาะต่อเนมสเปซ) และCastReceiverContext.sendCustomMessage เพื่อส่ง ต้องมีการประกาศเนมสเปซทั้งหมดก่อนเริ่มต้นตัวรับเว็บ (กล่าวคือ ก่อนเรียกใช้ CastReceiverContext.start) ประกาศเนมสเปซได้โดยการเพิ่ม Listener ข้อความ หรือตั้งเป็นตัวเลือกเริ่มต้นใน CastReceiverOptions.customNamespaces

const options = new cast.framework.CastReceiverOptions();
options.customNamespaces = {
    CUSTOM_NS: cast.framework.system.MessageType.JSON
};
context.start(options);

context.sendCustomMessage(CUSTOM_NS, {
  type: 'status'
  message: 'Playing'
});

UI เริ่มต้น

CAF มี UI ตัวรับสัญญาณเริ่มต้นของเว็บที่แสดงแถบความคืบหน้าการเล่นและข้อมูลเมตาของสื่อตามที่จําเป็น UI เริ่มต้นอยู่ในรูปแบบองค์ประกอบที่กําหนดเอง (<cast-media-player>) สามารถจัดรูปแบบด้วยสไตล์ CSS ได้

<style>
   cast-media-player { --splash-image: url("splash.png"); }
</style>
<cast-media-player></cast-media-player>

หากต้องการปรับแต่งเพิ่มเติม แอป Web Receiver จะใช้ UI ของตนเองได้ ตัวรับสัญญาณเว็บมีคลาส cast.framework.ui.PlayerDataBinder ในการเชื่อมโยงออบเจ็กต์ UI กับสถานะการเล่นของตัวรับเว็บ