QPlay 协议框架

QPlay设备描述

目前QPlay最新规范为QPlay 2.0,QPlay所有的功能必须遵循UPnP结构体系。在QPlay规范中,QQ音乐应用充当控制点(Control Point),第三方设备充当媒体渲染器(Media Render)。而媒体渲染器必须实现至少四种服务:音视频传输(AVTransport),播放控制(RenderingControl),连接管理(ConnectionManager)三个标准服务;最后一个为QPlay服务,是QPlay规范最核心的服务,包含QPlay播放列表功能,QPlay认证功能,QPlay设置功能等。该规范定义了QPlay设备的最基础的服务,相应的动作和状态变量,第三方设备都应该支持。
在QQ音乐程序启动后
,将广播发送搜索信息查找设备类型为“urn:schemas-upnp-org:device:MediaRenderer”的设备。当QQ音乐发现设备可用时,将读取描述文件。UPnP的设备描述包含几个信息:设备制造商信息、所有的嵌入式设备定义和设备URL,所有的服务列表和控制URL(controlURL)、事件URL(eventURL)等。
QPlay设备还需要一个标签声明其支持QPlay功能:

<qq:X_QPlay_SoftwareCapability xmlns:qq="http://www.tencent.com">QPlay:VersionNumber</qq:X_QPlay_SoftwareCapability>

其中VersionNumber(版本号)描述了设备支持的QPlay版本,版本号的值可以是1或者2,其中的区别见表。

QPlay各版本功能

Services QPlay:1 QPlay:2
AVTranpsort
RenderingControl
ConnectionManager
QPlay N/A
  1. AVTransport 服务

该服务必须符合UPnP设备架构1.0版本(UPnP Device Architecture Version 1.0)。QPlay仅支持部分UPnP音视频传输服务(AVTransport)。该服务主要实现音频流的传输控制。

AVTransport服务在设备描述中的模板:

<serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
<serviceId>urn:upnp-org:service:AVTransport</serviceId>
<controlURL>_urn-schemas-upnp-org-service-AVTransport_control</controlURL>
<eventSubURL>_urn-schemas-upnp-org-service-AVTransport_event</eventSubURL>
  1. RenderingControl 服务

该服务必须符合UPnP设备架构1.0版本(UPnP Device Architecture Version 1.0)。QPlay仅支持部分UPnP播放控制服务(RenderingControl)。该服务使控制点:发现设备所支持的状态变量表;获取任何状态变量当前值;可以改变任何可修改的状态变量;初始化设置。
RenderingControl服务在设备描述中的模板:

<serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
<serviceId>urn:upnp-org:service:RenderingControl</serviceId>
<controlURL>_urn-schemas-upnp-org-service-RenderingControl_control</controlURL>
<eventSubURL>_urn-schemas-upnp-org-service-RenderingControl_event</eventSubURL>
  1. ConnectionManager 服务

QPlay仅支持部分UPnP连接管理服务(ConnectionManager)。该服务使控制点:进行控制点和媒体渲染器之间的能力匹配;查找当前网络中正在进行的相关传输信息;设备之间的连接建立和解除。
QQ音乐应用程序通过连接管理服务(ConnectionManager)的“GetProtocolInfo”动作获取媒体格式信息。QPlay规定设备制造商应该支持的格式有:he-aac v2、he-aac v1、lc-aac、mp3。如果扬声器设备想支持高质量的音乐,应该支持OGG和AAC格式。
ConnectionManager服务在设备描述中的模板:

<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
<serviceId>urn:upnp-org:service:ConnectionManager</serviceId>
<controlURL>_urn-schemas-upnp-org-service-ConnectionManager_control</controlURL>
<eventSubURL>_urn-schemas-upnp-org-service-ConnectionManager_event</eventSubURL>

QPlay服务

QPlay服务是QPlay协议的核心。目前最新版本为QPlay 2.0,QPlay 2.0主要特点有:队列(Queue),认证(Authentication),安装(Setup)。

QPlay服务在设备描述中的模板:

<serviceType>urn:schemas-tencent-com:service:QPlay:1</serviceType>
<serviceId>urn:tencent-com:serviceId:QPlay</serviceId>
<controlURL>/QPlay/Control</controlURL>
<eventSubURL>/QPlay/Event</eventSubURL>

QPlay 服务具有三个明显特点:队列(Queue),认证(Authentication),安装(Setup)。

  1. 队列(Queue)

队列使MediaRenderer的曲目列表(或“队列”)的播放和播放控制之间没有相互影响。播放列表可以在设备播放期间进行编辑(edited)和更新(updated)(仅支持SetTracksInfo动作)。某些厂商可能会提供一个叫共享队列的队列,该共享队列仅在厂商自身的控制器中可见。但QPlay队列与该共享队列不同,QPlay的队列只能是QQ音乐的私有队列。

  1. 认证(Authentication)

认证为制造商提供了一种展现QPlay认证设备的方式。在QPlay2中,认证是强制性的功能要求。

  1. 安装(Setup)

安装为制造商提供了一种通过QQ音乐应用程序的QPlay模式设置扬声器的方式。安装是可选的功能。安装动作在设备的描述中说明,如果QQ音乐应用程序发现设备支持安装,它将尝试调用该动作。

QPlay队列

在QPlay中,队列的数据结构如图所示。

其中TracksMetaData是队列的核心数据结构,使用Json格式的UTF-8来表示。

在歌曲队列中,播放时应该从“trackURIs”中找到一个有效的歌曲曲目URI用于播放,若所以的URI都无效,则QPlay设备应该跳到下一个歌曲进行播放。
QPlay设备的服务中与队列操作相关的动作有:

  1. 基于QPlay服务的:插入曲目(InsertTracks)、删除曲目(RemoveTracks)、获取曲目(GetTracksInfo)、设置曲目(SetTracksInfo)、获取曲目总数(GetTracksCount)、获取队列的最大曲目容量(GetMaxTracks);

  2. 基于AVTransport服务的:设置音视频流URI(SetAVTransportURI)、获取当前媒体信息(GetMediaInfo)、获取歌曲时间线位置(GetPositionInfo)、(Seek)、获取传输模式(GetTransportSettings)、设置播放模式(SetPlayMode)以及相关的;

◆ “InsertTracks”动作
● 服务ID:urn:upnp-org:serviceId:QPlay
● 功能:在QPlay队列的指定位置开始插入一个或多个曲目
● 参数:(in) QueueID – 该值在SetAVTransportURI动作时设置。这个参数必须等于SetAVTransportURI动作中的QueueID。否则,该动作失败,返回错误码(718)。(in) StartingIndex - 在队列插入的起始位置(索引从1开始)。(in) TracksMetaData - 队列曲目信息在TracksMetaData中定义。(out) NumberOfSuccess - 成功插入的曲目数量。
● 错误码:718 – invalid QueueID
● 备注:这个动作是原子的。只有当所有的曲目都成功时,QPlay设备才返回零。否则,QPlay设备返回的非零值,NumberOfSuccess的值应该为零。
◆ “RemoveTracks”动作
● 服务ID:urn:upnp-org:serviceId:QPlay
● 功能:在QPlay队列的指定位置开始移除一个或多个曲目
● 参数:(in) QueueID – 该值在SetAVTransportURI动作时设置。这个参数必须等于SetAVTransportURI动作中的QueueID。否则,该动作失败,返回错误码(718)。(in) StartingIndex - 在队列移除的起始位置(索引从1开始)。 (in) NumberOfTracks - 要移除的曲目数。如果该值为-1,则从StartingIndex位置开始,到队列末尾的曲目全部移除。(out) NumberOfSuccess - 成功移除的曲目数量。
● 错误码:718 – invalid QueueID
● 备注:这个动作是原子的。只有当所有的曲目都成功时,QPlay设备才返回零。否则,QPlay设备返回的非零值,NumberOfSuccess的值应该为零。
◆ “GetTracksInfo”动作
● 服务ID:urn:upnp-org:serviceId:QPlay
● 功能:获取一个范围内的曲目信息。
● 参数:(in) QueueID – 该值在SetAVTransportURI动作时设置。这个参数必须等于SetAVTransportURI动作中的QueueID。否则,该动作失败,返回错误码(718)。(in) StartingIndex - 在队列获取的起始位置(索引从1开始)。(in) TracksMetaData - 队列曲目信息在TracksMetaData中定义。(out) NumberOfSuccess - 成功获取的曲目数量。
● 错误码:参考UPnP规范。
● 备注:这个动作是原子的。只有当所有的曲目都成功时,QPlay设备才返回零。否则,QPlay设备返回的非零值,NumberOfSuccess的值应该为零。
◆ “SetTracksInfo”动作
● 服务ID:urn:upnp-org:serviceId:QPlay
● 功能:替换一个范围内的曲目信息。
● 参数:
(in) QueueID –该值在SetAVTransportURI动作时设置。这个参数必须等于SetAVTransportURI动作中的QueueID。否则,该动作失败,返回错误码(718)。(in) StartingIndex - 在队列替换的起始位置(索引从1开始)。如果该值为-1,则整个队列被替换。(in) NextIndex – 如果NextIndex是一个有效的队列位置,则旧队列的当前播放曲目保持不变,播放完后下一个播放的曲目应该在NextIndex位置。如果NextIndex无效(NextIndex<1或者NextIndex>newPlaylist.length),则当前播放的曲目应该立即停止播放。(in) TracksMetaData - 队列曲目信息在TracksMetaData中定义。(out) NumberOfSuccess - 成功设置的曲目数量。
● 错误码:718 – invalid QueueID
● 备注:这个动作是原子的。只有当所有的曲目都成功时,QPlay设备才返回零。否则,QPlay设备返回的非零值,NumberOfSuccess的值应该为零。如果一个曲目播放失败,应该自动播放下一个曲目。
◆ “GetTracksCount”动作
● 服务ID:urn:upnp-org:serviceId:QPlay
● 功能:返回QPlay队列中曲目的数量。
● 参数:(out) NrTracks - 曲目数量。
● 错误码:参考UPnP规范。
◆ “GetMaxTracks”动作
● 服务ID:urn:upnp-org:serviceId:QPlay
● 功能:返回QPlay设备的队列最大支持曲目数量。
● 参数:(out) MaxTracks – 曲目最大数量。
● 错误码:参考UPnP规范。
◆ “SetAVTransportURI”动作
● 服务ID:urn:upnp-org:serviceId:AVTransport
● 功能:DLNA标准定义的动作,一些参数将被重用。
● 参数:(in) CurrentURI - 如果该参数用于QPlay队列,它必须是 “qplay://QueueID”的形式。否则,参考UPnP规范。(in) CurrentURIMetaData – 对于QPlay队列来说不需要该参数。可以由InsertTracks,SetTracksInfo提供。QPlay设备使用GetMediaInfo替代“CurrentURIMetaData”的功能。
● 错误码:参考UPnP规范。
● 备注:该动作必须在InsertTracks、RemoveTracks和SetTracksInfo动作之前执行,因为这三个动作都需要QueueID作为其参数。QPlay设备应该记忆上一次控制点的QueueID,若InsertTracks、RemoveTracks和SetTracksInfo动作的QueueID与之不一致,则失败,返回错误码(718)。
◆ “GetMediaInfo”动作
● 服务ID:urn:upnp-org:serviceId:AVTransport
● 功能:DLNA标准定义的动作,一些参数将被重用。
如果“CurrentURI”的前缀是“qplay://”,表示当前正在使用QPlay队列,(out) NrTracks - 当前队列的曲目总数,应该GetTrackCount的返回值相同。(out) MediaDuration – 队列所有曲目的播放时间总和。(out) CurrentURI - 返回的“CurrentURI”在SetAVTransportURI动作中被设置。“QueueID”可以用来确定当前队列是否被更改。(out) CurrentURIMetaData - 返回的“CurrentURIMetaData”在SetAVTransportURI动作中被设置。
其余参数符合UPnP规范。如果“CurrentURI”的前缀不是“qplay://”,可以把它当作正常歌曲。
● 错误码:参考UPnP规范。
◆ “GetPositionInfo”动作
● 服务ID:urn:upnp-org:serviceId:AVTransport
● 功能:DLNA标准定义的动作,一些参数将被重用。
如果GetMediaInfo动作的“CurrentURI”的前缀是“qplay://”。(out) Track - 当前播放曲目的位置(索引从1开始)。(out) TrackDuration - 当前曲目的“duration”在“TrackMetaData”中。(out) TrackMetaData - 当前曲目的“TrackMetaData”。(out) TrackURI – 当前曲目使用的URI在“TrackURIs”中。其余参数符合UPnP规范。如果GetMediaInfo动作的“CurrentURI”的前缀不是“qplay://”,你可以把它当作正常歌曲。
● 错误码:参考UPnP规范。
◆ “Seek”动作
● 服务ID:urn:upnp-org:serviceId:AVTransport
● 功能:DLNA标准定义的动作,一些参数将被重用。
● 参数:
(in) Unit – 如果当前正在使用QPlay队列,而且“Target”是个曲目位置。那么该参数必须是“TRACK_NR”。
● 错误码:参考UPnP规范。
◆ “GetTransportSettings”动作
● 服务ID:urn:upnp-org:serviceId:AVTransport
● 功能:DLNA标准定义的动作,一些参数将被重用。
● 参数:
(out) PlayMode – 只能是“NORMAL”、“REPEAT_TRACK”或“REPEAT_ALL”。
● 错误码:参考UPnP规范。
◆ “SetPlayMode”动作
● 服务ID:urn:upnp-org:serviceId:AVTransport
● 功能:DLNA标准定义的动作,一些参数将被重用。
● 参数:(in) NewPlayMode – “NORMAL”: 当前歌曲播放结束后停止播放。“REPEAT_TRACK”: 当前歌曲播放结束后,重新播放当前歌曲。“REPEAT_ALL”: 最后一首歌曲播放结束后,重新播放第一首歌曲。
● 错误码:参考UPnP规范。
最后,在AVTransport服务中。如果有任何状态变量(stateVariable)发送变化,LastChange事件应立即发送已变化的状态变量。而每次状态变量“TransportState”发生改变时,“CurrentTrackMetaData”、“CurrentTrackURI”和“AVTransportURI”这三个状态变量值应该加入到LastChange的事件通知中。

QPlay认证

QPlay2为扬声器制造商的扬声器提供QPlay认证,保证用户的听觉体验。

这种机制有利于各扬声器对用户行为的统一解析,以及提供功能拓展。

扬声器被识别为QPlay认证设备,该设备将会在QQ音乐应用程序中显示为特定的UI定制图标。

QPlay认证是基于UPnP的服务拓展。

  1. 制造商ID(Manufacture ID,MID)、设备类型ID(Device Type ID,DID)和预共享密钥(pre-shared key,PSK)由QQ音乐(腾讯公司)分配。
  2. QQ音乐应用程序发送的QPlay发现信息会拓展包含一个随机字符串(Seed)。
  3. 扬声器返回的结果有:制造商ID(MID)、设备类型ID(DID)、随机字符串(Seed)与预共享密钥(PSK)相结合的哈希值(计算方式为:Code = MD5[Seed + PSK])。
  4. QQ音乐应用程序将这些信息转发到QQ音乐服务器。
  5. QQ音乐服务器验证这些信息后,将响应信息返回给QQ音乐应用程序。
    QQ音乐应用程序收到QQ音乐服务器的响应后,将决定是否显示为QPlay设备的图标。
    QPlay认证功能由QPlay服务中的QPlay认证(QPlayAuth)动作实现。
◆ “QPlayAuth”动作
● 服务ID:urn:upnp-org:serviceId:QPlay
● 功能:提供Seed,获取认证需要的MID、DID和Code信息。
● 参数:(in) Seed – 随机字符串,由QQ音乐应用程序生成,用于防止重复攻击。(out) Code - Seed与预共享密钥(PSK)的哈希值,PSK由腾讯公司提供,计算方式为:Code = MD5[ Seed + PSK ]。(out) MID - 制造商ID,一般为设备制造商名称。(out) DID - 设备类型ID,一般为扬声器设备名称。
● 错误码:参考UPnP规范。
● 备注:设备制造商向腾讯公司申请QPlay认证后,由设备制造商提供MID和DID,腾讯公司做备份并生成PSK提供给设备制造商。

QPlay设置

QPlay2可以使QPlay服务通过扬声器设备的SetNetwork动作进行WiFi网络设置。
当扬声器设备进入WiFi接入点模式时。QQ音乐应用程序可以通过调用扬声器设备的SetNetwork动作,使扬声器设备获得到SSID和密码等WiFi信息。然后扬声器设备可以用来连接到特定的WiFi网络。

◆ “SetNetwork”动作
● 服务ID:urn:upnp-org:serviceId:QPlay
● 功能:设备连接到特定的WiFi网络。
● 参数:(in) SSID – WiFi网络的名称。(in) Key - WiFi网络的密码。(in) AuthAlgo - 设备信息。(in) CipherAlgo - WiFi加密算法。
● 错误码:参考UPnP规范。
● 备注:该动作是可选的。

DLNA和QPlay的关系

DLNA推出较早,DLNA在数字家庭方面给消费者提供:支持在家庭范围内便捷访问、分享、存储音频视频等流媒体;可以提供方便快捷的浏览图片、管理图片、打印图片的服务;支持娱乐内容的提取并在户外环境播放;以及记录各用户的访问,且支持访问过程的重放等功能。这些优点使得其在数字家庭中占有重要的地位,市面上不少数字家庭设备都支持DLNA功能。

但由于DLNA没有强制认证要求,各大制造商实现功能时可能导致兼容性差。而且DLNA并未深入定义有关多媒体家庭的功能,实现的多媒体功能较为简单。也就导致在多媒体播放体验上较为单一。

QPlay专注于音频分享部分,定义了很多提高音乐分享体验的功能。和DLNA一样选择UPnP架构为基础,使用了UPnP的发现和控制机制。在音频的控制和传输的设计上重用了DLNA的动作,使得QPlay设备拥有兼容DLNA功能的可能。

因此,在QPlay设备设计时兼容DLNA功能,设备就可以支持使用DLNA播放器进行播放控制。

QPlay 协议框架相关推荐

  1. 蚂蚁集团网络通信框架 SOFABolt 功能介绍及协议框架解析 | 开源

    简介:开源网络通信框架 SOFABolt 首次线上直播文字回顾. ,有趣实用的分布式架构频道. 回顾视频以及 PPT 查看地址见文末.欢迎加入直播互动钉钉群 : 30315793,不错过每场直播. 大 ...

  2. android开源组件化框架,轻量级Android组件化协议框架 – Android-Route...

    Android-Router 高性能,灵活,简单易用的轻量级Android组件化协议框架,用来解决复杂工程的互相依赖,解耦出的单个模块有利于独立开发和维护. 目标 工程解耦 模块独立开发独立维护 让生 ...

  3. 蚂蚁金服通信框架SOFABolt解析 | 协议框架解析

    2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动. SOFA Scalable Open Financial Architecture 是蚂蚁金服自主研发 ...

  4. 使用springboot,http实现简单的RPC协议框架

    使用springboot,http实现简单的RPC协议框架 一. RPC协议的作用 二.RPC与HTTP的区别 三.实现一个简单的RPC客户端和服务端 1. 新建Springboot项目,访问本服务中 ...

  5. java基础巩固-宇宙第一AiYWM:为了维持生计,手写RPC~Version07(RPC原理、序列化框架们、网络协议框架们 、RPC 能帮助我们做什么呢、RPC异常排查:ctrl+F搜超时)整起

    上次Version06说到了咱们手写迷你版RPC的大体流程, 对咱们的迷你版RPC的大体流程再做几点补充: 为什么要封装网络协议,别人说封装好咱们就要封装?Java有这个特性那咱就要用?好像是这样.看 ...

  6. 协议 框架 解决方案

    Samurai-Native框架 React Native BeeFramework(XML+CSS) BeeFramework 是新一代的应用开发框架,它能使应用开发变得更简单更容易,它是由 Gav ...

  7. 语言 ,规范,协议,框架

    什么是语言? c++  java   都是 高级语言,先编译后运行. js php 脚本语言,边解释边执行. 相同点在哪里? 无论如何 ,都是 有一个解释器或者运行时解析器在工作的. 他们会识别特定的 ...

  8. xmpp协议框架包介绍:org.xmpp.packet.Packet+JID+PacketInterceptor+Session

    [1]org.xmpp.packet.Packet(数据包): 1)intro: 一个 XMPP数据包(也被称为 数据节).每个数据包由 dom4j 元素来支持.有一系列易于操作元素(Element) ...

  9. MQTT协议框架MOP代码结构解析

    一.MoP是啥 MoP 即MQTT on Pulsar ,是一个在Pulsar基础上实现的MQTT协议,git地址:https://github.com/streamnative/mop 通过MoP可 ...

最新文章

  1. Scrapy框架的概念、作用和工作流程
  2. html文字垂直居中_文字垂直居中
  3. Linux里设置环境变量的方法(转)
  4. java map可以直接用增强for吗
  5. Git错误non-fast-forward后的冲突解决
  6. 常用模块-----configparser subprocess
  7. 论文阅读 - CRNN
  8. 机器视觉 光学工程专业_瑞士Idonus MEMS制造设备 创新技术 机器视觉测量(远心光学)...
  9. 老板催你交圣诞海报设计?PSD源文件素材,直接编辑
  10. bi导入数据失败 power_主机数据库平台迁移 6 个典型问题
  11. 施工部署主要不包括_施工部署是什么?准备工作是什么?
  12. Android IPC机制(4)-Binder连接池
  13. 福禄克OptiFiber® Pro OTDR光线测试仪
  14. 大数据技术原理与应用答案 林子雨 第二版
  15. hd4600黑苹果html5死机,黑苹果核显hd4400、hd4600显卡Clover引导驱动方法
  16. 医院排队系统排队叫号系统
  17. Autodesk Eagle入门之-线宽操作
  18. 为什么要远离色情信息(转载)
  19. 【新知实验室】体验腾讯云音视频
  20. android内存dump分析,闭眼能敲,Android内存分析command

热门文章

  1. 如何将自己的文件进行加密?一个小程序的教你搞定
  2. 合并多个HEX文件的方法
  3. idea使用mybatis写增删改查
  4. 雷鸟Thunderbird客户端加密方法
  5. SwiftyJSON库的使用和思考
  6. 如何从100万个数中找出最大的前100个数
  7. Shell脚本函数应用
  8. TP4056(1A 线性锂离子电池充电器)
  9. 沪指年线再失守,周期股集体重挫。美股高开,再创历史新高
  10. 我泪流满面,比尔盖茨也老了