Google Cast(Chromecast)浏览器 SDK 学习笔记(一)

2023-11-16

前几天因为京东打折,买了个索尼的 SRS-X77 音箱,看说明书说支持 Google Cast,试了试感觉还挺好用,于是研究了一下 Google Cast 的 SDK。

Chromecast、Google Cast 傻傻分不清楚?

Google 在 2013 年推出了一个叫 Chromecast 的硬件,它运行一个精简版的 Chrome OS,用户可以使用手机或者电脑(Chrome 浏览器)来控制它播放网络或者本地的视频、照片等。Google 随之发布了适用于 iOS、Android 和 Chrome 浏览器的 SDK。2015 年,Google 又发布了 Chromecast Audio,它没有 HDMI 接口,只能播放音频。Google 给Chromecast 使用的这套技术命名为 Google Cast。

也就是说, Chromecast 是 Google 推出的硬件产品的名称,Google Cast 指的是是这套通过网络播放媒体技术,比如对应苹果的 AirPlay。除了 Chromecast 系列硬件本身,Android TV 也支持作为 Google Cast 的接收端,此外,索尼、LG 等厂商也制造了一些支持 Google Cast 的音响系统,当然也就包含了我买的索尼 SRS-X 系列。

Google Cast 大致工作原理

发送端 app(sender app)使用 SDK,将需要播放的媒体的信息发送到 Google 的服务器,服务器再通知接收端播放(所以发送端和接收端必须都可以访问 Google 的服务器才行)。接收端运行的是一个浏览器,它会根据发送端的app ID和媒体信息,去载入对应的一个网页这个网页(receiver app)也是由发送端 app 的开发者提供的,的将会负责播放相应的媒体内容。即使接收端时 Chromecast Audio 之类只能播放音频的硬件,这个网页也是会载入并渲染的。

Google Cast 和 DLNA 或者苹果的 AirPlay 不同之处,一是依赖 Google 的服务器,也就是说必须连接到 Internet 才可以用,如果只有一个局域网是不行的。二是前两个的接收端播放器接收端本身提供的,开发者只需要提供要播放的内容就可以,但是 Google Cast 则是需要提供自己的receiver app,这样的好处是开发者可以高度定制(比如可以定制UI,或者加入弹幕、歌词滚动、音乐可视化之类复杂功能),虽然接收端往往运行的并不是Android这样的开放操作系统,但是因为receiver app的本质是网页,所以开发难度并不高。

不过,如果你不需要定制化的receiver app,Google也提供了一套默认的receiver app,拥有最基本的音视频播放的功能。

当然,以上只是根据我对 Google 的文档的理解总结的,如果有什么错误请指出。

Google Cast 一些概念的介绍

  • 发送端(sender)
    可以是Chrome 浏览器(电脑版或者 Android 版)、Android 设备、iOS 设备。

  • 发送端 app(sender app)
    使用了 Google Cast SDK 的 app,可以是 web app(网页)也可以是 Android 或 iOS app。

  • 接收端(receiver)
    支持作为接收端的硬件,如Chromecast、机顶盒、音箱、电视之类。

  • 接收端 app(receiver app)
    接收端上运行的 app,由 sender 指定的 app ID 决定,其本质是网页,接收端上的浏览器将其载入并执行。

  • session
    Sender 首先要跟特定的 receiver 建立 session 才能相互通信。建立 session 对于用户来说就是“设备配对”的过程。

  • media
    Session 建立后,Sender 可以使用 session 的 loadMedia 方法来告诉 receiver 播放媒体。如果 loadMedia 成功,Sender 会获得一个 media 对象。该对象反映了receiver app正在播放的媒体,其中包含了播放状态,播放队列等信息。

使用 SDK 制作一个简单的 sender app

下面我们跟着官方教程,用 Chrome 浏览器的 SDK(Javascript)制作一个简单的 sender app。因为注册 app ID 要交五美元所以我就直接使用默认的 receiver app 了。

引入 SDK

当然第一步就是在页面中引入 SDK:

<script type="text/javascript" src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"></script>

SDK使用了chrome.cast这个namespace。

初始化:

function onError(error) {
  console.log(error);
}

function onInitSuccess() {
  console.log('API successfully initialized');
}

function initializeCastApi() {
  const appID = chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID;
  const sessionRequest = new chrome.cast.SessionRequest(applicationID);
  const apiConfig = new chrome.cast.ApiConfig(sessionRequest,
    sessionListener,
    receiverListener);
  chrome.cast.initialize(apiConfig, onInitSuccess, onError);
};

window['__onGCastApiAvailable'] = function(loaded, errorInfo) {
  if (loaded) {
    console.log('API available');
    initializeCastApi();
  } else {
    console.log(errorInfo);
  }
}

我们需要监听__onGCastApiAvailable这个自定义事件,来执行 initializeCastApiinitializeCastApi 需要知道我们的 app ID(如果使用默认的 receiver app 则使用 chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID 这个常量。sessionListenerreceiverListener 是什么呢?下面说。

receiverListener 就是当receiver的状态发生改变的时候触发的回调函数。Google Cast 使用 mDNS 协议来实现设备发现,当有receiver被发现或者消失的时候,这个函数想会被触发。比如我们定义一个这样的 receiverListener

let receiverIsAvailable = false;
function receiverListener(receiverAvailability) {
  console.log(`Receiver is ${receiverAvailability}`);
  receiverIsAvailable = (receiverAvailability === chrome.cast.ReceiverAvailability.AVAILABLE);
}

一开始我的音箱处于关机状态,刷新页面,控制台显示:

Receiver is unavailable

然后我把音箱打开,并连接到网络,此时控制台显示:

Receiver is available

可见 receiverListener 的调用是实时的,但是这个函数并不知道有几个 receivers,更不知道 receivers 的具体信息——其唯一参数是一个字符串 unavailable 或者 available,将其与 chrome.cast.ReceiverAvailability.AVAILABLE 常量比较来确定是否available。

sessionListener 是当存在 session 的时候调用的函数。当我们第一次初始化页面的时候,还没有建立 session,所以这个函数并没有被调用,但是如果我们已经建立了 session,那么再次刷新这个页面时,SDK 便会发现已经存在的 session 并调用这个函数。在这个函数中我们可以把 session 存储起来,供以后调用:

let currentSession = null;

function sessionListener(session) {
  currentSession = session;
  console.log('Current session updated');
}

建立 session(设备配对)

function onRequestSessionSuccess(session){
  console.log(session);
  currentSession = session;
  console.log('Current session updated');
}

function requestSession(){
  if(!currentSession){
    chrome.cast.requestSession(onRequestSessionSuccess, onError);
  }
}

设备配对需要客户端主动执行,比如我们可以在页面上放一个按钮,用户按下的时候就执行 requestSession。执行后我们可以看到 Chrome 弹出设备列表,这个列表是 Chrome 浏览器本身提供的:

设备选择界面1

可以看到我的音箱已经跟 Google Play Music 配对了,不过我们需要它跟目前的页面配对,点击音箱名称,然后点击“投射”,音箱就会跟 Play Music 断开然后跟我们这个页面建立 session。

设备选择界面2

如果建立 session 成功就会调用 onRequestSessionSuccess,这个函数跟前面说的 sessionListener 是差不多的。

把 session 打印出来,是这样的:

session

可以看到 session 是由 sender app 和 receiver 决定的,只有我们建立了 session 才能得到具体的 receiver(之前我们只知道 receiver 是否 avilable,不知道 receiver 有哪些),可以知道 receiver 能支持音频还是视频等。当我们再次载入页面的时候,因为 appId 相同,所以初始化阶段就可以触发 sessionListener 我们可以这时就获得 session 而不需要再进行 requestSession 的操作了。注意我的音箱之前跟 Google Play Music 之前有一个 session 但是并没有触发我的页面的 sessionListener,因为 appId 不同。

播放媒体

现在有了 session,我们终于可以命令 receiver 播放媒体了!

let currentMedia = null;

function onMediaDiscovered(how, media) {
  currentMedia = media;
}

function loadMedia(){
  const mediaInfo = new chrome.cast.media.MediaInfo('http://example.com/example.mp3');
  const request = new chrome.cast.media.LoadRequest(mediaInfo);
  session.loadMedia(request,
    onMediaDiscovered.bind(this, 'loadMedia'),
    onError);
}

执行完 loadMedia 不一会,应该就可以听到音箱发出声音了✌️。

返回的 media 对象可以用来控制播放:

currentMedia.pause();
currentMedia.play();
currentMedia.stop();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Cast(Chromecast)浏览器 SDK 学习笔记(一) 的相关文章

随机推荐

  • 启动mongodb数据库 mongo命令时回报计算机拒绝访问

    当你没有启动mongodb数据库的时候 bin目录下输入mongo命令时回报计算机拒绝访问 这个时候解决办法是进入bin目录输入mongodb exe dbpath c data db dbpaht 后面一定要加 双引号 否则会报错误
  • NODE.JS--如何使用Node.js

    简单的说 Node js 就是运行在服务端的 JavaScript Node js 是一个基于Chrome JavaScript 运行时建立的一个平台 Node js是一个事件驱动I O服务端JavaScript环境 基于Google的V8
  • vscode remote server tunnel内网穿透转发tcp,速率10kb每秒

    参考 vscode网页版的正确打开方式 建立tunnel p2p连接 vscode打开网页 怪力左手的博客 CSDN博客 vscode内网穿透 白嫖10M带宽穿透 remote tunnels远程开发插件 不嫖白不嫖 哔哩哔哩 bilibi
  • 深入浅出的讲解傅里叶变换

    作 者 韩 昊 知 乎 Heinrich 微 博 花生油工人 知乎专栏 与时间无关的故事 谨以此文献给大连海事大学的吴楠老师 柳晓鸣老师 王新年老师以及张晶泊老师 转载的同学请保留上面这句话 谢谢 如果还能保留文章来源就更感激不尽了 其实学
  • Ubuntu 安装 CUDA(附测试)

    为深度学习所用 博主预想在Ubuntu16 04上安装 显卡驱动 CUDA cuDNN Tensorflow gpu Keras PyCharm 参考了众多资料 最终成功将所有软件安装完毕 且能成功运行使用 该篇博客介绍了CUDA的安装教程
  • 2023-详解实时数仓建设

    一 实时数仓建设背景 1 实时需求日趋迫切 目前各大公司的产品需求和内部决策对于数据实时性的要求越来越迫切 需要实时数仓的能力来赋能 传统离线数仓的数据时效性是 T 1 调度频率以天为单位 无法支撑实时场景的数据需求 即使能将调度频率设置成
  • 接口优化从哪些方面入手?

    关注公众号 1024个为什么 及时接收最新推送文章 1 背景 新接手的一个服务 对整个服务熟悉后 发现调用量 TOP1 的一个接口 完全超乎我对这个接口使用场景的预期 预期几万的接口 实际调用量近 400万 和调用方交涉后 暂时无法推动调用
  • Conexant Bt878驱动及视频软件开发

    目录 1 前言 2 驱动开发 3 视频软件开发 3 1 DX SDK版本选择 3 2 directshow开发 4 寄存器配置 5 参考资料 1 前言 本文是对基于Conexant Bt878进行的驱动开发和软件开发进行的整理论述 驱动是基
  • java项目如何远程调试

    唠嗑部分 很多java开发的小伙伴不知道java项目如何远程调试 每次出现环境问题都会十分纠结 只能在源代码中通过一行一行的日志去排查 即没有技术含量也浪费时间 今天来说一说 java项目如何远程debug Java XDebug 远程de
  • <微机与接口技术>51单片机的指令系统——数据传送与交换指令

    重要指令符号 Rn 当前工作寄存器组中的R0 R7 Ri 当前工作寄存器组中的R0 R1 rel 相对偏移量 在相对转移指令中使用 位一字节补码 寻址方式 七种分别是立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址
  • 超详细的springBoot学习教程

    springBoot学习 https docs spring io spring boot docs 2 2 6 RELEASE reference html index html 官方文档 1 搭建springBoot项目架构 2 spr
  • C#执行JavaScript脚本

    目录 安装和配置 执行 JavaScript 脚本 与脚本交互 JS 调用 C 方法 多线程使用 总结 ClearScript 是一个 NET 平台下的开源库 用于在 C 和其他 NET 语言中执行脚本代码 它提供了一种方便和安全的方法来将
  • Windows操作系统知识合集

    Windows操作系统的权限 Guest权限 User权限 人类可用普通权限 Administrator 人类可用最高权限的用户 System 系统 机器可用最高权限 比人类权限高更多 TrustInstaller 操作系统的最高权限 比S
  • Aggressive cows-疯牛POJ(2456)-详解

    描述 农夫 John 建造了一座很长的畜栏 它包括N 2 lt N lt 100 000 个隔间 这些小隔间依次编号为x1 xN 0 lt xi lt 1 000 000 000 但是 John的C 2 lt C lt N 头牛们并不喜欢这
  • verilog-mode的简要介绍

    verilog mode是什么 官网的介绍 https www veripool org wiki verilog mode Verilog mode el is the extremely popular free Verilog mod
  • 静态代理模式

    1 所谓的静态代理模式应该就是把大家都会做的相同的事情交给代理去做 2 而一定要自己做的事就在代理中传入一个自己的对象再在代理的类中的该方法中调用自己的方法 3 将所有需要自己完成的方法放在一个接口中然后自己和代理都去继承他 代理还会添加一
  • invalid resource directory name

    遇到错误 当有res navigation的时候 反编译打包回apk的时候会报错 invalid resource directory name res navigation 或者是 invalid resource directory n
  • 【CV】第 15 章:结合计算机视觉和 NLP 技术

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • pc微信禁止启动小程序

    场景 最近 Windows 微信的更新了可以访问小程序的功能 但还不完善 如 尝试播放激励视频时 会直接跳过视频并作为已完成处理等 身为开发者的我们可能需要做一些处理 禁止pc的微信访问小程序 以达到减小损失的目的 提要 App onLau
  • Google Cast(Chromecast)浏览器 SDK 学习笔记(一)

    前几天因为京东打折 买了个索尼的 SRS X77 音箱 看说明书说支持 Google Cast 试了试感觉还挺好用 于是研究了一下 Google Cast 的 SDK Chromecast Google Cast 傻傻分不清楚 Google