天天看點

QPlay 協定架構QPlay 協定架構

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功能:

其中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中,隊列的資料結構如圖所示。

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的服務拓展。

QPlay 協定架構QPlay 協定架構
  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播放器進行播放控制。

繼續閱讀